void draw_harmonics(t_space *x, t_object *view, t_rect *rect) { int pathLength = 0; t_pt beginCoord; t_jgraphics *g = jbox_start_layer((t_object *)x, view, gensym("harmonics_layer"), rect->width, rect->height); if (g) { t_jmatrix transform; jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center.x, x->f_center.y); jgraphics_set_matrix(g, &transform); jgraphics_set_line_width(g, 2); if(x->f_viewer->getBiggestContribution() != 0.) { double max = 0.; double normalize = 1; for(int i = 0 ; i < x->f_number_of_microphones; i++) { if(x->f_microphonesValues[i] > max) max = x->f_microphonesValues[i]; } normalize = max / x->f_viewer->getBiggestContribution(); if(x->f_mode == 1) normalize = x->f_rotation_max / x->f_viewer->getBiggestContribution(); double factor = (x->f_rayonGlobal * 5. / 6.) * normalize; jgraphics_set_source_jrgba(g, &x->f_color_harmonics); for(int i = 0; i < NUMBEROFCIRCLEPOINTS; i++) { if (i == NUMBEROFCIRCLEPOINTS-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_viewer->getColor(i) == 1) { if (pathLength == 0) { beginCoord.x = x->f_viewer->getAbscisseValue(i) * factor; beginCoord.y = x->f_viewer->getOrdinateValue(i) * factor; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else { jgraphics_line_to(g, x->f_viewer->getAbscisseValue(i) * factor, x->f_viewer->getOrdinateValue(i) * factor); } } } if (pathLength) { jgraphics_close_path(g); jgraphics_fill_preserve(g); jgraphics_stroke(g); } } jbox_end_layer((t_object*)x, view, gensym("harmonics_layer")); } jbox_paint_layer((t_object *)x, view, gensym("harmonics_layer"), 0., 0.); }
void draw_vectors(t_meter *x, t_object *view, t_rect *rect) { double pointSize = rect->width*0.02; double maxRadius = (x->f_rayonInt-pointSize-1); if (pointSize > maxRadius) return; double vecX, vecY; t_jmatrix transform; t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_vectors_layer, rect->width, rect->height); if (g) { jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); if (x->f_rotation) jgraphics_rotate(g, x->f_meter->getPlanewavesRotationX()); else jgraphics_rotate(g, -x->f_meter->getPlanewavesRotationX()); if (x->f_drawvector == VECTOR_BOTH || x->f_drawvector == VECTOR_ENERGY) { if (x->f_rotation) { vecX = x->f_vector_coords[2] * maxRadius; vecY = x->f_vector_coords[3] * maxRadius; } else { double rad = Math<double>::radius(x->f_vector_coords[2], x->f_vector_coords[3]) * maxRadius; double ang = -Math<double>::azimuth(x->f_vector_coords[2], x->f_vector_coords[3]); vecX = Math<double>::abscissa(rad, ang); vecY = Math<double>::ordinate(rad, ang); } jgraphics_set_source_jrgba(g, &x->f_color_energy); jgraphics_arc(g, vecX, vecY, pointSize, 0., HOA_2PI); jgraphics_fill_preserve(g); jgraphics_set_source_rgba(g, 0.2, 0.2, 0.2, 1.); jgraphics_stroke(g); } if (x->f_drawvector == VECTOR_BOTH || x->f_drawvector == VECTOR_VELOCITY) { if (x->f_rotation) { double rad = min(Math<double>::radius(x->f_vector_coords[0], x->f_vector_coords[1]), 1.) * maxRadius; double ang = Math<double>::azimuth(x->f_vector_coords[0], x->f_vector_coords[1]); vecX = Math<double>::abscissa(rad, ang); vecY = Math<double>::ordinate(rad, ang); } else { double rad = min(Math<double>::radius(x->f_vector_coords[0], x->f_vector_coords[1]), 1.) * maxRadius; double ang = -Math<double>::azimuth(x->f_vector_coords[0], x->f_vector_coords[1]); vecX = Math<double>::abscissa(rad, ang); vecY = Math<double>::ordinate(rad, ang); } jgraphics_set_source_jrgba(g, &x->f_color_velocity); jgraphics_arc(g, vecX, vecY, pointSize, 0., HOA_2PI); jgraphics_fill_preserve(g); jgraphics_set_source_rgba(g, 0.2, 0.2, 0.2, 1.); jgraphics_stroke(g); } jbox_end_layer((t_object*)x, view, hoa_sym_vectors_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_vectors_layer, 0., 0.); }
void draw_background(t_space *x, t_object *view, t_rect *rect) { int i; double y1, y2, rotateAngle; t_jmatrix transform; t_jgraphics *g = jbox_start_layer((t_object *)x, view, gensym("background_layer"), rect->width, rect->height); if (g) { /* Background ************************************/ jgraphics_rectangle_rounded(g, 0.5, 0.5, rect->width-1., rect->height-1., 12, 12); jgraphics_set_source_jrgba(g, &x->f_color_background); jgraphics_fill_preserve(g); jgraphics_set_source_jrgba(g, &x->f_color_border_box); jgraphics_stroke(g); /* Rotation slider *******************************/ if (x->f_shadow) { /* Inner shadow */ jgraphics_set_line_width(g, 4); jgraphics_set_source_jrgba(g, &x->f_color_circleShadow); jgraphics_arc(g, x->f_center.x+0.5, x->f_center.y+0.5, (double)5.5 * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_stroke(g); jgraphics_set_line_width(g, 4); jgraphics_set_source_jrgba(g, &x->f_color_circleShadow); jgraphics_arc(g, x->f_center.x+0.5, x->f_center.y+0.5, (double)5.8 * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_stroke(g); } /* Circle color */ jgraphics_set_line_width(g, 3); jgraphics_set_source_jrgba(g, &x->f_color_circle); jgraphics_arc(g, x->f_center.x, x->f_center.y, (double)5.5 * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_stroke(g); jgraphics_set_line_width(g, 3); jgraphics_set_source_jrgba(g, &x->f_color_circle); jgraphics_arc(g, x->f_center.x, x->f_center.y, (double)5.8 * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_stroke(g); /* Gros cercle */ jgraphics_arc(g, x->f_center.x, x->f_center.y, 5 * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_set_source_jrgba(g, &x->f_color_circleInner); jgraphics_fill(g); /* Circles ***************************************/ for(i = 5; i > 0; i--) { if (x->f_shadow) { /* Inner shadow */ jgraphics_set_line_width(g, 2); jgraphics_set_source_jrgba(g, &x->f_color_circleShadow); jgraphics_arc(g, x->f_center.x+0.5, x->f_center.y+0.5, (double)i * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_stroke(g); } /* Circle color */ jgraphics_set_line_width(g, 1); jgraphics_set_source_jrgba(g, &x->f_color_circle); jgraphics_arc(g, x->f_center.x, x->f_center.y, (double)i * x->f_rayonCircle, 0., JGRAPHICS_2PI); jgraphics_stroke(g); } /* Axes *******************************************/ jgraphics_set_source_jrgba(g, &x->f_color_circle); jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center.x, x->f_center.y); jgraphics_set_matrix(g, &transform); for(i = 0; i < x->f_number_of_microphones; i++) { rotateAngle = (double)i/ (double)x->f_number_of_microphones * JGRAPHICS_2PI - JGRAPHICS_2PI / ((double)x->f_number_of_microphones * 2.); jgraphics_rotate(g, rotateAngle); y1 = 1. / 6. * x->f_rayonGlobal; y2 = 5. / 6. * x->f_rayonGlobal; if (x->f_shadow) { if ( (rotateAngle <= JGRAPHICS_PI && rotateAngle > 0.) ) { jgraphics_move_to(g, -0.5, y1-0.5); jgraphics_line_to(g, -0.5, y2-0.5); } else { jgraphics_move_to(g, 0.5, y1+0.5); jgraphics_line_to(g, 0.5, y2+0.5); } jgraphics_set_line_width(g, 2); jgraphics_set_source_jrgba(g, &x->f_color_circleShadow); jgraphics_stroke(g); } jgraphics_move_to(g, 0, y1); jgraphics_line_to(g, 0, y2); jgraphics_set_source_jrgba(g, &x->f_color_circle); jgraphics_set_line_width(g, 1); jgraphics_stroke(g); jgraphics_rotate(g, -rotateAngle); } jbox_end_layer((t_object*)x, view, gensym("background_layer")); } jbox_paint_layer((t_object *)x, view, gensym("background_layer"), 0., 0.); }
void draw_skeleton(t_meter *x, t_object *view, t_rect *rect) { t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_skeleton_layer, rect->width, rect->height); if (g) { double deg1, deg2, rotateAngle, ledContainerSize, ledStroke, ledMargin, ledOffset, channelWidth; t_jmatrix transform; deg1 = HOA_PI2; ledContainerSize = x->f_rayonExt - x->f_rayonInt - (1*4); ledOffset = ledContainerSize / (x->f_numleds+1); ledStroke = ledOffset * 0.75; ledMargin = ledOffset * 0.5; t_jrgba black = rgba_addContrast(x->f_color_mbg, -0.12); // Background : jgraphics_rectangle(g, 0., 0., rect->width, rect->height); jgraphics_set_source_jrgba(g, &x->f_color_bg); jgraphics_fill_preserve(g); // Border : jgraphics_set_source_jrgba(g, &black); jgraphics_set_line_width(g, 1); jgraphics_stroke(g); // Meter Background : jgraphics_set_source_jrgba(g, &x->f_color_mbg); jgraphics_set_line_width(g, (x->f_rayonExt - x->f_rayonInt) - 0.5); jgraphics_arc(g, x->f_center, x->f_center, x->f_rayonExt*0.5+(x->f_rayonInt*0.5), 0., HOA_2PI); jgraphics_stroke(g); jgraphics_arc_negative(g, x->f_center, x->f_center, x->f_rayonExt*0.5+(x->f_rayonInt*0.5), HOA_PI, -HOA_2PI); // due to a stroke bug ! jgraphics_stroke(g); // skelton circles : if (x->f_drawmborder == 1 || x->f_drawmborder == 3) { jgraphics_set_source_jrgba(g, &black); jgraphics_set_line_width(g, 1); jgraphics_arc(g, x->f_center, x->f_center, x->f_rayonExt, 0., HOA_2PI); jgraphics_stroke(g); jgraphics_arc(g, x->f_center, x->f_center, x->f_rayonInt, 0., HOA_2PI); jgraphics_stroke(g); } if (x->f_drawledsbg) { jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); // skelton separators and leds bg: for(ulong i = 0; i < x->f_meter->getNumberOfPlanewaves(); i++) { channelWidth = radToDeg(x->f_meter->getPlanewaveWidth(i)); deg2 = degToRad(90. + channelWidth); rotateAngle = radToDeg(x->f_meter->getPlanewaveAzimuthMapped(i) + x->f_meter->getPlanewavesRotationX()) - (channelWidth*0.5); if (!x->f_rotation) { rotateAngle += channelWidth; rotateAngle *= -1; } jgraphics_rotate(g, degToRad(rotateAngle)); // leds Background : jgraphics_set_line_width(g, ledStroke); jgraphics_set_line_cap(g, JGRAPHICS_LINE_CAP_BUTT); jgraphics_set_source_jrgba(g, &x->f_color_ledbg); for(ulong j=0; j < x->f_numleds; j++ ) { if (x->f_meter->getNumberOfPlanewaves() > 1) { if ( x->f_meter->getNumberOfPlanewaves() < 24 && (channelWidth > 14.5)) { double tmpdeg1 = 0, tmpdeg2 = 0, tmprad = 0; if (x->f_direction == 0) // inside { tmpdeg1 = deg1 + (0.008 * (j+4) * x->f_metersize); tmpdeg2 = deg2 - (0.008 * (j+4) * x->f_metersize); tmprad = x->f_rayonExt - (j*ledOffset) - ledMargin - 2; } else // outside { tmpdeg1 = deg1 + (0.008 * (x->f_numleds+3-(j)) * x->f_metersize); tmpdeg2 = deg2 - (0.008 * (x->f_numleds+3-(j)) * x->f_metersize); tmprad = x->f_rayonInt + (j*ledOffset) + ledMargin + 2; } if (tmpdeg1 < tmpdeg2) jgraphics_arc(g, 0, 0, tmprad, tmpdeg1, tmpdeg2); else jgraphics_arc(g, 0, 0, tmprad, tmpdeg2, tmpdeg1); } else { if (x->f_direction == 0) jgraphics_arc_negative(g, 0, 0, x->f_rayonExt-(j*ledOffset) - ledMargin - 2, deg2, deg1); else jgraphics_arc_negative(g, 0, 0, x->f_rayonInt+(j*ledOffset) + ledMargin + 2, deg2, deg1); } } else // mono { if (x->f_direction == 0) jgraphics_arc(g, 0, 0, x->f_rayonExt - (j*ledOffset) - ledMargin - 2, 0, HOA_2PI); else jgraphics_arc(g, 0, 0, x->f_rayonInt + (j*ledOffset) + ledMargin + 2, 0, HOA_2PI); } jgraphics_stroke(g); } jgraphics_rotate(g, degToRad(-rotateAngle)); } } jbox_end_layer((t_object*)x, view, hoa_sym_skeleton_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_skeleton_layer, 0., 0.); }