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); }
void egraphics_arc_oval_to(t_elayer *g, float cx, float cy, float radius, float extend) { if(g->e_state == EGRAPHICS_OPEN) { if(g->e_new_objects.e_type == E_GOBJ_PATH && g->e_new_objects.e_points) { t_pt p2, p3, p4, c = {cx, cy}, prev = g->e_new_objects.e_points[g->e_new_objects.e_npoints-1]; float r1 = pd_radius(prev.x - cx, prev.y - cy); float angle = pd_angle(prev.x - cx, prev.y - cy); float ratio = (radius - r1) / (fabsf(extend) / EPD_PI4); while(extend > EPD_2PI) { extend -= EPD_2PI; } while(extend < -EPD_2PI) { extend += EPD_2PI; } while(fabsf(extend) >= EPD_PI4) { if(extend < 0.) { create_small_arc_oval(r1, r1 + ratio, angle, -EPD_PI4, c, &p2, &p3, &p4); extend += EPD_PI4; angle -= EPD_PI4; r1 += ratio; } else { create_small_arc_oval(r1, r1 + ratio, angle, EPD_PI4, c, &p2, &p3, &p4); extend -= EPD_PI4; angle += EPD_PI4; r1 += ratio; } egraphics_curve_to(g, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y); } if(fabsf(extend) > 1e-6) { create_small_arc_oval(r1, radius, angle, extend, c, &p2, &p3, &p4); egraphics_curve_to(g, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y); } } else { g->e_new_objects.e_type = E_GOBJ_INVALID; } } }
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); }