您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ ANIM_nla_mapping_get函数代码示例

51自学网 2021-06-01 19:35:08
  C++
这篇教程C++ ANIM_nla_mapping_get函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中ANIM_nla_mapping_get函数的典型用法代码示例。如果您正苦于以下问题:C++ ANIM_nla_mapping_get函数的具体用法?C++ ANIM_nla_mapping_get怎么用?C++ ANIM_nla_mapping_get使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了ANIM_nla_mapping_get函数的19个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: mirror_action_keys

/* this function is responsible for mirroring keyframes */static void mirror_action_keys(bAnimContext *ac, short mode) {	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		BeztEditData bed;	BeztEditFunc edit_cb;		/* get beztriple editing callbacks */	edit_cb= ANIM_editkeyframes_mirror(mode);		memset(&bed, 0, sizeof(BeztEditData)); 	bed.scene= ac->scene;		/* for 'first selected marker' mode, need to find first selected marker first! */	// XXX should this be made into a helper func in the API?	if (mode == ACTKEYS_MIRROR_MARKER) {		TimeMarker *marker= NULL;				/* find first selected marker */		if (ac->markers) {			for (marker= ac->markers->first; marker; marker=marker->next) {				if (marker->flag & SELECT) {					break;				}			}		}				/* store marker's time (if available) */		if (marker)			bed.f1= (float)marker->frame;		else			return;	}		/* filter data */	if (ac->datatype == ANIMCONT_GPENCIL)		filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT);	else		filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* mirror keyframes */	for (ale= anim_data.first; ale; ale= ale->next) {		AnimData *adt= ANIM_nla_mapping_get(ac, ale);				if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 			ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		//else if (ale->type == ACTTYPE_GPLAYER)		//	snap_gplayer_frames(ale->data, mode);		else 			ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);	}	BLI_freelistN(&anim_data);}
开发者ID:jinjoh,项目名称:NOOR,代码行数:60,


示例2: mirror_action_keys

/* this function is responsible for mirroring keyframes */static void mirror_action_keys(bAnimContext *ac, short mode) {	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditData ked = {{NULL}};	KeyframeEditFunc edit_cb;		/* get beztriple editing callbacks */	edit_cb = ANIM_editkeyframes_mirror(mode);	ked.scene = ac->scene;		/* for 'first selected marker' mode, need to find first selected marker first! */	/* XXX should this be made into a helper func in the API? */	if (mode == ACTKEYS_MIRROR_MARKER) {		TimeMarker *marker = ED_markers_get_first_selected(ac->markers);				if (marker)			ked.f1 = (float)marker->frame;		else			return;	}		/* filter data */	if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);	else		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT /*| ANIMFILTER_CURVESONLY*/ | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* mirror keyframes */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		//else if (ale->type == ACTTYPE_GPLAYER)		//	snap_gplayer_frames(ale->data, mode);		else 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);		ale->update |= ANIM_UPDATE_DEFAULT;	}	ANIM_animdata_update(ac, &anim_data);	ANIM_animdata_freelist(&anim_data);}
开发者ID:pawkoz,项目名称:dyplom,代码行数:53,


示例3: snap_action_keys

/* this function is responsible for snapping keyframes to frame-times */static void snap_action_keys(bAnimContext *ac, short mode) {	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditData ked = {{NULL}};	KeyframeEditFunc edit_cb;		/* filter data */	if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT);	else		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT /*| ANIMFILTER_CURVESONLY*/ | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* get beztriple editing callbacks */	edit_cb = ANIM_editkeyframes_snap(mode);	ked.scene = ac->scene;	if (mode == ACTKEYS_SNAP_NEAREST_MARKER) {		ked.list.first = (ac->markers) ? ac->markers->first : NULL;		ked.list.last = (ac->markers) ? ac->markers->last : NULL;	}		/* snap keyframes */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				if (ale->type == ANIMTYPE_GPLAYER) {			ED_gplayer_snap_frames(ale->data, ac->scene, mode);		}		else if (ale->type == ANIMTYPE_MASKLAYER) {			ED_masklayer_snap_frames(ale->data, ac->scene, mode);		}		else if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		else {			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);		}		ale->update |= ANIM_UPDATE_DEFAULT;	}	ANIM_animdata_update(ac, &anim_data);	ANIM_animdata_freelist(&anim_data);}
开发者ID:pawkoz,项目名称:dyplom,代码行数:51,


示例4: get_keyframe_extents

