Пример #1
0
static char *rna_NlaStrip_path(PointerRNA *ptr)
{
	NlaStrip *strip = (NlaStrip *)ptr->data;
	AnimData *adt = BKE_animdata_from_id(ptr->id.data);
	
	/* if we're attached to AnimData, try to resolve path back to AnimData */
	if (adt) {
		NlaTrack *nlt;
		NlaStrip *nls;
		
		for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) {
			for (nls = nlt->strips.first; nls; nls = nls->next) {
				if (nls == strip) {
					/* XXX but if we animate like this, the control will never work... */
					char name_esc_nlt[sizeof(nlt->name) * 2];
					char name_esc_strip[sizeof(strip->name) * 2];

					BLI_strescape(name_esc_nlt, nlt->name, sizeof(name_esc_nlt));
					BLI_strescape(name_esc_strip, strip->name, sizeof(name_esc_strip));
					return BLI_sprintfN("animation_data.nla_tracks[\"%s\"].strips[\"%s\"]",
					                    name_esc_nlt, name_esc_strip);
				}
			}
		}
	}
	
	/* no path */
	return BLI_strdup("");
}
Пример #2
0
/* Temporary wrapper for driver operators for buttons to make it easier to create
 * such drivers by rerouting all paths through the active object instead so that
 * they will get picked up by the dependency system.
 *
 * < C: context pointer - for getting active data 
 * <> ptr: RNA pointer for property's datablock. May be modified as result of path remapping.
 * < prop: RNA definition of property to add for
 *
 * > returns: MEM_alloc'd string representing the path to the property from the given PointerRNA
 */
