bool vertex_cache::move_to_distance(double distance) { if (current_segment_ == current_subpath_->vector.end()) return false; double position_in_segment = position_in_segment_ + distance; if (position_in_segment < .0 || position_in_segment >= current_segment_->length) { // If there isn't enough distance left on this segment // then we need to search until we find the line segment that ends further than distance away double abs_distance = std::abs(distance); double new_abs_distance = .0; pixel_position inner_pos; // Inside circle. pixel_position outer_pos; // Outside circle. position_ -= position_in_segment_; if (distance > .0) { do { position_ += current_segment_->length; if (!next_segment()) return false; new_abs_distance = (current_position_ - current_segment_->pos).length(); } while (new_abs_distance < abs_distance); inner_pos = segment_starting_point_; outer_pos = current_segment_->pos; } else { do { if (!previous_segment()) return false; position_ -= current_segment_->length; new_abs_distance = (current_position_ - segment_starting_point_).length(); } while (new_abs_distance < abs_distance); inner_pos = current_segment_->pos; outer_pos = segment_starting_point_; } find_line_circle_intersection(current_position_.x, current_position_.y, abs_distance, inner_pos.x, inner_pos.y, outer_pos.x, outer_pos.y, current_position_.x, current_position_.y); position_in_segment_ = (current_position_ - segment_starting_point_).length(); position_ += position_in_segment_; } else { position_ += distance; distance += position_in_segment_; double factor = distance / current_segment_->length; position_in_segment_ = distance; current_position_ = segment_starting_point_ + (current_segment_->pos - segment_starting_point_) * factor; } return true; }
/// Initializes the complete intro direction. /// /// \param data Data blob to initialize from. void initialize(const int16_t *data) { const int16_t* iter = data; for(;;) { m_scenes.push_back(new Scene(iter)); iter = next_segment(next_segment(iter + 4)); if(Spline::is_segment_end(iter)) { break; } } }
static void get_next_segment(void) { int propseg; do { propseg = 1; segtype = next_segment(); currseg = segment_pos(); put_seg_desc(); switch(segtype) { case SEG_ERROR: case SEG_END: stop_playing(); break; case SEG_STOP: pause_playing(); put_msg(" * Tape paused; Press Ctrl-o to restart * "); break; case SEG_SKIP: propseg = 0; break; case SEG_GRP_BEG: ingroup = 1; propseg = 0; break; case SEG_GRP_END: ingroup = 0; propseg = 0; break; } } while(!propseg); lastdatak = 0; }
bool vertex_cache::move(double length) { if (current_segment_ == current_subpath_->vector.end()) return false; position_ += length; length += position_in_segment_; while (length >= current_segment_->length) { length -= current_segment_->length; if (!next_segment()) return false; //Skip all complete segments } while (length < 0) { if (!previous_segment()) return false; length += current_segment_->length; } double factor = length / current_segment_->length; position_in_segment_ = length; current_position_ = segment_starting_point_ + (current_segment_->pos - segment_starting_point_) * factor; return true; }
/* send a request to the dive computer and collect the answer */ static bool uemis_get_answer(const char *path, char *request, int n_param_in, int n_param_out, const char **error_text) { int i = 0, file_length; char sb[BUFLEN]; char fl[13]; char tmp[101]; const char *what = translate("gettextFromC", "data"); bool searching = true; bool assembling_mbuf = false; bool ismulti = false; bool found_answer = false; bool more_files = true; bool answer_in_mbuf = false; char *ans_path; int ans_file; int timeout = UEMIS_LONG_TIMEOUT; reqtxt_file = subsurface_open(reqtxt_path, O_RDWR | O_CREAT, 0666); snprintf(sb, BUFLEN, "n%04d12345678", filenr); str_append_with_delim(sb, request); for (i = 0; i < n_param_in; i++) str_append_with_delim(sb, param_buff[i]); if (!strcmp(request, "getDivelogs") || !strcmp(request, "getDeviceData") || !strcmp(request, "getDirectory") || !strcmp(request, "getDivespot") || !strcmp(request, "getDive")) { answer_in_mbuf = true; str_append_with_delim(sb, ""); if (!strcmp(request, "getDivelogs")) what = translate("gettextFromC", "divelog entry id"); else if (!strcmp(request, "getDivespot")) what = translate("gettextFromC", "divespot data id"); else if (!strcmp(request, "getDive")) what = translate("gettextFromC", "more data dive id"); } str_append_with_delim(sb, ""); file_length = strlen(sb); snprintf(fl, 10, "%08d", file_length - 13); memcpy(sb + 5, fl, strlen(fl)); #if UEMIS_DEBUG & 1 fprintf(debugfile, "::w req.txt \"%s\"\n", sb); #endif if (write(reqtxt_file, sb, strlen(sb)) != strlen(sb)) { *error_text = translate("gettextFromC", ERR_FS_SHORT_WRITE); return false; } if (!next_file(number_of_files)) { *error_text = translate("gettextFromC", ERR_FS_FULL); more_files = false; } trigger_response(reqtxt_file, "n", filenr, file_length); usleep(timeout); mbuf = NULL; mbuf_size = 0; while (searching || assembling_mbuf) { if (import_thread_cancelled) return false; progress_bar_fraction = filenr / 4000.0; snprintf(fl, 13, "ANS%d.TXT", filenr - 1); ans_path = build_filename(build_filename(path, "ANS"), fl); ans_file = subsurface_open(ans_path, O_RDONLY, 0666); read(ans_file, tmp, 100); close(ans_file); #if UEMIS_DEBUG & 8 tmp[100] = '\0'; fprintf(debugfile, "::t %s \"%s\"\n", ans_path, tmp); #elif UEMIS_DEBUG & 4 char pbuf[4]; pbuf[0] = tmp[0]; pbuf[1] = tmp[1]; pbuf[2] = tmp[2]; pbuf[3] = 0; fprintf(debugfile, "::t %s \"%s...\"\n", ans_path, pbuf); #endif free(ans_path); if (tmp[0] == '1') { searching = false; if (tmp[1] == 'm') { assembling_mbuf = true; ismulti = true; } if (tmp[2] == 'e') assembling_mbuf = false; if (assembling_mbuf) { if (!next_file(number_of_files)) { *error_text = translate("gettextFromC", ERR_FS_FULL); more_files = false; assembling_mbuf = false; } reqtxt_file = subsurface_open(reqtxt_path, O_RDWR | O_CREAT, 0666); trigger_response(reqtxt_file, "n", filenr, file_length); } } else { if (!next_file(number_of_files - 1)) { *error_text = translate("gettextFromC", ERR_FS_FULL); more_files = false; assembling_mbuf = false; searching = false; } reqtxt_file = subsurface_open(reqtxt_path, O_RDWR | O_CREAT, 0666); trigger_response(reqtxt_file, "r", filenr, file_length); uemis_increased_timeout(&timeout); } if (ismulti && more_files && tmp[0] == '1') { int size; snprintf(fl, 13, "ANS%d.TXT", assembling_mbuf ? filenr - 2 : filenr - 1); ans_path = build_filename(build_filename(path, "ANS"), fl); ans_file = subsurface_open(ans_path, O_RDONLY, 0666); size = bytes_available(ans_file); if (size > 3) { char *buf; int r; if (lseek(ans_file, 3, SEEK_CUR) == -1) goto fs_error; buf = malloc(size - 2); if ((r = read(ans_file, buf, size - 3)) != size - 3) { free(buf); goto fs_error; } buf[r] = '\0'; buffer_add(&mbuf, &mbuf_size, buf); show_progress(buf, what); free(buf); param_buff[3]++; } close(ans_file); timeout = UEMIS_TIMEOUT; usleep(UEMIS_TIMEOUT); } } if (more_files) { int size = 0, j = 0; char *buf = NULL; if (!ismulti) { snprintf(fl, 13, "ANS%d.TXT", filenr - 1); ans_path = build_filename(build_filename(path, "ANS"), fl); ans_file = subsurface_open(ans_path, O_RDONLY, 0666); size = bytes_available(ans_file); if (size > 3) { int r; if (lseek(ans_file, 3, SEEK_CUR) == -1) goto fs_error; buf = malloc(size - 2); if ((r = read(ans_file, buf, size - 3)) != size - 3) { free(buf); goto fs_error; } buf[r] = '\0'; buffer_add(&mbuf, &mbuf_size, buf); show_progress(buf, what); #if UEMIS_DEBUG & 8 fprintf(debugfile, "::r %s \"%s\"\n", ans_path, buf); #endif } size -= 3; close(ans_file); free(ans_path); } else { ismulti = false; } #if UEMIS_DEBUG & 8 fprintf(debugfile, ":r: %s\n", buf); #endif if (!answer_in_mbuf) for (i = 0; i < n_param_out && j < size; i++) param_buff[i] = next_segment(buf, &j, size); found_answer = true; free(buf); } #if UEMIS_DEBUG & 1 for (i = 0; i < n_param_out; i++) fprintf(debugfile, "::: %d: %s\n", i, param_buff[i]); #endif return found_answer; fs_error: close (ans_file); return false; }