/* Get the min/max keyframes*/static void get_keyframe_extents (bAnimContext *ac, float *min, float *max, const short onlySel){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		/* get data to filter, from Action or Dopesheet */	filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* set large values to try to override */	*min= 999999999.0f;	*max= -999999999.0f;		/* check if any channels to set range with */	if (anim_data.first) {		/* go through channels, finding max extents */		for (ale= anim_data.first; ale; ale= ale->next) {			AnimData *adt= ANIM_nla_mapping_get(ac, ale);			FCurve *fcu= (FCurve *)ale->key_data;			float tmin, tmax;						/* get range and apply necessary scaling before processing */			calc_fcurve_range(fcu, &tmin, &tmax, onlySel);						if (adt) {				tmin= BKE_nla_tweakedit_remap(adt, tmin, NLATIME_CONVERT_MAP);				tmax= BKE_nla_tweakedit_remap(adt, tmax, NLATIME_CONVERT_MAP);			}						/* try to set cur using these values, if they're more extreme than previously set values */			*min= MIN2(*min, tmin);			*max= MAX2(*max, tmax);		}				/* free memory */		BLI_freelistN(&anim_data);	}	else {		/* set default range */		if (ac->scene) {			*min= (float)ac->scene->r.sfra;			*max= (float)ac->scene->r.efra;		}		else {			*min= -5;			*max= 100;		}	}}
开发者ID:OldBrunet,项目名称:BGERTPS,代码行数:51,


示例5: insert_action_keys

/* this function is responsible for snapping keyframes to frame-times */static void insert_action_keys(bAnimContext *ac, short mode) {	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		ReportList *reports = ac->reports;	Scene *scene = ac->scene;	short flag = 0;		/* filter data */	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT /*| ANIMFILTER_CURVESONLY*/ | ANIMFILTER_NODUPLIS);	if (mode == 2) filter |= ANIMFILTER_SEL;	else if (mode == 3) filter |= ANIMFILTER_ACTGROUPED;		ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* init keyframing flag */	flag = ANIM_get_keyframing_flags(scene, 1);		/* insert keyframes */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);		FCurve *fcu = (FCurve *)ale->key_data;		float cfra;				/* adjust current frame for NLA-scaling */		if (adt)			cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);		else 			cfra = (float)CFRA;					/* read value from property the F-Curve represents, or from the curve only?		 * - ale->id != NULL:    Typically, this means that we have enough info to try resolving the path		 * - ale->owner != NULL: If this is set, then the path may not be resolvable from the ID alone,		 *                       so it's easier for now to just read the F-Curve directly.		 *                       (TODO: add the full-blown PointerRNA relative parsing case here...)		 */		if (ale->id && !ale->owner)			insert_keyframe(reports, ale->id, NULL, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, flag);		else			insert_vert_fcurve(fcu, cfra, fcu->curval, 0);		ale->update |= ANIM_UPDATE_DEFAULT;	}	ANIM_animdata_update(ac, &anim_data);	ANIM_animdata_freelist(&anim_data);}
开发者ID:pawkoz,项目名称:dyplom,代码行数:50,


示例6: markers_selectkeys_between

/* TODO, this is almost an _exact_ duplicate of a function of the same name in graph_select.c * should de-duplicate - campbell */static void markers_selectkeys_between(bAnimContext *ac){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditFunc ok_cb, select_cb;	KeyframeEditData ked = {{NULL}};	float min, max;		/* get extreme markers */	ED_markers_get_minmax(ac->markers, 1, &min, &max);	min -= 0.5f;	max += 0.5f;		/* get editing funcs + data */	ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);	select_cb = ANIM_editkeyframes_select(SELECT_ADD);	ked.f1 = min;	ked.f2 = max;		/* filter data */	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE /*| ANIMFILTER_CURVESONLY */ | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* select keys in-between */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		else if (ale->type == ANIMTYPE_GPLAYER) {			ED_gplayer_frames_select_border(ale->data, min, max, SELECT_ADD);		}		else if (ale->type == ANIMTYPE_MASKLAYER) {			ED_masklayer_frames_select_border(ale->data, min, max, SELECT_ADD);		}		else {			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);		}	}		/* Cleanup */	ANIM_animdata_freelist(&anim_data);}
开发者ID:mgschwan,项目名称:blensor,代码行数:51,


示例7: actkeys_mselect_column

/* Option 3) Selects all visible keyframes in the same frame as the mouse click */static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float selx){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditFunc select_cb, ok_cb;	KeyframeEditData ked = {{NULL}};		/* set up BezTriple edit callbacks */	select_cb = ANIM_editkeyframes_select(select_mode);	ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAME);		/* loop through all of the keys and select additional keyframes	 * based on the keys found to be selected above	 */	if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE /*| ANIMFILTER_CURVESONLY */ | ANIMFILTER_NODUPLIS);	else		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				/* set frame for validation callback to refer to */		if (adt)			ked.f1 = BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP);		else			ked.f1 = selx;				/* select elements with frame number matching cfra */		if (ale->type == ANIMTYPE_GPLAYER)			ED_gpencil_select_frame(ale->key_data, selx, select_mode);		else if (ale->type == ANIMTYPE_MASKLAYER)			ED_mask_select_frame(ale->key_data, selx, select_mode);		else			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);	}		/* free elements */	BLI_freelistN(&ked.list);	ANIM_animdata_freelist(&anim_data);}
开发者ID:mgschwan,项目名称:blensor,代码行数:45,


