コード例 #1
0
/* helper func - just draw the F-Curve by sampling the visible region (for drawing curves with modifiers) */
static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
{
	ChannelDriver *driver;
	float samplefreq, ctime;
	float stime, etime;
	float unitFac;
	float dx, dy;
	short mapping_flag = ANIM_get_normalization_flags(ac);

	/* when opening a blend file on a different sized screen or while dragging the toolbar this can happen
	 * best just bail out in this case */
	UI_view2d_grid_size(grid, &dx, &dy);
	if (dx <= 0.0f)
		return;


	/* disable any drivers temporarily */
	driver = fcu->driver;
	fcu->driver = NULL;
	
	/* compute unit correction factor */
	unitFac = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag);
	
	/* Note about sampling frequency:
	 *  Ideally, this is chosen such that we have 1-2 pixels = 1 segment
	 *	which means that our curves can be as smooth as possible. However,
	 *  this does mean that curves may not be fully accurate (i.e. if they have
	 *  sudden spikes which happen at the sampling point, we may have problems).
	 *  Also, this may introduce lower performance on less densely detailed curves,'
	 *	though it is impossible to predict this from the modifiers!
	 *
	 *	If the automatically determined sampling frequency is likely to cause an infinite
	 *	loop (i.e. too close to 0), then clamp it to a determined "safe" value. The value
	 *  chosen here is just the coarsest value which still looks reasonable...
	 */
	/* grid->dx represents the number of 'frames' between gridlines, but we divide by U.v2d_min_gridsize to get pixels-steps */
	/* TODO: perhaps we should have 1.0 frames as upper limit so that curves don't get too distorted? */
	samplefreq = dx / (U.v2d_min_gridsize * U.pixelsize);
	if (samplefreq < 0.00001f) samplefreq = 0.00001f;
	
	
	/* the start/end times are simply the horizontal extents of the 'cur' rect */
	stime = v2d->cur.xmin;
	etime = v2d->cur.xmax + samplefreq; /* + samplefreq here so that last item gets included... */
	
	
	/* at each sampling interval, add a new vertex 
	 *	- apply the unit correction factor to the calculated values so that 
	 *	  the displayed values appear correctly in the viewport
	 */
	glBegin(GL_LINE_STRIP);
	
	for (ctime = stime; ctime <= etime; ctime += samplefreq)
		glVertex2f(ctime, evaluate_fcurve(fcu, ctime) * unitFac);
	
	glEnd();
	
	/* restore driver */
	fcu->driver = driver;
}
コード例 #2
0
ファイル: graph_draw.c プロジェクト: Brachi/blender
/* helper func - just draw the F-Curve by sampling the visible region (for drawing curves with modifiers) */
static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
{
	SpaceIpo *sipo = (SpaceIpo *)ac->sl;
	ChannelDriver *driver;
	float samplefreq;
	float stime, etime;
	float unitFac, offset;
	float dx, dy;
	short mapping_flag = ANIM_get_normalization_flags(ac);
	int i, n;

	/* when opening a blend file on a different sized screen or while dragging the toolbar this can happen
	 * best just bail out in this case */
	UI_view2d_grid_size(grid, &dx, &dy);
	if (dx <= 0.0f)
		return;


	/* disable any drivers temporarily */
	driver = fcu->driver;
	fcu->driver = NULL;
	
	/* compute unit correction factor */
	unitFac = ANIM_unit_mapping_get_factor(ac->scene, id, fcu, mapping_flag, &offset);
	
	/* Note about sampling frequency:
	 *  Ideally, this is chosen such that we have 1-2 pixels = 1 segment
	 *	which means that our curves can be as smooth as possible. However,
	 *  this does mean that curves may not be fully accurate (i.e. if they have
	 *  sudden spikes which happen at the sampling point, we may have problems).
	 *  Also, this may introduce lower performance on less densely detailed curves,
	 *	though it is impossible to predict this from the modifiers!
	 *
	 *	If the automatically determined sampling frequency is likely to cause an infinite
	 *	loop (i.e. too close to 0), then clamp it to a determined "safe" value. The value
	 *  chosen here is just the coarsest value which still looks reasonable...
	 */
	/* grid->dx represents the number of 'frames' between gridlines, but we divide by U.v2d_min_gridsize to get pixels-steps */
	/* TODO: perhaps we should have 1.0 frames as upper limit so that curves don't get too distorted? */
	samplefreq = dx / (U.v2d_min_gridsize * U.pixelsize);
	
	if (sipo->flag & SIPO_BEAUTYDRAW_OFF) {
		/* Low Precision = coarse lower-bound clamping
		 * 
		 * Although the "Beauty Draw" flag was originally for AA'd
		 * line drawing, the sampling rate here has a much greater
		 * impact on performance (e.g. for T40372)!
		 *
		 * This one still amounts to 10 sample-frames for each 1-frame interval
		 * which should be quite a decent approximation in many situations.
		 */
		if (samplefreq < 0.1f)
			samplefreq = 0.1f;
	}
	else {
		/* "Higher Precision" but slower - especially on larger windows (e.g. T40372) */
		if (samplefreq < 0.00001f)
			samplefreq = 0.00001f;
	}
	
	
	/* the start/end times are simply the horizontal extents of the 'cur' rect */
	stime = v2d->cur.xmin;
	etime = v2d->cur.xmax + samplefreq; /* + samplefreq here so that last item gets included... */
	
	
	/* at each sampling interval, add a new vertex 
	 *	- apply the unit correction factor to the calculated values so that 
	 *	  the displayed values appear correctly in the viewport
	 */
	glBegin(GL_LINE_STRIP);
	
	n = (etime - stime) / samplefreq + 0.5f;
	for (i = 0; i <= n; i++) {
		float ctime = stime + i * samplefreq;
		glVertex2f(ctime, (evaluate_fcurve(fcu, ctime) + offset) * unitFac);
	}
	
	glEnd();
	
	/* restore driver */
	fcu->driver = driver;
}