float BokehImageOperation::isInsideBokeh(float distance, float x, float y) { float insideBokeh = 0.0f; const float deltaX = x - this->m_center[0]; const float deltaY = y - this->m_center[1]; float closestPoint[2]; float lineP1[2]; float lineP2[2]; float point[2]; point[0] = x; point[1] = y; const float distanceToCenter = len_v2v2(point, this->m_center); const float bearing = (atan2f(deltaX, deltaY) + (float)(M_PI * 2.0)); int flapNumber = (int)((bearing - this->m_flapRadAdd) / this->m_flapRad); detemineStartPointOfFlap(lineP1, flapNumber, distance); detemineStartPointOfFlap(lineP2, flapNumber + 1, distance); closest_to_line_v2(closestPoint, point, lineP1, lineP2); const float distanceLineToCenter = len_v2v2(this->m_center, closestPoint); const float distanceRoundingToCenter = this->m_inverseRounding * distanceLineToCenter + this->m_data->rounding * distance; const float catadioptricDistanceToCenter = distanceRoundingToCenter * this->m_data->catadioptric; if (distanceRoundingToCenter >= distanceToCenter && catadioptricDistanceToCenter <= distanceToCenter) { if (distanceRoundingToCenter - distanceToCenter < 1.0f) { insideBokeh = (distanceRoundingToCenter - distanceToCenter); } else if (this->m_data->catadioptric != 0.0f && distanceToCenter - catadioptricDistanceToCenter < 1.0f) { insideBokeh = (distanceToCenter - catadioptricDistanceToCenter); } else { insideBokeh = 1.0f; } } return insideBokeh; }
static int slide_plane_marker_modal(bContext *C, wmOperator *op, const wmEvent *event) { SpaceClip *sc = CTX_wm_space_clip(C); MovieClip *clip = ED_space_clip_get_clip(sc); SlidePlaneMarkerData *data = (SlidePlaneMarkerData *) op->customdata; float dx, dy, mdelta[2]; int next_corner_index, prev_corner_index, diag_corner_index; const float *next_corner, *prev_corner, *diag_corner; float next_edge[2], prev_edge[2], next_diag_edge[2], prev_diag_edge[2]; switch (event->type) { case LEFTCTRLKEY: case RIGHTCTRLKEY: case LEFTSHIFTKEY: case RIGHTSHIFTKEY: if (ELEM(event->type, LEFTSHIFTKEY, RIGHTSHIFTKEY)) { data->accurate = event->val == KM_PRESS; } /* fall-through */ case MOUSEMOVE: mdelta[0] = event->mval[0] - data->previous_mval[0]; mdelta[1] = event->mval[1] - data->previous_mval[1]; dx = mdelta[0] / data->width / sc->zoom; dy = mdelta[1] / data->height / sc->zoom; if (data->accurate) { dx /= 5.0f; dy /= 5.0f; } data->corner[0] = data->previous_corner[0] + dx; data->corner[1] = data->previous_corner[1] + dy; /* prev_edge (Corner 3, current) <----------------------- (Corner 2, previous) | ^ | | | | | | next_edge | | next_diag_edge | | | | | | v | (Corner 0, next) -----------------------> (Corner 1, diagonal) prev_diag_edge */ next_corner_index = (data->corner_index + 1) % 4; prev_corner_index = (data->corner_index + 3) % 4; diag_corner_index = (data->corner_index + 2) % 4; next_corner = data->plane_marker->corners[next_corner_index]; prev_corner = data->plane_marker->corners[prev_corner_index]; diag_corner = data->plane_marker->corners[diag_corner_index]; sub_v2_v2v2(next_edge, next_corner, data->corner); sub_v2_v2v2(prev_edge, data->corner, prev_corner); sub_v2_v2v2(next_diag_edge, prev_corner, diag_corner); sub_v2_v2v2(prev_diag_edge, diag_corner, next_corner); if (cross_v2v2(prev_edge, next_edge) < 0.0f) { closest_to_line_v2(data->corner, data->corner, prev_corner, next_corner); } if (cross_v2v2(next_diag_edge, prev_edge) < 0.0f) { closest_to_line_v2(data->corner, data->corner, prev_corner, diag_corner); } if (cross_v2v2(next_edge, prev_diag_edge) < 0.0f) { closest_to_line_v2(data->corner, data->corner, next_corner, diag_corner); } data->previous_mval[0] = event->mval[0]; data->previous_mval[1] = event->mval[1]; copy_v2_v2(data->previous_corner, data->corner); DAG_id_tag_update(&sc->clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, NULL); break; case LEFTMOUSE: case RIGHTMOUSE: if (event->type == data->event_type && event->val == KM_RELEASE) { /* Marker is now keyframed. */ data->plane_marker->flag &= ~PLANE_MARKER_TRACKED; slide_plane_marker_update_homographies(sc, data); free_slide_plane_marker_data(op->customdata); clip_tracking_show_cursor(C); DAG_id_tag_update(&sc->clip->id, 0); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_FINISHED; } break; case ESCKEY: cancel_mouse_slide_plane_marker(op->customdata); free_slide_plane_marker_data(op->customdata); clip_tracking_show_cursor(C); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); return OPERATOR_CANCELLED; } return OPERATOR_RUNNING_MODAL; }