示例8: actkeys_framejump_exec

/* snap current-frame indicator to 'average time' of selected keyframe */static int actkeys_framejump_exec(bContext *C, wmOperator *op){	bAnimContext ac;	ListBase anim_data= {NULL, NULL};	bAnimListElem *ale;	int filter;	BeztEditData bed;		/* get editor data */	if (ANIM_animdata_get_context(C, &ac) == 0)		return OPERATOR_CANCELLED;		/* init edit data */	memset(&bed, 0, sizeof(BeztEditData));		/* loop over action data, averaging values */	filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);	ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);		for (ale= anim_data.first; ale; ale= ale->next) {		AnimData *adt= ANIM_nla_mapping_get(&ac, ale);				if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 			ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		else			ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);	}		BLI_freelistN(&anim_data);		/* set the new current frame value, based on the average time */	if (bed.i1) {		Scene *scene= ac.scene;		CFRA= (int)floor((bed.f1 / bed.i1) + 0.5f);	}		/* set notifier that things have changed */	WM_event_add_notifier(C, NC_SCENE|ND_FRAME, ac.scene);		return OPERATOR_FINISHED;}
开发者ID:jinjoh,项目名称:NOOR,代码行数:45,


示例9: snap_action_keys

/* this function is responsible for snapping keyframes to frame-times */static void snap_action_keys(bAnimContext *ac, short mode) {	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		BeztEditData bed;	BeztEditFunc edit_cb;		/* filter data */	if (ac->datatype == ANIMCONT_GPENCIL)		filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT);	else		filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* get beztriple editing callbacks */	edit_cb= ANIM_editkeyframes_snap(mode);		memset(&bed, 0, sizeof(BeztEditData)); 	bed.scene= ac->scene;	if (mode == ACTKEYS_SNAP_NEAREST_MARKER) {		bed.list.first= (ac->markers) ? ac->markers->first : NULL;		bed.list.last= (ac->markers) ? ac->markers->last : NULL;	}		/* snap keyframes */	for (ale= anim_data.first; ale; ale= ale->next) {		AnimData *adt= ANIM_nla_mapping_get(ac, ale);				if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 			ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		//else if (ale->type == ACTTYPE_GPLAYER)		//	snap_gplayer_frames(ale->data, mode);		else 			ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);	}	BLI_freelistN(&anim_data);}
开发者ID:jinjoh,项目名称:NOOR,代码行数:43,


示例10: actkeys_framejump_exec

/* snap current-frame indicator to 'average time' of selected keyframe */static int actkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op)){	bAnimContext ac;	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;	KeyframeEditData ked = {{NULL}};		/* get editor data */	if (ANIM_animdata_get_context(C, &ac) == 0)		return OPERATOR_CANCELLED;		/* init edit data */	/* loop over action data, averaging values */	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE /*| ANIMFILTER_CURVESONLY */ | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);		for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(&ac, ale);		if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		else			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL);	}		ANIM_animdata_freelist(&anim_data);		/* set the new current frame value, based on the average time */	if (ked.i1) {		Scene *scene = ac.scene;		CFRA = iroundf(ked.f1 / ked.i1);		SUBFRA = 0.f;	}		/* set notifier that things have changed */	WM_event_add_notifier(C, NC_SCENE | ND_FRAME, ac.scene);		return OPERATOR_FINISHED;}
开发者ID:pawkoz,项目名称:dyplom,代码行数:43,


示例11: insert_action_keys

/* this function is responsible for snapping keyframes to frame-times */static void insert_action_keys(bAnimContext *ac, short mode) {	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		Scene *scene= ac->scene;	float cfra= (float)CFRA;	short flag = 0;		/* filter data */	filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);	if (mode == 2) 			filter |= ANIMFILTER_SEL;	else if (mode == 3) 	filter |= ANIMFILTER_ACTGROUPED;		ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* init keyframing flag */	if (IS_AUTOKEY_FLAG(AUTOMATKEY)) flag |= INSERTKEY_MATRIX;	if (IS_AUTOKEY_FLAG(INSERTNEEDED)) flag |= INSERTKEY_NEEDED;	if (IS_AUTOKEY_MODE(scene, EDITKEYS)) flag |= INSERTKEY_REPLACE;		/* insert keyframes */	for (ale= anim_data.first; ale; ale= ale->next) {		AnimData *adt= ANIM_nla_mapping_get(ac, ale);		FCurve *fcu= (FCurve *)ale->key_data;				/* adjust current frame for NLA-scaling */		if (adt)			cfra= BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);		else 			cfra= (float)CFRA;					/* if there's an id */		if (ale->id)			insert_keyframe(ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);		else			insert_vert_fcurve(fcu, cfra, fcu->curval, 0);	}		BLI_freelistN(&anim_data);}
开发者ID:jinjoh,项目名称:NOOR,代码行数:43,


