void draw_separator(t_meter *x, t_object *view, t_rect *rect) { t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_separator_layer, rect->width, rect->height); if (g) { double rotateAngle, channelWidth; t_jmatrix transform; t_jrgba black = rgba_addContrast(x->f_color_mbg, -0.12); 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(int i=0; i < x->f_meter->getNumberOfPlanewaves(); i++) { channelWidth = radToDeg(x->f_meter->getPlanewaveWidth(i)); 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)); // separator if (x->f_meter->getNumberOfPlanewaves() > 1) { jgraphics_set_line_width(g, 1); jgraphics_set_source_jrgba(g, &black); jgraphics_move_to(g, 0., x->f_rayonInt); jgraphics_line_to(g, 0, x->f_rayonExt); jgraphics_stroke(g); } jgraphics_rotate(g, degToRad(-rotateAngle)); } jbox_end_layer((t_object*)x, view, hoa_sym_separator_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_separator_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_background(t_scope *x, t_object *view, t_rect *rect) { int i; double y1, y2, rotateAngle; t_jmatrix transform; t_jrgba black, white; double contrastBlack = 0.12; double contrastWhite = 0.08; black = white = x->f_colorBackground; black.red = Tools::clip_min(black.red -= contrastBlack); black.green = Tools::clip_min(black.green -= contrastBlack); black.blue = Tools::clip_min(black.blue -= contrastBlack); white.red = Tools::clip_max(white.red += contrastWhite, 1.); white.green = Tools::clip_max(white.green += contrastWhite, 1.); white.blue = Tools::clip_max(white.blue += contrastWhite, 1.); t_jgraphics *g = jbox_start_layer((t_object *)x, view, gensym("background_layer"), rect->width, rect->height); if (g) { /* Background */ /* jgraphics_set_source_jrgba(g, &x->f_colorBackground); jgraphics_rectangle_rounded(g, 0., 0., rect->width, rect->height, 6, 6); jgraphics_fill(g); */ /* Circles */ for(i = 5; i > 0; i--) { //inner shadow jgraphics_set_line_width(g, 2); jgraphics_set_source_jrgba(g, &white); jgraphics_arc(g, x->f_center.x+0.5, x->f_center.y+0.5, (double)i * x->f_rayonCircle, 0., CICM_2PI); jgraphics_stroke(g); jgraphics_set_line_width(g, 1); jgraphics_set_source_jrgba(g, &black); jgraphics_arc(g, x->f_center.x, x->f_center.y, (double)i * x->f_rayonCircle, 0., CICM_2PI); jgraphics_stroke(g); } /* Axes */ jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center.x, x->f_center.y); jgraphics_set_matrix(g, &transform); jgraphics_set_source_jrgba(g, &black); //for(i = 0; i < 12; i++) for(i = 0; i < (x->f_order * 2 + 2) ; i++) { rotateAngle = ( (double)i/(x->f_order * 2 + 2) * CICM_2PI ) - ( 0.5/(x->f_order * 2 + 2) * CICM_2PI ); jgraphics_rotate(g, rotateAngle); y1 = 1. / 6. * x->f_rayonGlobal; y2 = 5. / 6. * x->f_rayonGlobal; if ( (rotateAngle <= CICM_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, &white); jgraphics_stroke(g); jgraphics_move_to(g, 0, y1); jgraphics_line_to(g, 0, y2); jgraphics_set_source_jrgba(g, &black); 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_harmonics(t_hoa_scope *x, t_object *view, t_rect *rect) { int pathLength = 0; t_pt beginCoord; t_jpath* posHarmPath = NULL; t_jpath* negHarmPath = NULL; t_jmatrix transform; t_jrgba shadcolor = {0.4, 0.4, 0.4, 1.}; long posPathLen = 0, negPathLen = 0, precIndex = 0; t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_harmonics_layer, rect->width, rect->height); if(shadcolor.alpha > x->f_color_nh.alpha) shadcolor.alpha = x->f_color_ph.alpha; if(shadcolor.alpha > x->f_color_nh.alpha) shadcolor.alpha = x->f_color_nh.alpha; shadcolor.alpha -= 0.5; if(shadcolor.alpha < 0.) shadcolor.alpha = 0; if (g) { jgraphics_rotate(g, HOA_PI); jgraphics_set_line_join(g, JGRAPHICS_LINE_JOIN_ROUND); jgraphics_set_line_cap(g, JGRAPHICS_LINE_CAP_ROUND); jgraphics_set_line_width(g, 1); // positiv harmonics for(int i = 0; i < x->f_scope->getNumberOfPoints(); i++) { precIndex = i-1; if(precIndex < 0) precIndex += x->f_scope->getNumberOfPoints(); if(i == x->f_scope->getNumberOfPoints()-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_scope->getValue(i) >= 0) { if (pathLength == 0) { beginCoord.x = x->f_scope->getAbscissa(i) * x->f_radius; beginCoord.y = x->f_scope->getOrdinate(i) * x->f_radius; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else if(x->f_scope->getValue(i) < 0) { jgraphics_line_to(g, 0, 0); jgraphics_move_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } else { jgraphics_line_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } } } if (pathLength) { posHarmPath = jgraphics_copy_path(g); } posPathLen = pathLength; pathLength = 0; jgraphics_new_path(g); for(int i = 0; i < x->f_scope->getNumberOfPoints(); i++) { precIndex = i-1; if (precIndex < 0) precIndex += x->f_scope->getNumberOfPoints(); if (i == x->f_scope->getNumberOfPoints()-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_scope->getValue(i) < 0) { if (!pathLength) { beginCoord.x = x->f_scope->getAbscissa(i) * x->f_radius; beginCoord.y = x->f_scope->getOrdinate(i) * x->f_radius; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else if(x->f_scope->getValue(precIndex) >= 0) { jgraphics_line_to(g, 0, 0); jgraphics_move_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } else { jgraphics_line_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } } } if(pathLength) { negHarmPath = jgraphics_copy_path(g); } negPathLen = pathLength; // draw harmonics : if(posPathLen || negPathLen) { jgraphics_new_path(g); jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); // shadows jgraphics_translate(g, 1, 1); // decalage de l'ombre if (posPathLen) jgraphics_append_path(g, posHarmPath); if (negPathLen) jgraphics_append_path(g, negHarmPath); jgraphics_set_source_jrgba(g, &shadcolor); jgraphics_stroke(g); jgraphics_translate(g, -1, -1); // annulation du decalage // harmocolor if(posPathLen) { jgraphics_append_path(g, posHarmPath); jgraphics_set_source_jrgba(g, &x->f_color_ph); jgraphics_stroke(g); } if(negPathLen) { jgraphics_append_path(g, negHarmPath); jgraphics_set_source_jrgba(g, &x->f_color_nh); jgraphics_stroke(g); } } jbox_end_layer((t_object*)x, view, hoa_sym_harmonics_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_harmonics_layer, 0., 0.); }
void draw_background(t_hoa_scope *x, t_object *view, t_rect *rect) { int i; double y1, y2, rotateAngle; t_jmatrix transform; t_jrgba black, white; black = white = x->f_color_bg; black.red = clip_min(black.red - contrast_black, 0.); black.green = clip_min(black.green - contrast_black, 0.); black.blue = clip_min(black.blue - contrast_black, 0.); white.red = clip_max(white.red + contrast_white, 1.); white.green = clip_max(white.green + contrast_white, 1.); white.blue = clip_max(white.blue + contrast_white, 1.); t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_background_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); for(i = 0; i < (x->f_order * 2 + 2) ; i++) { rotateAngle = ((double)i / (x->f_order * 2 + 2) * HOA_2PI ) - (0.5 / (x->f_order * 2 + 2) * HOA_2PI); jgraphics_rotate(g, rotateAngle); y1 = x->f_radius / 5.; y2 = x->f_radius; if(rotateAngle > HOA_PI2 && rotateAngle < HOA_PI + HOA_PI2) { jgraphics_move_to(g, -1, long(y1)); jgraphics_line_to(g, -1, long(y2)); } else { jgraphics_move_to(g, 1, long(y1)); jgraphics_line_to(g, 1, long(y2)); } jgraphics_set_line_width(g, 2); jgraphics_set_source_jrgba(g, &white); jgraphics_stroke(g); jgraphics_move_to(g, 0, y1); jgraphics_line_to(g, 0, y2); jgraphics_set_source_jrgba(g, &black); jgraphics_set_line_width(g, 1); jgraphics_stroke(g); jgraphics_rotate(g, -rotateAngle); } jgraphics_matrix_init(&transform, 1, 0, 0, 1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); for(i = 5; i > 0; i--) { jgraphics_set_line_width(g, 2); jgraphics_set_source_jrgba(g, &white); jgraphics_arc(g, 1, 1, (double)i / 5. * x->f_radius, 0., HOA_2PI); jgraphics_stroke(g); jgraphics_set_line_width(g, 1); jgraphics_set_source_jrgba(g, &black); jgraphics_arc(g, 0, 0, (double)i / 5.* x->f_radius, 0., HOA_2PI); jgraphics_stroke(g); } jbox_end_layer((t_object*)x, view, hoa_sym_background_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_background_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_leds(t_meter *x, t_object *view, t_rect *rect) { t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_leds_layer, rect->width, rect->height); if (g) { int i, j, nbLed, tepidLimit, warmLimit, hotLimit; long nLoudSpeak = x->f_meter->getNumberOfPlanewaves(); double deg1, deg2, rotateAngle, ledContainerSize, ledMargin, ledOffset, meter_dB, min_dB_to_display, channelWidth; double tmpdeg1, tmpdeg2, tmprad; t_jrgba ledColor; t_jmatrix transform; deg1 = HOA_PI2; nbLed = x->f_numleds+1; ledContainerSize = x->f_rayonExt - x->f_rayonInt - 4; ledOffset = ledContainerSize / nbLed; ledMargin = ledOffset * 0.50; hotLimit = x->f_numleds - x->f_nhotleds; warmLimit = hotLimit - x->f_nwarmleds; tepidLimit = warmLimit - x->f_ntepidleds; min_dB_to_display = -1 * ( (x->f_numleds * x->f_dbperled) - (x->f_dbperled * 0.5) ); jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); jgraphics_set_line_cap(g, JGRAPHICS_LINE_CAP_BUTT); for(i = 0; i < nLoudSpeak; i++) { // dB (negatif) de -240 à 0; meter_dB = x->f_meter->getPlanewaveEnergy(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)); if ( meter_dB > min_dB_to_display ) // si on est en dessous pas la peine de dessiner { // leds : jgraphics_set_line_width(g, ledMargin); for(j=0; j<nbLed-1; j++) { if ( ( j < nbLed-1 ) && ( meter_dB > min_dB_to_display + (x->f_dbperled * j) ) ) { if ( j < tepidLimit ) ledColor = x->f_color_cold; else if ( j < warmLimit ) ledColor = x->f_color_tepid; else if ( j < hotLimit ) ledColor = x->f_color_warm; else ledColor = x->f_color_hot; jgraphics_set_source_jrgba(g, &ledColor); jgraphics_set_line_width(g, ledMargin); if (nLoudSpeak > 1) { if ( nLoudSpeak < 24 && (channelWidth > 14.5 )) { tmpdeg1 = 0, tmpdeg2 = 0, tmprad = 0; if (x->f_direction == 0) // inside { tmpdeg1 = deg1 + (0.01 * (j+4) * x->f_metersize); tmpdeg2 = deg2 - (0.01 * (j+4) * x->f_metersize); tmprad = x->f_rayonExt - (j*ledOffset) - ledMargin - 2; } else // outside { tmpdeg1 = deg1 + (0.01 * (nbLed+3-(j)) * x->f_metersize); tmpdeg2 = deg2 - (0.01 * (nbLed+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 { 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); } else { break; } } } if(x->f_meter->getPlanewaveOverLed(i)) { jgraphics_set_source_jrgba(g, &x->f_color_over); jgraphics_set_line_width(g, ledMargin); if (nLoudSpeak > 1) { if ( nLoudSpeak < 24 && (channelWidth > 14.5 )) { double tmpdeg1 = 0, tmpdeg2 = 0, tmprad = 0; if (x->f_direction == 0) // inside { tmpdeg1 = deg1 + (0.01 * (nbLed+1) * x->f_metersize); tmpdeg2 = deg2 - (0.01 * (nbLed+1) * x->f_metersize); tmprad = x->f_rayonInt + ledMargin + 1; } else // outside { tmpdeg1 = deg1+(0.008 * 3 * x->f_metersize); tmpdeg2 = deg2-(0.008 * 3 * x->f_metersize); tmprad = x->f_rayonExt - ledMargin - 1; } if (tmpdeg1 < tmpdeg2) jgraphics_arc(g, 0, 0, tmprad, tmpdeg1, tmpdeg2); else jgraphics_arc_negative(g, 0, 0, tmprad, tmpdeg1, tmpdeg2); } else { if (x->f_direction == 0) // inside jgraphics_arc_negative(g, 0, 0, x->f_rayonInt + ledMargin + 1, deg2, deg1); else // outside jgraphics_arc_negative(g, 0, 0, x->f_rayonExt - ledMargin - 1, deg2, deg1); } } else { if (x->f_direction == 0) jgraphics_arc(g, 0, 0, x->f_rayonInt + ledMargin, 0, HOA_2PI); else jgraphics_arc(g, 0, 0, x->f_rayonExt - ledMargin, 0, HOA_2PI); } jgraphics_stroke(g); } jgraphics_rotate(g, degToRad(-rotateAngle)); } jbox_end_layer((t_object*)x, view, hoa_sym_leds_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_leds_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.); }
void draw_harmonics(t_hoa_3d_scope *x, t_object *view, t_rect *rect) { t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_harmonics_layer, rect->width, rect->height); if (g) { char pathLength; t_jmatrix transform; t_jrgba color_pos; t_jrgba color_neg; t_jrgba black = rgba_addContrast(x->f_color_bg, -contrast_black); t_jrgba white = rgba_addContrast(x->f_color_bg, contrast_white); jgraphics_rotate(g, HOA_PI); jgraphics_set_line_width(g, 1); jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); for(ulong j = 0; j < x->f_scope->getNumberOfRows() * 0.5; j++) { pathLength = 0; double constrast = (j - x->f_scope->getNumberOfRows() * 0.5) / (double)x->f_scope->getNumberOfRows(); color_pos = rgba_addContrast(x->f_color_ph, constrast); color_neg = rgba_addContrast(x->f_color_nh, constrast); jgraphics_set_source_jrgba(g, &color_pos); double elev = x->f_scope->getPointElevation(j); for(int i = 0; i < x->f_scope->getNumberOfColumns(); i++) { double azim = x->f_scope->getPointAzimuth(i); double value = x->f_scope->getPointValue(j, i); if(value >= 0) { value *= x->f_radius; if(!pathLength) { jgraphics_move_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); pathLength++; } else { jgraphics_line_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); } } } jgraphics_close_path(g); if(pathLength) jgraphics_fill(g); pathLength = 0; jgraphics_set_source_jrgba(g, &color_neg); for(int i = 0; i < x->f_scope->getNumberOfColumns(); i++) { double azim = x->f_scope->getPointAzimuth(i); double value = x->f_scope->getPointValue(j, i); if(value < 0) { value *= -x->f_radius; if(!pathLength) { jgraphics_move_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); pathLength++; } else { jgraphics_line_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); } } } jgraphics_close_path(g); if(pathLength) jgraphics_fill(g); } double angle, x1, x2, y1, y2, cosa, sina; for(int i = 0; i < (x->f_order * 2 + 2) ; i++) { angle = ((double)(i - 0.5) / (x->f_order * 2 + 2) * HOA_2PI); cosa = cos(angle); sina = sin(angle); x1 = cosa * x->f_radius * 0.2; y1 = sina * x->f_radius * 0.2; x2 = cosa * x->f_radius; y2 = sina * x->f_radius; jgraphics_move_to(g, x1, y1); jgraphics_line_to(g, x2, y2); jgraphics_set_line_width(g, 3); jgraphics_set_source_jrgba(g, &white); jgraphics_stroke(g); jgraphics_set_source_jrgba(g, &black); jgraphics_set_line_width(g, 1); jgraphics_stroke(g); } for(int i = 5; i > 0; i--) { jgraphics_set_line_width(g, 3); jgraphics_set_source_jrgba(g, &white); jgraphics_arc(g, 0, 0, (double)i * 0.2 * x->f_radius, 0., HOA_2PI); jgraphics_stroke(g); jgraphics_set_line_width(g, 1); jgraphics_set_source_jrgba(g, &black); jgraphics_stroke(g); } for(ulong j = (ulong)(x->f_scope->getNumberOfRows() * 0.5); j < x->f_scope->getNumberOfRows(); j++) { // positive harmonics pathLength = 0; double constrast = (j - x->f_scope->getNumberOfRows() * 0.5) / (double)x->f_scope->getNumberOfRows(); color_pos = rgba_addContrast(x->f_color_ph, constrast); color_neg = rgba_addContrast(x->f_color_nh, constrast); jgraphics_set_source_jrgba(g, &color_pos); double elev = x->f_scope->getPointElevation(j); for(int i = 0; i < x->f_scope->getNumberOfColumns(); i++) { double azim = x->f_scope->getPointAzimuth(i); double value = x->f_scope->getPointValue(j, i); if(value >= 0) { value *= x->f_radius; if(!pathLength) { jgraphics_move_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); pathLength++; } else { jgraphics_line_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); } } } jgraphics_close_path(g); if(pathLength) jgraphics_fill(g); pathLength = 0; // negative harmonics jgraphics_set_source_jrgba(g, &color_neg); for(int i = 0; i < x->f_scope->getNumberOfColumns(); i++) { double azim = x->f_scope->getPointAzimuth(i); double value = x->f_scope->getPointValue(j, i); if(value < 0) { value *= -x->f_radius; if(!pathLength) { jgraphics_move_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); pathLength++; } else { jgraphics_line_to(g, Math<double>::abscissa(value, azim,elev), Math<double>::ordinate(value, azim, elev)); } } } jgraphics_close_path(g); if(pathLength) jgraphics_fill(g); } jbox_end_layer((t_object*)x, view, hoa_sym_harmonics_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_harmonics_layer, 0., 0.); }