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

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

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

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

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

示例1: actkeys_mselect_single

/* option 1) select keyframe directly under mouse */static void actkeys_mselect_single(bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx){	KeyframeEditData ked = {{NULL}};	KeyframeEditFunc select_cb, ok_cb;		/* get functions for selecting keyframes */	select_cb = ANIM_editkeyframes_select(select_mode);	ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAME);	ked.f1 = selx;		/* select the nominated keyframe on the given frame */	if (ale->type == ANIMTYPE_GPLAYER)		ED_gpencil_select_frame(ale->data, selx, select_mode);	else if (ale->type == ANIMTYPE_MASKLAYER)		ED_mask_select_frame(ale->data, selx, select_mode);	else {		if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK) &&		    (ale->type == ANIMTYPE_SUMMARY) && (ale->datatype == ALE_ALL))		{			ListBase anim_data = {NULL, NULL};			int filter;			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) {				if (ale->type == ANIMTYPE_GPLAYER)					ED_gpencil_select_frame(ale->data, selx, select_mode);				else if (ale->type == ANIMTYPE_MASKLAYER)					ED_mask_select_frame(ale->data, selx, select_mode);			}		}		else {			ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL);		}	}}
开发者ID:vanangamudi,项目名称:blender-main,代码行数:36,


示例2: poselib_apply_pose

/* Applies the appropriate stored pose from the pose-library to the current pose *	- assumes that a valid object, with a poselib has been supplied *	- gets the string to print in the header *  - this code is based on the code for extract_pose_from_action in blenkernel/action.c */static void poselib_apply_pose(tPoseLib_PreviewData *pld){	PointerRNA *ptr = &pld->rna_ptr;	bArmature *arm = pld->arm;	bPose *pose = pld->pose;	bPoseChannel *pchan;	bAction *act = pld->act;	bActionGroup *agrp;		KeyframeEditData ked = {{NULL}};	KeyframeEditFunc group_ok_cb;	int frame = 1;		/* get the frame */	if (pld->marker)		frame = pld->marker->frame;	else		return;			/* init settings for testing groups for keyframes */	group_ok_cb = ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);	ked.f1 = ((float)frame) - 0.5f;	ked.f2 = ((float)frame) + 0.5f;			/* start applying - only those channels which have a key at this point in time! */	for (agrp = act->groups.first; agrp; agrp = agrp->next) {		/* check if group has any keyframes */		if (ANIM_animchanneldata_keyframes_loop(&ked, NULL, agrp, ALE_GROUP, NULL, group_ok_cb, NULL)) {			/* has keyframe on this frame, so try to get a PoseChannel with this name */			pchan = BKE_pose_channel_find_name(pose, agrp->name);						if (pchan) {				short ok = 0;								/* check if this bone should get any animation applied */				if (pld->selcount == 0) {					/* if no bones are selected, then any bone is ok */					ok = 1;				}				else if (pchan->bone) {					/* only ok if bone is visible and selected */					if ((pchan->bone->flag & BONE_SELECTED) &&					    (pchan->bone->flag & BONE_HIDDEN_P) == 0 &&					    (pchan->bone->layer & arm->layer))					{						ok = 1;					}				}								if (ok) 					animsys_evaluate_action_group(ptr, act, agrp, NULL, (float)frame);			}		}	}}
开发者ID:castlelore,项目名称:blender-git,代码行数:62,


示例3: deselect_action_keys

/* Deselects keyframes in the action editor *	- This is called by the deselect all operator, as well as other ones! * * 	- test: check if select or deselect all *	- sel: how to select keyframes (SELECT_*) */static void deselect_action_keys (bAnimContext *ac, short test, short sel){	ListBase anim_data = {NULL, NULL};	bAnimListElem *ale;	int filter;		KeyframeEditData ked= {{NULL}};	KeyframeEditFunc test_cb, sel_cb;		/* determine type-based settings */	if (ac->datatype == ANIMCONT_GPENCIL)		filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_NODUPLIS);	else		filter= (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE /*| ANIMFILTER_CURVESONLY*/ | ANIMFILTER_NODUPLIS);		/* filter data */	ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);		/* init BezTriple looping data */	test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED);		/* See if we should be selecting or deselecting */	if (test) {		for (ale= anim_data.first; ale; ale= ale->next) {			if (ale->type == ANIMTYPE_GPLAYER) {				if (is_gplayer_frame_selected(ale->data)) {					sel= SELECT_SUBTRACT;					break;				}			}			else {				if (ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, test_cb, NULL)) {					sel= SELECT_SUBTRACT;					break;				}			}		}	}		/* convert sel to selectmode, and use that to get editor */	sel_cb= ANIM_editkeyframes_select(sel);		/* Now set the flags */	for (ale= anim_data.first; ale; ale= ale->next) {		if (ale->type == ANIMTYPE_GPLAYER)			set_gplayer_frame_selection(ale->data, sel);		else			ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL); 	}		/* Cleanup */	BLI_freelistN(&anim_data);}
开发者ID:mik0001,项目名称:Blender,代码行数:59,