示例12: region_select_action_keys

static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view, short mode, short selectmode, void *data){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditData ked;	KeyframeEditFunc ok_cb, select_cb;	View2D *v2d = &ac->ar->v2d;	rctf rectf, scaled_rectf;	float ymin = 0, ymax = (float)(-ACHANNEL_HEIGHT_HALF(ac));		/* convert mouse coordinates to frame ranges and channel coordinates corrected for view pan/zoom */	UI_view2d_region_to_view_rctf(v2d, rectf_view, &rectf);		/* filter data */	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* get beztriple editing/validation funcs  */	select_cb = ANIM_editkeyframes_select(selectmode);	ok_cb = ANIM_editkeyframes_ok(mode);		/* init editing data */	memset(&ked, 0, sizeof(KeyframeEditData));	if (mode == BEZT_OK_CHANNEL_LASSO) {		KeyframeEdit_LassoData *data_lasso = data;		data_lasso->rectf_scaled = &scaled_rectf;		ked.data = data_lasso;	}	else if (mode == BEZT_OK_CHANNEL_CIRCLE) {		KeyframeEdit_CircleData *data_circle = data;		data_circle->rectf_scaled = &scaled_rectf;		ked.data = data;	}	else {		ked.data = &scaled_rectf;	}		/* loop over data, doing region select */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				/* get new vertical minimum extent of channel */		ymin = ymax - ACHANNEL_STEP(ac);				/* compute midpoint of channel (used for testing if the key is in the region or not) */		ked.channel_y = ymin + ACHANNEL_HEIGHT_HALF(ac);				/* if channel is mapped in NLA, apply correction		 * - Apply to the bounds being checked, not all the keyframe points,		 *   to avoid having scaling everything		 * - Save result to the scaled_rect, which is all that these operators		 *   will read from		 */		if (adt) {			ked.iterflags &= ~(KED_F1_NLA_UNMAP | KED_F2_NLA_UNMAP);			ked.f1 = BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP);			ked.f2 = BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP);		}		else {			ked.iterflags |= (KED_F1_NLA_UNMAP | KED_F2_NLA_UNMAP); /* for summary tracks */			ked.f1 = rectf.xmin;			ked.f2 = rectf.xmax;		}				/* Update values for scaled_rectf - which is used to compute the mapping in the callbacks		 * NOTE: Since summary tracks need late-binding remapping, the callbacks may overwrite these 		 *       with the properly remapped ked.f1/f2 values, when needed		 */		scaled_rectf.xmin = ked.f1;		scaled_rectf.xmax = ked.f2;		scaled_rectf.ymin = ymin;		scaled_rectf.ymax = ymax;				/* perform vertical suitability check (if applicable) */		if ((mode == ACTKEYS_BORDERSEL_FRAMERANGE) ||		    !((ymax < rectf.ymin) || (ymin > rectf.ymax)))		{			/* loop over data selecting */			switch (ale->type) {#if 0 /* XXX: Keyframes are not currently shown here */				case ANIMTYPE_GPDATABLOCK:				{					bGPdata *gpd = ale->data;					bGPDlayer *gpl;					for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {						ED_gplayer_frames_select_region(&ked, ale->data, mode, selectmode);					}					break;				}#endif				case ANIMTYPE_GPLAYER:				{					ED_gplayer_frames_select_region(&ked, ale->data, mode, selectmode);					break;				}				case ANIMTYPE_MASKDATABLOCK:				{					Mask *mask = ale->data;//.........这里部分代码省略.........
开发者ID:mgschwan,项目名称:blensor,代码行数:101,


示例13: summary_keyframes_loop

/* This function is used to loop over the keyframe data in a DopeSheet summary */static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter, ret_code = 0;		/* sanity check */	if (ac == NULL)		return 0;		/* get F-Curves to take keyframes from */	filter = ANIMFILTER_DATA_VISIBLE;	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* loop through each F-Curve, working on the keyframes until the first curve aborts */	for (ale = anim_data.first; ale; ale = ale->next) {		switch (ale->datatype) {			case ALE_MASKLAY:			case ALE_GPFRAME:				break;							case ALE_FCURVE:			default:			{				if (ked && ked->iterflags) {					/* make backups of the current values, so that a localised fix					 * (e.g. NLA time remapping) can be applied to these values					 */					float f1 = ked->f1;					float f2 = ked->f2;										if (ked->iterflags & (KED_F1_NLA_UNMAP | KED_F2_NLA_UNMAP)) {						AnimData *adt = ANIM_nla_mapping_get(ac, ale);												if (ked->iterflags & KED_F1_NLA_UNMAP)							ked->f1 = BKE_nla_tweakedit_remap(adt, f1, NLATIME_CONVERT_UNMAP);						if (ked->iterflags & KED_F2_NLA_UNMAP)							ked->f2 = BKE_nla_tweakedit_remap(adt, f2, NLATIME_CONVERT_UNMAP);					}										/* now operate on the channel as per normal */					ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);										/* reset */					ked->f1 = f1;					ked->f2 = f2;				}				else {					/* no special handling required... */					ret_code = ANIM_fcurve_keyframes_loop(ked, ale->data, key_ok, key_cb, fcu_cb);				}				break;			}		}				if (ret_code)			break;	}		ANIM_animdata_freelist(&anim_data);		return ret_code;}
开发者ID:LucaRood,项目名称:Blender,代码行数:64,


