예제 #1
0
파일: c.knob.cpp 프로젝트: EQ4/CreamLibrary
static void knob_mousedrag(t_knob *x, t_object *patcherview, t_pt pt, long modifiers)
{
    t_rect rect;
    ebox_get_rect_for_view((t_ebox *)x, &rect);
    if(x->f_circular)
    {
        const float size  = rect.width * 0.5f;
        const float angle = pd_angle(pt.x - size, -(size - pt.y));
        if(x->f_endless)
        {
            const float value = pd_wrap((angle - EPD_PI2) / EPD_2PI, 0.f, 1.f);
            if(ebox_parameter_isinverted((t_ebox *)x, 1))
            {
                ebox_parameter_setvalue_normalized((t_ebox *)x, 1, 1.f - value, 1);
            }
            else
            {
                ebox_parameter_setvalue_normalized((t_ebox *)x, 1, value, 1);
            }
        }
        else
        {
            const float value = (pd_clip(pd_wrap((angle - EPD_PI2) / EPD_2PI, 0.f, 1.f), 0.125f, 0.875f) - 0.125f) / 0.75f;
            if(ebox_parameter_isinverted((t_ebox *)x, 1))
            {
                ebox_parameter_setvalue_normalized((t_ebox *)x, 1, 1.f - value, 1);
            }
            else
            {
                ebox_parameter_setvalue_normalized((t_ebox *)x, 1, value, 1);
            }
        }
        
        knob_output(x);
        ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer);
        ebox_redraw((t_ebox *)x);
    }
    else
    {
        const float current = ebox_parameter_getvalue_normalized((t_ebox *)x, 1);
        const float diff    = (x->f_reference - pt.y) / (rect.width) * (ebox_parameter_isinverted((t_ebox *)x, 1) ? -1.f : 1.f);
        if(x->f_endless)
        {
            ebox_parameter_setvalue_normalized((t_ebox *)x, 1, pd_wrap(current + diff, 0.f, 1.f), 1);
        }
        else
        {
            ebox_parameter_setvalue_normalized((t_ebox *)x, 1, pd_clip(current + diff, 0.f, 1.f), 1);
        }
        x->f_reference      = pt.y;
    }
    knob_output(x);
    ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer);
    ebox_redraw((t_ebox *)x);
}
예제 #2
0
파일: c.knob.cpp 프로젝트: EQ4/CreamLibrary
static void knob_float(t_knob *x, float f)
{
    if(x->f_endless)
    {
        const float min = ebox_parameter_getmin((t_ebox *)x, 1);
        const float max = ebox_parameter_getmax((t_ebox *)x, 1);
        f = pd_wrap(f, min, max);
    }
    
    ebox_parameter_setvalue((t_ebox *)x, 1, f, 1);
    knob_output(x);
    ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer);
    ebox_redraw((t_ebox *)x);
}
예제 #3
0
파일: c.knob.cpp 프로젝트: EQ4/CreamLibrary
static t_pd_err knob_notify(t_knob *x, t_symbol *s, t_symbol *msg, void *sender, void *data)
{
	if(msg == cream_sym_attr_modified)
	{
		if(s == cream_sym_bgcolor || s == cream_sym_bdcolor ||
           s == cream_sym_necolor || s == cream_sym_endless || s == cream_sym_bdsize)
		{
			ebox_invalidate_layer((t_ebox *)x, cream_sym_needle_layer);
            ebox_invalidate_layer((t_ebox *)x, cream_sym_background_layer);
		}
	}
    else if(msg == cream_sym_value_changed)
    {
        knob_output(x);
        ebox_invalidate_layer((t_ebox *)x, cream_sym_background_layer);
        ebox_redraw((t_ebox *)x);
    }
	return 0;
}
예제 #4
0
파일: c.knob.cpp 프로젝트: EQ4/CreamLibrary
static void knob_bang(t_knob *x, float f)
{
    ebox_parameter_notify_changes((t_ebox *)x, 1);
    knob_output(x);
}
예제 #5
0
void knob_mousedrag(t_knob *x, t_object *patcherview, t_pt pt, long modifiers)
{
    float angle = pd_angle(pt.x - x->j_box.b_rect.width * 0.5, (x->j_box.b_rect.height * 0.5 - pt.y)) / EPD_2PI;
    if(x->f_mode)
    {
        if(x->f_endless)
        {
            if(x->f_min < x->f_max)
            {
                angle = -angle;
                angle -= 0.25;
                while (angle < 0.)
                    angle += 1.;
                while (angle > 1.)
                    angle -= 1.;
                x->f_value = angle * (x->f_max - x->f_min) + x->f_min;
            }
            else
            {
                angle += 0.25;
                while (angle < 0.)
                    angle += 1.;
                while (angle > 1.)
                    angle -= 1.;
                x->f_value = angle * (x->f_min - x->f_max) + x->f_max;
            }
        }
        else
        {
            if(x->f_min < x->f_max)
            {
                angle = -angle;
                angle -= 0.25;
                while (angle < 0.)
                    angle += 1.;
                while (angle > 1.)
                    angle -= 1.;
                angle = pd_clip_minmax(angle, 0.125, 0.875);
                angle -= 0.125;
                angle *= 1. / 0.75;
                x->f_value = angle * (x->f_max - x->f_min) + x->f_min;
            }
        
            else
            {
                angle += 0.25;
                while (angle < 0.)
                    angle += 1.;
                while (angle > 1.)
                    angle -= 1.;
                angle = pd_clip_minmax(angle, 0.125, 0.875);
                angle -= 0.125;
                angle *= 1. / 0.75;
                x->f_value = angle * (x->f_min - x->f_max) + x->f_max;
            }
        }
    }
    else
    {
        float diff = x->f_ref_y - pt.y;
        if(diff == 0xffffffff)
            return;
        if(x->f_min < x->f_max)
        {
            if(x->f_endless)
            {
                x->f_value = fmodf(diff / 50. * (x->f_max - x->f_min) + x->f_ref_value + x->f_max - x->f_min, x->f_max - x->f_min);
            }
            else
                x->f_value = pd_clip_minmax(diff / 50. * (x->f_max - x->f_min) + x->f_ref_value, x->f_min, x->f_max);
        }
        else
        {
            if(x->f_endless)
            {
                x->f_value = fmodf(diff / 50. * (x->f_min - x->f_max) + x->f_ref_value + x->f_min - x->f_max, x->f_min - x->f_max);
            }
            else
                x->f_value = pd_clip_minmax(diff / 50. * (x->f_min - x->f_max) + x->f_ref_value, x->f_max, x->f_min);
        }
    }
    ebox_invalidate_layer((t_ebox *)x, gensym("needle_layer"));
    ebox_redraw((t_ebox *)x);
    knob_output(x);
}
예제 #6
0
void knob_bang(t_knob *x)
{
    knob_output(x);
}
예제 #7
0
void knob_float(t_knob *x, float f)
{
    knob_set(x, f);
    knob_output(x);
}