示例4: 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,


示例5: actkeys_mselect_single

/* option 1) select keyframe directly under mouse */static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx){	KeyframeEditData ked= {{NULL}};	KeyframeEditFunc select_cb, ok_cb;		/* get functions for selecting keyframes */	select_cb= ANIM_editkeyframes_select(select_mode);	ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);	ked.f1= selx;		/* select the nominated keyframe on the given frame */	if (ale->type == ANIMTYPE_GPLAYER)		select_gpencil_frame(ale->data, selx, select_mode);	else		ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL);}
开发者ID:mik0001,项目名称:Blender,代码行数:17,


示例6: 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,


示例7: ANIM_unit_mapping_apply_fcurve

/* Apply/Unapply units conversions to keyframes */void ANIM_unit_mapping_apply_fcurve(Scene *scene, ID *id, FCurve *fcu, short flag){	KeyframeEditData ked;	KeyframeEditFunc sel_cb;	float fac;		/* abort if rendering - we may get some race condition issues... */	if (G.is_rendering) return;		/* calculate mapping factor, and abort if nothing to change */	fac = ANIM_unit_mapping_get_factor(scene, id, fcu, (flag & ANIM_UNITCONV_RESTORE));	if (fac == 1.0f)		return;		/* init edit data 	 *	- mapping factor is stored in f1	 *	- flags are stored in 'i1'	 */	memset(&ked, 0, sizeof(KeyframeEditData));	ked.f1 = (float)fac;	ked.i1 = (int)flag;		/* only selected? */	if (flag & ANIM_UNITCONV_ONLYSEL)		sel_cb = ANIM_editkeyframes_ok(BEZT_OK_SELECTED);	else		sel_cb = NULL;		/* apply to F-Curve */	ANIM_fcurve_keyframes_loop(&ked, fcu, sel_cb, bezt_unit_mapping_apply, NULL);		// FIXME: loop here for samples should be generalised	// TODO: only sel?	if (fcu->fpt) {		FPoint *fpt;		unsigned int i;				for (i = 0, fpt = fcu->fpt; i < fcu->totvert; i++, fpt++) {			/* apply unit mapping */			fpt->vec[1] *= fac;		}	}}
开发者ID:244xiao,项目名称:blender,代码行数:44,


示例8: 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,


示例9: 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,


示例10: 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,


示例11: copy_animedit_keys

/* This function adds data to the keyframes copy/paste buffer, freeing existing data first */short copy_animedit_keys(bAnimContext *ac, ListBase *anim_data){		bAnimListElem *ale;	Scene *scene = ac->scene;		/* clear buffer first */	free_anim_copybuf();		/* assume that each of these is an F-Curve */	for (ale = anim_data->first; ale; ale = ale->next) {		FCurve *fcu = (FCurve *)ale->key_data;		tAnimCopybufItem *aci;		BezTriple *bezt, *nbezt, *newbuf;		int i;				/* firstly, check if F-Curve has any selected keyframes		 *	- skip if no selected keyframes found (so no need to create unnecessary copy-buffer data)		 *	- this check should also eliminate any problems associated with using sample-data		 */		if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, ANIM_editkeyframes_ok(BEZT_OK_SELECTED), NULL) == 0)			continue;				/* init copybuf item info */		aci = MEM_callocN(sizeof(tAnimCopybufItem), "AnimCopybufItem");		aci->id = ale->id;		aci->id_type = GS(ale->id->name);		aci->grp = fcu->grp;		aci->rna_path = MEM_dupallocN(fcu->rna_path);		aci->array_index = fcu->array_index;				/* detect if this is a bone. We do that here rather than during pasting because ID pointers will get invalidated if we undo.		 * storing the relevant information here helps avoiding crashes if we undo-repaste */		if ((aci->id_type == ID_OB) && (((Object *)aci->id)->type == OB_ARMATURE) && aci->rna_path) {			Object *ob = (Object *)aci->id;			bPoseChannel *pchan;			char *bone_name;			bone_name = BLI_str_quoted_substrN(aci->rna_path, "pose.bones[");			pchan = BKE_pose_channel_find_name(ob->pose, bone_name);			if (pchan) {				aci->is_bone = true;			}			if (bone_name) MEM_freeN(bone_name);		}				BLI_addtail(&animcopybuf, aci);				/* add selected keyframes to buffer */		/* TODO: currently, we resize array every time we add a new vert -		 * this works ok as long as it is assumed only a few keys are copied */		for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {			if (BEZT_ISSEL_ANY(bezt)) {				/* add to buffer */				newbuf = MEM_callocN(sizeof(BezTriple) * (aci->totvert + 1), "copybuf beztriple");								/* assume that since we are just re-sizing the array, just copy all existing data across */				if (aci->bezt)					memcpy(newbuf, aci->bezt, sizeof(BezTriple) * (aci->totvert));								/* copy current beztriple across too */				nbezt = &newbuf[aci->totvert];				*nbezt = *bezt;								/* ensure copy buffer is selected so pasted keys are selected */				BEZT_SEL_ALL(nbezt);								/* free old array and set the new */				if (aci->bezt) MEM_freeN(aci->bezt);				aci->bezt = newbuf;				aci->totvert++;								/* check if this is the earliest frame encountered so far */				if (bezt->vec[1][0] < animcopy_firstframe)					animcopy_firstframe = bezt->vec[1][0];				if (bezt->vec[1][0] > animcopy_lastframe)					animcopy_lastframe = bezt->vec[1][0];			}		}			}		/* check if anything ended up in the buffer */	if (ELEM(NULL, animcopybuf.first, animcopybuf.last))		return -1;	/* in case 'relative' paste method is used */	animcopy_cfra = CFRA;	/* everything went fine */	return 0;}
开发者ID:Moguri,项目名称:blender,代码行数:92,