示例14: mouse_action_keys

static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_mode, bool column, bool same_channel){	ListBase anim_data = {NULL, NULL};	DLRBT_Tree anim_keys;	bAnimListElem *ale;	int filter;		View2D *v2d = &ac->ar->v2d;	bDopeSheet *ads = NULL;	int channel_index;	bool found = false;	float frame = 0.0f; /* frame of keyframe under mouse - NLA corrections not applied/included */	float selx = 0.0f;  /* frame of keyframe under mouse */	float key_hsize;	float x, y;	rctf rectf;		/* get dopesheet info */	if (ac->datatype == ANIMCONT_DOPESHEET)		ads = ac->data;		/* use View2D to determine the index of the channel (i.e a row in the list) where keyframe was */	UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);	UI_view2d_listview_view_to_cell(v2d, 0, ACHANNEL_STEP(ac), 0, (float)ACHANNEL_HEIGHT_HALF(ac), x, y, NULL, &channel_index);		/* x-range to check is +/- 7px for standard keyframe under standard dpi/y-scale (in screen/region-space),	 * on either side of mouse click (size of keyframe icon)	 */	key_hsize = ACHANNEL_HEIGHT(ac) * 0.8f;    /* standard channel height (to allow for some slop) */	key_hsize = roundf(key_hsize / 2.0f);      /* half-size (for either side), but rounded up to nearest int (for easier targetting) */		UI_view2d_region_to_view(v2d, mval[0] - (int)key_hsize, mval[1], &rectf.xmin, &rectf.ymin);	UI_view2d_region_to_view(v2d, mval[0] + (int)key_hsize, mval[1], &rectf.xmax, &rectf.ymax);		/* filter data */	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* try to get channel */	ale = BLI_findlink(&anim_data, channel_index);	if (ale == NULL) {		/* channel not found */		printf("Error: animation channel (index = %d) not found in mouse_action_keys()/n", channel_index);		ANIM_animdata_freelist(&anim_data);		return;	}	else {		/* found match - must return here... */		AnimData *adt = ANIM_nla_mapping_get(ac, ale);		ActKeyColumn *ak, *akn = NULL;				/* make list of keyframes */		BLI_dlrbTree_init(&anim_keys);				if (ale->key_data) {			switch (ale->datatype) {				case ALE_SCE:				{					Scene *scene = (Scene *)ale->key_data;					scene_to_keylist(ads, scene, &anim_keys, NULL);					break;				}				case ALE_OB:				{					Object *ob = (Object *)ale->key_data;					ob_to_keylist(ads, ob, &anim_keys, NULL);					break;				}				case ALE_ACT:				{					bAction *act = (bAction *)ale->key_data;					action_to_keylist(adt, act, &anim_keys, NULL);					break;				}				case ALE_FCURVE:				{					FCurve *fcu = (FCurve *)ale->key_data;					fcurve_to_keylist(adt, fcu, &anim_keys, NULL);					break;				}			}		}		else if (ale->type == ANIMTYPE_SUMMARY) {			/* dopesheet summary covers everything */			summary_to_keylist(ac, &anim_keys, NULL);		}		else if (ale->type == ANIMTYPE_GROUP) {			// TODO: why don't we just give groups key_data too?			bActionGroup *agrp = (bActionGroup *)ale->data;			agroup_to_keylist(adt, agrp, &anim_keys, NULL);		}		else if (ale->type == ANIMTYPE_GPLAYER) {			// TODO: why don't we just give gplayers key_data too?			bGPDlayer *gpl = (bGPDlayer *)ale->data;			gpl_to_keylist(ads, gpl, &anim_keys);		}		else if (ale->type == ANIMTYPE_MASKLAYER) {			// TODO: why don't we just give masklayers key_data too?			MaskLayer *masklay = (MaskLayer *)ale->data;			mask_to_keylist(ads, masklay, &anim_keys);//.........这里部分代码省略.........
开发者ID:mgschwan,项目名称:blensor,代码行数:101,


示例15: borderselect_action

static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, short selectmode){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditData ked;	KeyframeEditFunc ok_cb, select_cb;	View2D *v2d = &ac->ar->v2d;	rctf rectf;	float ymin = 0, ymax = (float)(-ACHANNEL_HEIGHT_HALF(ac));		/* convert mouse coordinates to frame ranges and channel coordinates corrected for view pan/zoom */	UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin + 2, &rectf.xmin, &rectf.ymin);	UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax - 2, &rectf.xmax, &rectf.ymax);		/* filter data */	filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* get beztriple editing/validation funcs  */	select_cb = ANIM_editkeyframes_select(selectmode);		if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS))		ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);	else		ok_cb = NULL;			/* init editing data */	memset(&ked, 0, sizeof(KeyframeEditData));		/* loop over data, doing border select */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				/* get new vertical minimum extent of channel */		ymin = ymax - ACHANNEL_STEP(ac);				/* set horizontal range (if applicable) */		if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS)) {			/* if channel is mapped in NLA, apply correction */			if (adt) {				ked.iterflags &= ~(KED_F1_NLA_UNMAP | KED_F2_NLA_UNMAP);				ked.f1 = BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP);				ked.f2 = BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP);			}			else {				ked.iterflags |= (KED_F1_NLA_UNMAP | KED_F2_NLA_UNMAP); /* for summary tracks */				ked.f1 = rectf.xmin;				ked.f2 = rectf.xmax;			}		}				/* perform vertical suitability check (if applicable) */		if ((mode == ACTKEYS_BORDERSEL_FRAMERANGE) ||		    !((ymax < rectf.ymin) || (ymin > rectf.ymax)))		{			/* loop over data selecting */			switch (ale->type) {#if 0 /* XXX: Keyframes are not currently shown here */				case ANIMTYPE_GPDATABLOCK:				{					bGPdata *gpd = ale->data;					bGPDlayer *gpl;					for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {						ED_gplayer_frames_select_border(gpl, rectf.xmin, rectf.xmax, selectmode);					}					break;				}#endif				case ANIMTYPE_GPLAYER:					ED_gplayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);					break;				case ANIMTYPE_MASKDATABLOCK:				{					Mask *mask = ale->data;					MaskLayer *masklay;					for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {						ED_masklayer_frames_select_border(masklay, rectf.xmin, rectf.xmax, selectmode);					}					break;				}				case ANIMTYPE_MASKLAYER:					ED_masklayer_frames_select_border(ale->data, rectf.xmin, rectf.xmax, selectmode);					break;				default:					ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL);					break;			}		}				/* set minimum extent to be the maximum of the next channel */		ymax = ymin;	}		/* cleanup */	ANIM_animdata_freelist(&anim_data);}
开发者ID:mgschwan,项目名称:blensor,代码行数:98,


示例16: borderselect_action

static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short selectmode){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditData ked;	KeyframeEditFunc ok_cb, select_cb;	View2D *v2d= &ac->ar->v2d;	rctf rectf;	float ymin=0, ymax=(float)(-ACHANNEL_HEIGHT_HALF);		/* convert mouse coordinates to frame ranges and channel coordinates corrected for view pan/zoom */	UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin+2, &rectf.xmin, &rectf.ymin);	UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax-2, &rectf.xmax, &rectf.ymax);		/* filter data */	filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* get beztriple editing/validation funcs  */	select_cb= ANIM_editkeyframes_select(selectmode);		if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS))		ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);	else		ok_cb= NULL;			/* init editing data */	memset(&ked, 0, sizeof(KeyframeEditData));		/* loop over data, doing border select */	for (ale= anim_data.first; ale; ale= ale->next) {		AnimData *adt= ANIM_nla_mapping_get(ac, ale);				/* get new vertical minimum extent of channel */		ymin= ymax - ACHANNEL_STEP;				/* set horizontal range (if applicable) */		if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS)) {			/* if channel is mapped in NLA, apply correction */			if (adt) {				ked.f1= BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP);				ked.f2= BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP);			}			else {				ked.f1= rectf.xmin;				ked.f2= rectf.xmax;			}		}				/* perform vertical suitability check (if applicable) */		if ( (mode == ACTKEYS_BORDERSEL_FRAMERANGE) || 			!((ymax < rectf.ymin) || (ymin > rectf.ymax)) )		{			/* loop over data selecting */			if (ale->type == ANIMTYPE_GPLAYER)				borderselect_gplayer_frames(ale->data, rectf.xmin, rectf.xmax, selectmode);			else				ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL);		}				/* set minimum extent to be the maximum of the next channel */		ymax=ymin;	}		/* cleanup */	BLI_freelistN(&anim_data);}
开发者ID:mik0001,项目名称:Blender,代码行数:69,