static char *get_driver_path_hack(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
{
	ID *id = (ID *)ptr->id.data;
	ScrArea *sa = CTX_wm_area(C);
	
	/* get standard path which may be extended */
	char *basepath = RNA_path_from_ID_to_property(ptr, prop);
	char *path = basepath; /* in case no remapping is needed */
	
	
	/* Remapping will only be performed in the Properties Editor, as only this 
	 * restricts the subspace of options to the 'active' data (a manageable state)
	 */
	// TODO: watch out for pinned context?
	if ((sa) && (sa->spacetype == SPACE_BUTS)) {
		Object *ob = CTX_data_active_object(C);
		
		if (ob && id) {
			/* only id-types which can be remapped to go through objects should be considered */
			switch (GS(id->name)) {
				case ID_TE: /* textures */
				{
					Material *ma = give_current_material(ob, ob->actcol);
					Tex *tex = give_current_material_texture(ma);
					
					/* assumes: texture will only be shown if it is active material's active texture it's ok */
					if ((ID *)tex == id) {
						char name_esc_ma[(sizeof(ma->id.name) - 2) * 2];
						char name_esc_tex[(sizeof(tex->id.name) - 2) * 2];

						BLI_strescape(name_esc_ma, ma->id.name + 2, sizeof(name_esc_ma));
						BLI_strescape(name_esc_tex, tex->id.name + 2, sizeof(name_esc_tex));

						/* create new path */
						// TODO: use RNA path functions to construct step by step instead?
						// FIXME: maybe this isn't even needed anymore...
						path = BLI_sprintfN("material_slots[\"%s\"].material.texture_slots[\"%s\"].texture.%s", 
						                    name_esc_ma, name_esc_tex, basepath);
							
						/* free old one */
						MEM_freeN(basepath);
					}
					break;
				}
			}
			
			/* fix RNA pointer, as we've now changed the ID root by changing the paths */
			if (basepath != path) {
				/* rebase provided pointer so that it starts from object... */
				RNA_pointer_create(&ob->id, ptr->type, ptr->data, ptr);
			}
		}
	}
	
	/* the path should now have been corrected for use */
	return path;
}
Пример #3
0
static char *rna_DynamicPaintSurface_path(PointerRNA *ptr)
{
	DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data;
	ModifierData *md = (ModifierData *)surface->canvas->pmd;
	char name_esc[sizeof(md->name) * 2];
	char name_esc_surface[sizeof(surface->name) * 2];

	BLI_strescape(name_esc, md->name, sizeof(name_esc));
	BLI_strescape(name_esc_surface, surface->name, sizeof(name_esc_surface));
	return BLI_sprintfN("modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"]", name_esc, name_esc_surface);
}
Пример #4
0
static char *rna_ShapeKeyPoint_path(PointerRNA *ptr)
{
	ID *id = (ID *)ptr->id.data;
	Key *key = rna_ShapeKey_find_key(ptr->id.data);
	KeyBlock *kb;
	float *point = (float *)ptr->data;
	
	/* if we can get a key block, we can construct a path */
	kb = rna_ShapeKeyData_find_keyblock(key, point);
	
	if (kb) {
		char name_esc_kb[sizeof(kb->name) * 2];
		int index;
		
		if (ptr->type == &RNA_ShapeKeyBezierPoint)
			index = rna_ShapeKeyBezierPoint_get_index(kb, point);
		else
			index = rna_ShapeKeyPoint_get_index(key, kb, point);

		BLI_strescape(name_esc_kb, kb->name, sizeof(name_esc_kb));
		
		if (GS(id->name) == ID_KE)
			return BLI_sprintfN("key_blocks[\"%s\"].data[%d]", name_esc_kb, index);
		else
			return BLI_sprintfN("shape_keys.key_blocks[\"%s\"].data[%d]", name_esc_kb, index);
	}
	else
		return NULL;  /* XXX: there's really no way to resolve this... */
}
Пример #5
0
static char *rna_MaskLayer_path(PointerRNA *ptr)
{
	MaskLayer *masklay = (MaskLayer *)ptr->data;
	char name_esc[sizeof(masklay->name) * 2];
	BLI_strescape(name_esc, masklay->name, sizeof(name_esc));
	return BLI_sprintfN("layers[\"%s\"]", name_esc);
}
Пример #6
0
static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value)
{
	const char *value_str;
	Py_ssize_t  value_str_len;

	char       *value_escape_str;
	Py_ssize_t  value_escape_str_len;
	PyObject   *value_escape;
	size_t size;

	value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);

	if (value_str == NULL) {
		PyErr_SetString(PyExc_TypeError, "expected a string");
		return NULL;
	}

	size = (value_str_len * 2) + 1;
	value_escape_str = PyMem_MALLOC(size);
	value_escape_str_len = BLI_strescape(value_escape_str, value_str, size);

	if (value_escape_str_len == value_str_len) {
		Py_INCREF(value);
		value_escape = value;
	}
	else {
		value_escape = PyUnicode_FromStringAndSize(value_escape_str, value_escape_str_len);
	}

	PyMem_FREE(value_escape_str);

	return value_escape;
}
Пример #7
0
char *BKE_path_from_ID_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp)
{
	LineStyleModifier *m;
	bool found = false;

	for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) {
		switch (m->type) {
			case LS_MODIFIER_ALONG_STROKE:
				if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp)
					found = true;
				break;
			case LS_MODIFIER_DISTANCE_FROM_CAMERA:
				if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp)
					found = true;
				break;
			case LS_MODIFIER_DISTANCE_FROM_OBJECT:
				if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp)
					found = true;
				break;
			case LS_MODIFIER_MATERIAL:
				if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp)
					found = true;
				break;
		}

		if (found) {
			char name_esc[sizeof(m->name) * 2];
			BLI_strescape(name_esc, m->name, sizeof(name_esc));
			return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", name_esc);
		}
	}
	printf("BKE_path_from_ID_to_color_ramp: No color ramps correspond to the given pointer.\n");
	return NULL;
}
Пример #8
0
static char *rna_ViewLayer_path(PointerRNA *ptr)
{
  ViewLayer *srl = (ViewLayer *)ptr->data;
  char name_esc[sizeof(srl->name) * 2];

  BLI_strescape(name_esc, srl->name, sizeof(name_esc));
  return BLI_sprintfN("view_layers[\"%s\"]", name_esc);
}
Пример #9
0
static char *rna_SmokeCollSettings_path(PointerRNA *ptr)
{
	SmokeCollSettings *settings = (SmokeCollSettings *)ptr->data;
	ModifierData *md = (ModifierData *)settings->smd;
	char name_esc[sizeof(md->name) * 2];

	BLI_strescape(name_esc, md->name, sizeof(name_esc));
	return BLI_sprintfN("modifiers[\"%s\"].coll_settings", name_esc);
}
Пример #10
0
static char *rna_FluidSettings_path(PointerRNA *ptr)
{
  FluidsimSettings *fss = (FluidsimSettings *)ptr->data;
  ModifierData *md = (ModifierData *)fss->fmd;
  char name_esc[sizeof(md->name) * 2];

  BLI_strescape(name_esc, md->name, sizeof(name_esc));
  return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
}
Пример #11
0
static char *rna_BoidRule_path(PointerRNA *ptr)
{
    BoidRule *rule = (BoidRule *)ptr->data;
    char name_esc[sizeof(rule->name) * 2];

    BLI_strescape(name_esc, rule->name, sizeof(name_esc));

    return BLI_sprintfN("rules[\"%s\"]", name_esc);  /* XXX not unique */
}
Пример #12
0
static char *rna_GPencilLayer_path(PointerRNA *ptr)
{
	bGPDlayer *gpl = (bGPDlayer *)ptr->data;
	char name_esc[sizeof(gpl->info) * 2];
	
	BLI_strescape(name_esc, gpl->info, sizeof(name_esc));
	
	return BLI_sprintfN("layers[\"%s\"]", name_esc);
}
Пример #13
0
static char *rna_DynamicPaintBrushSettings_path(PointerRNA *ptr)
{
	DynamicPaintBrushSettings *settings = (DynamicPaintBrushSettings *)ptr->data;
	ModifierData *md = (ModifierData *)settings->pmd;
	char name_esc[sizeof(md->name) * 2];

	BLI_strescape(name_esc, md->name, sizeof(name_esc));
	return BLI_sprintfN("modifiers[\"%s\"].brush_settings", name_esc);
}
Пример #14
0
static char *rna_ShapeKey_path(PointerRNA *ptr)
{
	KeyBlock *kb = (KeyBlock *)ptr->data;
	ID *id = ptr->id.data;
	char name_esc[sizeof(kb->name) * 2];

	BLI_strescape(name_esc, kb->name, sizeof(name_esc));

	if ((id) && (GS(id->name) != ID_KE))
		return BLI_sprintfN("shape_keys.key_blocks[\"%s\"]", name_esc);
	else
		return BLI_sprintfN("key_blocks[\"%s\"]", name_esc);
}
Пример #15
0
static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
{
	Object *ob = (Object *)ptr->id.data;
	ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);

	if (md) {
		char name_esc[sizeof(md->name) * 2];
		BLI_strescape(name_esc, md->name, sizeof(name_esc));
		return BLI_sprintfN("modifiers[\"%s\"].collision_settings", name_esc);
	}
	else {
		return NULL;
	}
}
Пример #16
0
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
{
	MovieTracking *tracking = &clip->tracking;
	MovieTrackingStabilization *stab = &tracking->stabilization;
	MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking);
	ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
	bool has_bundle = false, update_stab = false;
	char track_name_escaped[MAX_NAME], prefix[MAX_NAME * 2];

	if (track == act_track)
		tracking->act_track = NULL;

	if (track == stab->rot_track) {
		stab->rot_track = NULL;

		update_stab = true;
	}

	/* handle reconstruction display in 3d viewport */
	if (track->flag & TRACK_HAS_BUNDLE)
		has_bundle = true;

	/* Make sure no plane will use freed track */
	BKE_tracking_plane_tracks_remove_point_track(tracking, track);

	/* Delete f-curves associated with the track (such as weight, i.e.) */
	BLI_strescape(track_name_escaped, track->name, sizeof(track_name_escaped));
	BLI_snprintf(prefix, sizeof(prefix), "tracks[\"%s\"]", track_name_escaped);
	BKE_animdata_fix_paths_remove(&clip->id, prefix);

	BKE_tracking_track_free(track);
	BLI_freelinkN(tracksbase, track);

	WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);

	if (update_stab) {
		tracking->stabilization.ok = false;
		WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip);
	}

	DAG_id_tag_update(&clip->id, 0);

	if (has_bundle)
		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
}
Пример #17
0
static char *rna_Bone_path(PointerRNA *ptr)
{
	ID *id = ptr->id.data;
	Bone *bone = (Bone *)ptr->data;
	char name_esc[sizeof(bone->name) * 2];
	
	BLI_strescape(name_esc, bone->name, sizeof(name_esc));

	/* special exception for trying to get the path where ID-block is Object
	 * - this will be assumed to be from a Pose Bone...
	 */
	if (id) {
		if (GS(id->name) == ID_OB) {
			return BLI_sprintfN("pose.bones[\"%s\"].bone", name_esc);
		}
	}
	
	/* from armature... */
	return BLI_sprintfN("bones[\"%s\"]", name_esc);
}
Пример #18
0
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
{
	MovieTracking *tracking = &clip->tracking;
	MovieTrackingStabilization *stab = &tracking->stabilization;
	MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking);
	MovieTrackingPlaneTrack *plane_track, *next_plane_track;
	ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
	ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
	bool has_bundle = false, update_stab = false;
	char track_name_escaped[MAX_NAME], prefix[MAX_NAME * 2];

	if (track == act_track)
		tracking->act_track = NULL;

	if (track == stab->rot_track) {
		stab->rot_track = NULL;

		update_stab = true;
	}

	/* handle reconstruction display in 3d viewport */
	if (track->flag & TRACK_HAS_BUNDLE)
		has_bundle = true;

	/* Make sure no plane will use freed track */
	for (plane_track = plane_tracks_base->first;
	     plane_track;
	     plane_track = next_plane_track)
	{
		bool found = false;
		int i;

		next_plane_track = plane_track->next;

		for (i = 0; i < plane_track->point_tracksnr; i++) {
			if (plane_track->point_tracks[i] == track) {
				found = true;
				break;
			}
		}

		if (!found) {
			continue;
		}

		if (plane_track->point_tracksnr > 4) {
			int track_index;
			MovieTrackingTrack **new_point_tracks;

			new_point_tracks = MEM_mallocN(sizeof(*new_point_tracks) * (plane_track->point_tracksnr - 1),
			                               "new point tracks array");

			for (i = 0, track_index = 0; i < plane_track->point_tracksnr; i++) {
				if (plane_track->point_tracks[i] != track) {
					new_point_tracks[track_index++] = plane_track->point_tracks[i];
				}
			}

			MEM_freeN(plane_track->point_tracks);
			plane_track->point_tracks = new_point_tracks;
			plane_track->point_tracksnr--;
		}
		else {
			/* Delete planes with less than 3 point tracks in it. */
			BKE_tracking_plane_track_free(plane_track);
			BLI_freelinkN(plane_tracks_base, plane_track);
		}
	}

	/* Delete f-curves associated with the track (such as weight, i.e.) */
	BLI_strescape(track_name_escaped, track->name, sizeof(track_name_escaped));
	BLI_snprintf(prefix, sizeof(prefix), "tracks[\"%s\"]", track_name_escaped);
	BKE_animdata_fix_paths_remove(&clip->id, prefix);

	BKE_tracking_track_free(track);
	BLI_freelinkN(tracksbase, track);

	WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);

	if (update_stab) {
		tracking->stabilization.ok = false;
		WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip);
	}

	DAG_id_tag_update(&clip->id, 0);

	if (has_bundle)
		WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL);
}