示例12: copy_animedit_keys

/* This function adds data to the keyframes copy/paste buffer, freeing existing data first */short copy_animedit_keys(bAnimContext *ac, ListBase *anim_data){		bAnimListElem *ale;	Scene *scene = ac->scene;		/* clear buffer first */	free_anim_copybuf();		/* assume that each of these is an F-Curve */	for (ale = anim_data->first; ale; ale = ale->next) {		FCurve *fcu = (FCurve *)ale->key_data;		tAnimCopybufItem *aci;		BezTriple *bezt, *nbezt, *newbuf;		int i;				/* firstly, check if F-Curve has any selected keyframes		 *	- skip if no selected keyframes found (so no need to create unnecessary copy-buffer data)		 *	- this check should also eliminate any problems associated with using sample-data		 */		if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, ANIM_editkeyframes_ok(BEZT_OK_SELECTED), NULL) == 0)			continue;				/* init copybuf item info */		aci = MEM_callocN(sizeof(tAnimCopybufItem), "AnimCopybufItem");		aci->id = ale->id;		aci->id_type = GS(ale->id->name);		aci->grp = fcu->grp;		aci->rna_path = MEM_dupallocN(fcu->rna_path);		aci->array_index = fcu->array_index;		BLI_addtail(&animcopybuf, aci);				/* add selected keyframes to buffer */		/* TODO: currently, we resize array every time we add a new vert -		 * this works ok as long as it is assumed only a few keys are copied */		for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {			if (BEZSELECTED(bezt)) {				/* add to buffer */				newbuf = MEM_callocN(sizeof(BezTriple) * (aci->totvert + 1), "copybuf beztriple");								/* assume that since we are just re-sizing the array, just copy all existing data across */				if (aci->bezt)					memcpy(newbuf, aci->bezt, sizeof(BezTriple) * (aci->totvert));								/* copy current beztriple across too */				nbezt = &newbuf[aci->totvert];				*nbezt = *bezt;								/* ensure copy buffer is selected so pasted keys are selected */				BEZ_SEL(nbezt);								/* free old array and set the new */				if (aci->bezt) MEM_freeN(aci->bezt);				aci->bezt = newbuf;				aci->totvert++;								/* check if this is the earliest frame encountered so far */				if (bezt->vec[1][0] < animcopy_firstframe)					animcopy_firstframe = bezt->vec[1][0];				if (bezt->vec[1][0] > animcopy_lastframe)					animcopy_lastframe = bezt->vec[1][0];			}		}			}		/* check if anything ended up in the buffer */	if (ELEM(NULL, animcopybuf.first, animcopybuf.last))		return -1;	/* in case 'relative' paste method is used */	animcopy_cfra = CFRA;	/* everything went fine */	return 0;}
开发者ID:Eibriel,项目名称:kiriblender,代码行数:76,


示例13: 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,



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


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