示例17: actkeys_select_leftright

static void actkeys_select_leftright(bAnimContext *ac, short leftright, short select_mode){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditFunc ok_cb, select_cb;	KeyframeEditData ked = {{NULL}};	Scene *scene = ac->scene;		/* if select mode is replace, deselect all keyframes (and channels) first */	if (select_mode == SELECT_REPLACE) {		select_mode = SELECT_ADD;				/* - deselect all other keyframes, so that just the newly selected remain		 * - channels aren't deselected, since we don't re-select any as a consequence		 */		deselect_action_keys(ac, 0, SELECT_SUBTRACT);	}		/* set callbacks and editing data */	ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);	select_cb = ANIM_editkeyframes_select(select_mode);		if (leftright == ACTKEYS_LRSEL_LEFT) {		ked.f1 = MINAFRAMEF;		ked.f2 = (float)(CFRA + 0.1f);	}	else {		ked.f1 = (float)(CFRA - 0.1f);		ked.f2 = MAXFRAMEF;	}		/* filter data */	if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_NODUPLIS);	else		filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE /*| ANIMFILTER_CURVESONLY*/ | ANIMFILTER_NODUPLIS);	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);			/* select keys */	for (ale = anim_data.first; ale; ale = ale->next) {		AnimData *adt = ANIM_nla_mapping_get(ac, ale);				if (adt) {			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);			ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);		}		else if (ale->type == ANIMTYPE_GPLAYER)			ED_gplayer_frames_select_border(ale->data, ked.f1, ked.f2, select_mode);		else if (ale->type == ANIMTYPE_MASKLAYER)			ED_masklayer_frames_select_border(ale->data, ked.f1, ked.f2, select_mode);		else			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);	}		/* Sync marker support */	if (select_mode == SELECT_ADD) {		SpaceAction *saction = (SpaceAction *)ac->sl;				if ((saction) && (saction->flag & SACTION_MARKERS_MOVE)) {			ListBase *markers = ED_animcontext_get_markers(ac);			TimeMarker *marker;						for (marker = markers->first; marker; marker = marker->next) {				if (((leftright == ACTKEYS_LRSEL_LEFT)  && (marker->frame <  CFRA)) ||				    ((leftright == ACTKEYS_LRSEL_RIGHT) && (marker->frame >= CFRA)))				{					marker->flag |= SELECT;				}				else {					marker->flag &= ~SELECT;				}			}		}	}	/* Cleanup */	ANIM_animdata_freelist(&anim_data);}
开发者ID:mgschwan,项目名称:blensor,代码行数:81,


示例18: draw_channel_strips

//.........这里部分代码省略.........										if (ac->datatype == ANIMCONT_ACTION)						glRectf(act_start,  (float)y - ACHANNEL_HEIGHT_HALF,  act_end,  (float)y + ACHANNEL_HEIGHT_HALF);				}				else if (ac->datatype == ANIMCONT_GPENCIL) {					/* frames less than one get less saturated background */					if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);					else glColor4ub(col2[0], col2[1], col2[2], 0x22);					glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF);										/* frames one and higher get a saturated background */					if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);					else glColor4ub(col2[0], col2[1], col2[2], 0x44);					glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF);				}				else if (ac->datatype == ANIMCONT_MASK) {					/* TODO --- this is a copy of gpencil */					/* frames less than one get less saturated background */					if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);					else glColor4ub(col2[0], col2[1], col2[2], 0x22);					glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF);					/* frames one and higher get a saturated background */					if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);					else glColor4ub(col2[0], col2[1], col2[2], 0x44);					glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF);				}			}		}				/*	Increment the step */		y -= ACHANNEL_STEP;	}			glDisable(GL_BLEND);		/* Draw keyframes 	 *	1) Only channels that are visible in the Action Editor get drawn/evaluated.	 *	   This is to try to optimize this for heavier data sets	 *	2) Keyframes which are out of view horizontally are disregarded 	 */	y = (float)(-ACHANNEL_HEIGHT);		for (ale = anim_data.first; ale; ale = ale->next) {		const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);		const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);				/* check if visible */		if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||		    IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )		{			/* check if anything to show for this channel */			if (ale->datatype != ALE_NONE) {				adt = ANIM_nla_mapping_get(ac, ale);								/* draw 'keyframes' for each specific datatype */				switch (ale->datatype) {					case ALE_ALL:						draw_summary_channel(v2d, ale->data, y);						break;					case ALE_SCE:						draw_scene_channel(v2d, ads, ale->key_data, y);						break;					case ALE_OB:						draw_object_channel(v2d, ads, ale->key_data, y);						break;					case ALE_ACT:						draw_action_channel(v2d, adt, ale->key_data, y);						break;					case ALE_GROUP:						draw_agroup_channel(v2d, adt, ale->data, y);						break;					case ALE_FCURVE:						draw_fcurve_channel(v2d, adt, ale->key_data, y);						break;					case ALE_GPFRAME:						draw_gpl_channel(v2d, ads, ale->data, y);						break;					case ALE_MASKLAY:						draw_masklay_channel(v2d, ads, ale->data, y);						break;				}			}		}				y -= ACHANNEL_STEP;	}		/* free tempolary channels used for drawing */	BLI_freelistN(&anim_data);	/* black line marking 'current frame' for Time-Slide transform mode */	if (saction->flag & SACTION_MOVING) {		glColor3f(0.0f, 0.0f, 0.0f);				glBegin(GL_LINES);		glVertex2f(saction->timeslide, v2d->cur.ymin - EXTRA_SCROLL_PAD);		glVertex2f(saction->timeslide, v2d->cur.ymax);		glEnd();	}}
开发者ID:vanangamudi,项目名称:blender-main,代码行数:101,


示例19: paste_animedit_keys

/** * This function pastes data from the keyframes copy/paste buffer * * /return Status code is whether the method FAILED to do anything */short paste_animedit_keys(bAnimContext *ac, ListBase *anim_data,                          const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode, bool flip){	bAnimListElem *ale;		const Scene *scene = (ac->scene);		const bool from_single = BLI_listbase_is_single(&animcopybuf);	const bool to_simple = BLI_listbase_is_single(anim_data);		float offset = 0.0f;	int pass;	/* check if buffer is empty */	if (BLI_listbase_is_empty(&animcopybuf)) {		BKE_report(ac->reports, RPT_ERROR, "No animation data in buffer to paste");		return -1;	}	if (BLI_listbase_is_empty(anim_data)) {		BKE_report(ac->reports, RPT_ERROR, "No selected F-Curves to paste into");		return -1;	}		/* methods of offset */	switch (offset_mode) {		case KEYFRAME_PASTE_OFFSET_CFRA_START:			offset = (float)(CFRA - animcopy_firstframe);			break;		case KEYFRAME_PASTE_OFFSET_CFRA_END:			offset = (float)(CFRA - animcopy_lastframe);			break;		case KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE:			offset = (float)(CFRA - animcopy_cfra);			break;		case KEYFRAME_PASTE_OFFSET_NONE:			offset = 0.0f;			break;	}	if (from_single && to_simple) {		/* 1:1 match, no tricky checking, just paste */		FCurve *fcu;		tAnimCopybufItem *aci;				ale = anim_data->first;		fcu = (FCurve *)ale->data;  /* destination F-Curve */		aci = animcopybuf.first;				paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode, false);		ale->update |= ANIM_UPDATE_DEFAULT;	}	else {		/* from selected channels 		 *  This "passes" system aims to try to find "matching" channels to paste keyframes		 *  into with increasingly loose matching heuristics. The process finishes when at least		 *  one F-Curve has been pasted into.		 */		for (pass = 0; pass < 3; pass++) {			unsigned int totmatch = 0;						for (ale = anim_data->first; ale; ale = ale->next) {				/* find buffer item to paste from 				 *	- if names don't matter (i.e. only 1 channel in buffer), don't check id/group				 *	- if names do matter, only check if id-type is ok for now (group check is not that important)				 *	- most importantly, rna-paths should match (array indices are unimportant for now)				 */				AnimData *adt = ANIM_nla_mapping_get(ac, ale);				FCurve *fcu = (FCurve *)ale->data;  /* destination F-Curve */				tAnimCopybufItem *aci = NULL;								switch (pass) {					case 0:						/* most strict, must be exact path match data_path & index */						aci = pastebuf_match_path_full(fcu, from_single, to_simple, flip);						break;										case 1:						/* less strict, just compare property names */						aci = pastebuf_match_path_property(fcu, from_single, to_simple);						break;										case 2:						/* Comparing properties gave no results, so just do index comparisons */						aci = pastebuf_match_index_only(fcu, from_single, to_simple);						break;				}								/* copy the relevant data from the matching buffer curve */				if (aci) {					totmatch++;										if (adt) {						ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);						paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode, flip);//.........这里部分代码省略.........
开发者ID:Moguri,项目名称:blender,代码行数:101,



注:本文中的ANIM_nla_mapping_get函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ ANI_IS_STATUS_SUCCESS函数代码示例
C++ ANIM_editkeyframes_select函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。