// // LaserBoy !!! // // by James Lehman // Extra Stimulus Inc./ // james@akrobiz.com // // began: October 2003 // // Copyright 2003 to 2024 James Lehman. // This source is distributed under the terms of the GNU General Public License. // // LaserBoy_frame_set.cpp is part of LaserBoy. // // LaserBoy is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // LaserBoy is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with LaserBoy. If not, see . // //############################################################################ #include "LaserBoy_SDL_GUI.hpp" //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::operator += (const LaserBoy_frame& frame) { if(p_space->show_effects_generation) { bmp_copy(p_space->p_bmp(), &(p_space->background)); frame.render(0, p_space->p_bmp()); p_space->p_GUI->display_space(); } push_back(frame); shrink_to_fit(); return *this; } //############################################################################ bool LaserBoy_frame_set::font_index_to_frames(const string& font_name, string& report, bool cleanup ) { if(size()) { size_t i; u32string unicode; if(!get_utf8_index(unicode, LASERBOY_FONT_SHARE + font_name + ".utf8")) { if(!get_utf8_index(unicode, LASERBOY_UTF8_SHARE + font_name + ".utf8")) { report = font_name + ".utf8 file not found."; frame_set_error |= LASERBOY_FILE_OPEN_FAILED; return false; } } if(cleanup) { if(unicode.size() < size()) { for(i = 0; i < unicode.size(); i++) at(i).name = as_hex_string(unicode[i]); for(i = unicode.size(); i < size(); i++) at(i).name = "ffffffff"; return true; } else if(unicode.size() > size()) { LaserBoy_frame frame; for(i = 0; i < size(); i++) at(i).name = as_hex_string(unicode[i]); for(i = size(); i < unicode.size(); i++) { frame = LaserBoy_real_segment(unicode[i]); frame.name = as_hex_string(unicode[i]); push_back(frame); } return true; } else { for(i = 0; i < unicode.size(); i++) at(i).name = as_hex_string(unicode[i]); return true; } } else { if(unicode.size() > size()) { report = font_name + ".utf8 chars is greater than frames."; frame_set_error |= LASERBOY_QUANTITY_DATA_MISSMATCH; return false; } else if(unicode.size() < size()) { report = font_name + ".utf8 chars is less than frames."; frame_set_error |= LASERBOY_QUANTITY_DATA_MISSMATCH; return false; } for(i = 0; i < unicode.size(); i++) at(i).name = as_hex_string(unicode[i]); return true; } } report = "empty frame_set."; frame_set_error |= LASERBOY_NO_FRAMES_FOUND; return false; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::get_unicode_index(u32string& characters) { if(size()) { size_t i; double number; char buffer[5]; u32string sorted; LaserBoy_Error_Code ret = LASERBOY_OK; buffer[4] = '\0'; characters.clear(); for(i = 0; i < size(); i++) { if(hex_string(at(i).name, number)) characters.push_back((char32_t)number); else return LASERBOY_INVALID_UNICODE; } sorted = characters; sort(sorted.begin(), sorted.end()); for(i = 1; i < sorted.size(); i++) { if(sorted[i - 1] == sorted[i]) { ret = LASERBOY_REDUNDANT_UNICODE; break; } } return ret; } else return LASERBOY_NO_FRAMES_FOUND; } //############################################################################ bool LaserBoy_frame_set::save_utf8_frame_index(const string& utf8_path, string& report, bool cleanup ) { if(size()) { bool has_diacritics = false; size_t i; double number; char buffer[5]; u32string characters; std::ofstream out(utf8_path.c_str(), ios::out); if(!out.good()) return false; buffer[4] = '\0'; for(i = 0; i < size(); i++) { if(hex_string(at(i).name, number)) characters.push_back((char32_t)number); else if(!cleanup) { report = at(i).name + "is not a unicode name."; frame_set_error |= LASERBOY_INVALID_UNICODE; return false; } else { report = at(i).name + "is not a unicode name."; frame_set_error |= LASERBOY_INVALID_UNICODE; characters.push_back((char32_t)0xffffffff); } } if(characters.size()) { for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); if(is_diacritic(characters[i])) { has_diacritics = true; out << ' '; } out << buffer; if(is_diacritic(characters[i])) out << ' '; } // end for(i = 0; i < characters.size(); i++) out << endl << endl; out << "........................" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << buffer; out << ' '; } out << endl << endl; if(has_diacritics) { out << "........................" << endl; out << endl; out << utf8_path << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; } out << endl; out << "........................" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << characters[i]; if(is_diacritic(characters[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < characters.size(); i++) out << "........................" << endl; out.close(); return true; } // end if(characters.size()) report = "no unicode frame names found."; frame_set_error |= LASERBOY_EMPTY_STRING_ERROR; return false; } report = "empty frame_set."; frame_set_error |= LASERBOY_NO_FRAMES_FOUND; return false; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::order_frames_by_name(string& report, bool cleanup) { if(size()) { LaserBoy_Error_Code ret = LASERBOY_OK; size_t i, j; double number; u32string unicode, unique; LaserBoy_frame_set sorted; for(i = 0; i < size(); i++) { at(i).is_selected = false; if(hex_string(at(i).name, number)) unicode.push_back((char32_t)number); else { report = "frame name " + at(i).name + " is not a unicode name."; return LASERBOY_INVALID_UNICODE; } } sort(unicode.begin(), unicode.end()); if(cleanup) { unique.push_back(unicode.at(0)); for(i = 1; i < unicode.size(); i++) { if(unique.back() != unicode.at(i)) unique.push_back(unicode.at(i)); } } else { for(i = 1; i < unicode.size(); i++) { if(unicode.at(i - 1) == unicode.at(i)) { report = "2 frames have the same name (" + as_hex_string(unicode[i]) + ")."; return LASERBOY_REDUNDANT_UNICODE; } } unique = unicode; } for(i = 0; i < unique.size(); i++) { for(j = 0; j < size(); j++) { if( !at(j).is_selected && at(j).name == as_hex_string(unique[i]) ) { at(j).is_selected = true; sorted += at(j); break; } } } *this = sorted; return ret; } report = "empty frame_set."; return LASERBOY_NO_FRAMES_FOUND; } //############################################################################ void LaserBoy_frame_set::render_frame(const int& index, struct LaserBoy_bmp *bmp) const { bool rotate_view = (p_space->view_angle != 0.0), offset_view = (p_space->view_offset != 0 ), scale_view = (p_space->view_scale != 1.0); int bmp_center = ( (p_space->show_quad_view) ? (bmp->yres / 4) : (bmp->yres / 2) ), bmp_3X_center = bmp_center * 3, bigger = ( ((p_space->show_bridge) ? (at(index).bridge.size()) : (0)) > ((p_space->show_coda) ? (at(index).coda.size()) : (0)) ) ? ((p_space->show_bridge) ? (at(index).bridge.size()) : (0)) : ((p_space->show_coda) ? (at(index).coda.size()) : (0)); u_int bmp_bounds , bmp_clipping, bmp_blank , egg_color , spider_color, cursor_line = (bmp->yres >= 1024) ? (2) : (1), bmp_bg_color = bmp->make_rgb(p_space->bg_color.r, p_space->bg_color.g, p_space->bg_color.b ); double deep = LASERBOY_SHORT_SPAN, half_deep = deep / 2.0, scale = ( (p_space->show_quad_view) ? (bmp->yres / (deep * 2)) : (bmp->yres / deep) ), z_depth_scale = deep / ( at(index).size() + ((p_space->show_intro) ? (at(index).intro.size()) : (0)) + bigger ), z_depth_body_offset = half_deep - ( z_depth_scale * ((p_space->show_intro) ? (at(index).intro.size()) : (0)) ); LaserBoy_3D_double _0, _1; LaserBoy_color bit_masked; //------------------------------------------------------------------------ bmp_bounds = bmp->make_rgb(p_space->rendered_bounds.r, p_space->rendered_bounds.g, p_space->rendered_bounds.b ); bmp_clipping = bmp->make_rgb(p_space->rendered_clipping.r, p_space->rendered_clipping.g, p_space->rendered_clipping.b ); bmp_blank = bmp->make_rgb(p_space->rendered_blank.r, p_space->rendered_blank.g, p_space->rendered_blank.b ); //------------------------------------------------------------------------ // p_space->clean_screen(); //------------------------------------------------------------------------ if(p_space->show_fixed_bounds && !p_space->destructive_clipping) { if(p_space->show_quad_view) { bmp_put_rectangle(bmp, 0, 0, bmp->yres / 2 - 1, bmp->yres / 2 - 1, bmp_bounds, 0 ); bmp_put_rectangle(bmp, bmp->yres / 2, 0, bmp->yres - 1, bmp->yres / 2 - 1, bmp_bounds, 0 ); bmp_put_rectangle(bmp, 0, bmp->yres / 2, bmp->yres / 2 - 1, bmp->yres - 1, bmp_bounds, 0 ); bmp_put_rectangle(bmp, bmp->yres / 2, bmp->yres / 2, bmp->yres - 1, bmp->yres - 1, bmp_bounds, 0 ); } // end if(p_space->show_quad_view) else bmp_put_rectangle(bmp, 0, 0, bmp->yres - 1, bmp->yres - 1, bmp_bounds, 0 ); } // end if(p_space->show_fixed_bounds) //------------------------------------------------------------------------ if(p_space->destructive_clipping) { if(p_space->show_quad_view) { bmp_put_thick_rectangle(bmp, 0, 0, bmp->yres / 2 - 1, bmp->yres / 2 - 1, bmp_clipping, 2 ); bmp_put_thick_rectangle(bmp, bmp->yres / 2, 0, bmp->yres - 1, bmp->yres / 2 - 1, bmp_clipping, 2 ); bmp_put_thick_rectangle(bmp, 0, bmp->yres / 2, bmp->yres / 2 - 1, bmp->yres - 1, bmp_clipping, 2 ); bmp_put_thick_rectangle(bmp, bmp->yres / 2, bmp->yres / 2, bmp->yres - 1, bmp->yres - 1, bmp_clipping, 2 ); } // end if(p_space->show_quad_view) else bmp_put_thick_rectangle(bmp, 0, 0, bmp->yres - 1, bmp->yres - 1, bmp_clipping, 2 ); } // end if(p_space->destructive_clipping) //------------------------------------------------------------------------ if(p_space->show_fixed_origin) { if(p_space->show_quad_view) { bmp_put_line_fast(bmp, 0, bmp->yres / 4, bmp->yres - 1, bmp->yres / 4, bmp_bounds ); bmp_put_line_fast(bmp, 0, bmp->yres / 4 * 3, bmp->yres - 1, bmp->yres / 4 * 3, bmp_bounds ); bmp_put_line_fast(bmp, bmp->yres / 4, 0, bmp->yres / 4, bmp->yres - 1, bmp_bounds ); bmp_put_line_fast(bmp, bmp->yres / 4 * 3, 0, bmp->yres / 4 * 3, bmp->yres - 1, bmp_bounds ); } else { bmp_put_line_fast(bmp, 0, bmp->yres / 2, bmp->yres - 1, bmp->yres / 2, bmp_bounds ); bmp_put_line_fast(bmp, bmp->yres / 2, 0, bmp->yres / 2, bmp->yres - 1, bmp_bounds ); } } //------------------------------------------------------------------------ if(p_space->show_floating_axis) { LaserBoy_3D_double x1, x2, y1, y2, z1, z2; x1.x = LASERBOY_MIN_SHORT; x2.x = LASERBOY_MAX_SHORT; y1.y = LASERBOY_MIN_SHORT; y2.y = LASERBOY_MAX_SHORT; z1.z = LASERBOY_MIN_SHORT; z2.z = LASERBOY_MAX_SHORT; if(rotate_view) { x1 = rotate_vertex(x1, p_space->view_angle); x2 = rotate_vertex(x2, p_space->view_angle); y1 = rotate_vertex(y1, p_space->view_angle); y2 = rotate_vertex(y2, p_space->view_angle); z1 = rotate_vertex(z1, p_space->view_angle); z2 = rotate_vertex(z2, p_space->view_angle); } if(offset_view) { x1 += p_space->view_offset; x2 += p_space->view_offset; y1 += p_space->view_offset; y2 += p_space->view_offset; z1 += p_space->view_offset; z2 += p_space->view_offset; } if(scale_view) { x1 *= p_space->view_scale; x2 *= p_space->view_scale; y1 *= p_space->view_scale; y2 *= p_space->view_scale; z1 *= p_space->view_scale; z2 *= p_space->view_scale; } // X axis bmp_put_thick_line_fast(bmp, (int)(x1.x * scale) + bmp_center , bmp->yres - ((int)(x1.y * scale) + bmp_center) , (int)(x2.x * scale) + bmp_center , bmp->yres - ((int)(x2.y * scale) + bmp_center) , bmp_bounds , p_space->rendered_line_width ); // X axis icon bmp_put_thick_line_fast(bmp, (int)((x2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((x2.y - 500) * scale) + bmp_center) , (int)((x2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((x2.y + 500) * scale) + bmp_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((x2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((x2.y + 500) * scale) + bmp_center) , (int)((x2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((x2.y - 500) * scale) + bmp_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); // Y axis bmp_put_thick_line_fast(bmp, (int)(y1.x * scale) + bmp_center , bmp->yres - ((int)(y1.y * scale) + bmp_center) , (int)(y2.x * scale) + bmp_center , bmp->yres - ((int)(y2.y * scale) + bmp_center) , bmp_bounds , p_space->rendered_line_width ); // Y axis icon bmp_put_thick_line_fast(bmp, (int)((y2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((y2.y + 500) * scale) + bmp_center) , (int)((y2.x ) * scale) + bmp_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((y2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((y2.y + 500) * scale) + bmp_center) , (int)((y2.x ) * scale) + bmp_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((y2.x ) * scale) + bmp_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_center) , (int)((y2.x ) * scale) + bmp_center , bmp->yres - ((int)((y2.y - 500) * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); // Z axis bmp_put_thick_line_fast(bmp, (int)(z1.x * scale) + bmp_center , bmp->yres - ((int)(z1.y * scale) + bmp_center) , (int)(z2.x * scale) + bmp_center , bmp->yres - ((int)(z2.y * scale) + bmp_center) , bmp_bounds , p_space->rendered_line_width ); if(p_space->show_Z_as_order) { // T axis icon bmp_put_thick_line_fast(bmp, (int)((z2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , (int)((z2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , bmp->make_rgb(255,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.x ) * scale) + bmp_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , (int)((z2.x ) * scale) + bmp_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , bmp->make_rgb(255,255,0) , p_space->rendered_line_width ); } else { // Z axis icon bmp_put_thick_line_fast(bmp, (int)((z2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , (int)((z2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , (int)((z2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , (int)((z2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); } if(p_space->show_quad_view) { x1 = x2 = y1 = y2 = z1 = z2 = 0; x1.x = LASERBOY_MIN_SHORT; x2.x = LASERBOY_MAX_SHORT; y1.y = LASERBOY_MIN_SHORT; y2.y = LASERBOY_MAX_SHORT; z1.z = LASERBOY_MIN_SHORT; z2.z = LASERBOY_MAX_SHORT; // X axis front bmp_put_thick_line_fast(bmp, (int)(x1.x * scale) + bmp_3X_center , bmp->yres - ((int)(x1.y * scale) + bmp_3X_center) , (int)(x2.x * scale) + bmp_3X_center , bmp->yres - ((int)(x2.y * scale) + bmp_3X_center) , bmp_bounds , p_space->rendered_line_width ); // X axis icon front bmp_put_thick_line_fast(bmp, (int)((x2.x - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((x2.y - 500) * scale) + bmp_3X_center) , (int)((x2.x + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((x2.y + 500) * scale) + bmp_3X_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((x2.x - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((x2.y + 500) * scale) + bmp_3X_center) , (int)((x2.x + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((x2.y - 500) * scale) + bmp_3X_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); // Y axis front bmp_put_thick_line_fast(bmp, (int)(y1.x * scale) + bmp_3X_center , bmp->yres - ((int)(y1.y * scale) + bmp_3X_center) , (int)(y2.x * scale) + bmp_3X_center , bmp->yres - ((int)(y2.y * scale) + bmp_3X_center) , bmp_bounds , p_space->rendered_line_width ); // Y axis icon front bmp_put_thick_line_fast(bmp, (int)((y2.x - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y + 500) * scale) + bmp_3X_center) , (int)((y2.x ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_3X_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((y2.x + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y + 500) * scale) + bmp_3X_center) , (int)((y2.x ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_3X_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((y2.x ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_3X_center) , (int)((y2.x ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y - 500) * scale) + bmp_3X_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); // X axis top bmp_put_thick_line_fast(bmp, (int)(x1.x * scale) + bmp_center , bmp->yres - ((int)(x1.z * scale) + bmp_3X_center) , (int)(x2.x * scale) + bmp_center , bmp->yres - ((int)(x2.z * scale) + bmp_3X_center) , bmp_bounds , p_space->rendered_line_width ); // X axis icon top bmp_put_thick_line_fast(bmp, (int)((x2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((x2.z - 500) * scale) + bmp_3X_center) , (int)((x2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((x2.z + 500) * scale) + bmp_3X_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((x2.x - 500) * scale) + bmp_center , bmp->yres - ((int)((x2.z + 500) * scale) + bmp_3X_center) , (int)((x2.x + 500) * scale) + bmp_center , bmp->yres - ((int)((x2.z - 500) * scale) + bmp_3X_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); // Z axis top bmp_put_thick_line_fast(bmp, (int)(z1.x * -scale) + bmp_center , bmp->yres - ((int)(z1.z * -scale) + bmp_3X_center) , (int)(z2.x * -scale) + bmp_center , bmp->yres - ((int)(z2.z * -scale) + bmp_3X_center) , bmp_bounds , p_space->rendered_line_width ); // Z axis icon top bmp_put_thick_line_fast(bmp, (int)((z2.x - 500) * -scale) + bmp_center , bmp->yres - ((int)((z2.z + 500) * -scale) + bmp_3X_center) , (int)((z2.x + 500) * -scale) + bmp_center , bmp->yres - ((int)((z2.z + 500) * -scale) + bmp_3X_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.x + 500) * -scale) + bmp_center , bmp->yres - ((int)((z2.z + 500) * -scale) + bmp_3X_center) , (int)((z2.x - 500) * -scale) + bmp_center , bmp->yres - ((int)((z2.z - 500) * -scale) + bmp_3X_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.x - 500) * -scale) + bmp_center , bmp->yres - ((int)((z2.z - 500) * -scale) + bmp_3X_center) , (int)((z2.x + 500) * -scale) + bmp_center , bmp->yres - ((int)((z2.z - 500) * -scale) + bmp_3X_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); // Y axis side bmp_put_thick_line_fast(bmp, (int)(y1.z * scale) + bmp_3X_center , bmp->yres - ((int)(y1.y * scale) + bmp_center) , (int)(y2.z * scale) + bmp_3X_center , bmp->yres - ((int)(y2.y * scale) + bmp_center) , bmp_bounds , p_space->rendered_line_width ); // Y axis icon side bmp_put_thick_line_fast(bmp, (int)((y2.z - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y + 500) * scale) + bmp_center) , (int)((y2.z ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((y2.z + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y + 500) * scale) + bmp_center) , (int)((y2.z ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((y2.z ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y ) * scale) + bmp_center) , (int)((y2.z ) * scale) + bmp_3X_center , bmp->yres - ((int)((y2.y - 500) * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); // Z axis side bmp_put_thick_line_fast(bmp, (int)(z1.z * scale) + bmp_3X_center , bmp->yres - ((int)(z1.y * scale) + bmp_center) , (int)(z2.z * scale) + bmp_3X_center , bmp->yres - ((int)(z2.y * scale) + bmp_center) , bmp_bounds , p_space->rendered_line_width ); // Z axis icon side bmp_put_thick_line_fast(bmp, (int)((z2.z - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , (int)((z2.z + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.z + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((z2.y + 500) * scale) + bmp_center) , (int)((z2.z - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)((z2.z - 500) * scale) + bmp_3X_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , (int)((z2.z + 500) * scale) + bmp_3X_center , bmp->yres - ((int)((z2.y - 500) * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); } } //------------------------------------------------------------------------ if(p_space->show_floating_bounds && !p_space->destructive_clipping) { LaserBoy_3D_double a(LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT), b(LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT), c(LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT), d(LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT), e(LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT), f(LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT), g(LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT), h(LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT); if(rotate_view) { a = rotate_vertex(a, p_space->view_angle); b = rotate_vertex(b, p_space->view_angle); c = rotate_vertex(c, p_space->view_angle); d = rotate_vertex(d, p_space->view_angle); e = rotate_vertex(e, p_space->view_angle); f = rotate_vertex(f, p_space->view_angle); g = rotate_vertex(g, p_space->view_angle); h = rotate_vertex(h, p_space->view_angle); } if(offset_view) { a += p_space->view_offset; b += p_space->view_offset; c += p_space->view_offset; d += p_space->view_offset; e += p_space->view_offset; f += p_space->view_offset; g += p_space->view_offset; h += p_space->view_offset; } if(scale_view) { a *= p_space->view_scale; b *= p_space->view_scale; c *= p_space->view_scale; d *= p_space->view_scale; e *= p_space->view_scale; f *= p_space->view_scale; g *= p_space->view_scale; h *= p_space->view_scale; } a *= scale; b *= scale; c *= scale; d *= scale; e *= scale; f *= scale; g *= scale; h *= scale; bmp_put_line_fast(bmp, (int)a.x + bmp_center , bmp->yres - ((int)a.y + bmp_center) , (int)b.x + bmp_center , bmp->yres - ((int)b.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)b.x + bmp_center , bmp->yres - ((int)b.y + bmp_center) , (int)c.x + bmp_center , bmp->yres - ((int)c.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)c.x + bmp_center , bmp->yres - ((int)c.y + bmp_center) , (int)d.x + bmp_center , bmp->yres - ((int)d.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)d.x + bmp_center , bmp->yres - ((int)d.y + bmp_center) , (int)a.x + bmp_center , bmp->yres - ((int)a.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)a.x + bmp_center , bmp->yres - ((int)a.y + bmp_center) , (int)e.x + bmp_center , bmp->yres - ((int)e.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)b.x + bmp_center , bmp->yres - ((int)b.y + bmp_center) , (int)f.x + bmp_center , bmp->yres - ((int)f.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)c.x + bmp_center , bmp->yres - ((int)c.y + bmp_center) , (int)g.x + bmp_center , bmp->yres - ((int)g.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)d.x + bmp_center , bmp->yres - ((int)d.y + bmp_center) , (int)h.x + bmp_center , bmp->yres - ((int)h.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)e.x + bmp_center , bmp->yres - ((int)e.y + bmp_center) , (int)f.x + bmp_center , bmp->yres - ((int)f.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)f.x + bmp_center , bmp->yres - ((int)f.y + bmp_center) , (int)g.x + bmp_center , bmp->yres - ((int)g.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)g.x + bmp_center , bmp->yres - ((int)g.y + bmp_center) , (int)h.x + bmp_center , bmp->yres - ((int)h.y + bmp_center) , bmp_bounds ); bmp_put_line_fast(bmp, (int)h.x + bmp_center , bmp->yres - ((int)h.y + bmp_center) , (int)e.x + bmp_center , bmp->yres - ((int)e.y + bmp_center) , bmp_bounds ); if(p_space->show_quad_view) { a.x = LASERBOY_MIN_SHORT; a.y = LASERBOY_MIN_SHORT; a.z = 0; b.x = LASERBOY_MAX_SHORT; b.y = LASERBOY_MAX_SHORT; b.z = 0; a *= scale; b *= scale; bmp_put_rectangle(bmp, (int)a.x + bmp_center, (int)a.y + bmp_center, (int)b.x + bmp_center, (int)b.y + bmp_center, bmp_bounds, 0 ); bmp_put_rectangle(bmp, (int)a.x + bmp_3X_center, (int)a.y + bmp_center, (int)b.x + bmp_3X_center, (int)b.y + bmp_center, bmp_bounds, 0 ); bmp_put_rectangle(bmp, (int)a.x + bmp_3X_center, (int)a.y + bmp_3X_center, (int)b.x + bmp_3X_center, (int)b.y + bmp_3X_center, bmp_bounds, 0 ); } } //------------------------------------------------------------------------ if(p_space->destructive_clipping) { u_int thickness = (bmp->yres >= 1024) ? (2) : (1); LaserBoy_3D_double a(LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT), b(LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT), c(LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT), d(LASERBOY_MIN_SHORT, LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT), e(LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT), f(LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MIN_SHORT), g(LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT), h(LASERBOY_MIN_SHORT, LASERBOY_MAX_SHORT, LASERBOY_MAX_SHORT); if(rotate_view) { a = rotate_vertex(a, p_space->view_angle); b = rotate_vertex(b, p_space->view_angle); c = rotate_vertex(c, p_space->view_angle); d = rotate_vertex(d, p_space->view_angle); e = rotate_vertex(e, p_space->view_angle); f = rotate_vertex(f, p_space->view_angle); g = rotate_vertex(g, p_space->view_angle); h = rotate_vertex(h, p_space->view_angle); } if(offset_view) { a += p_space->view_offset; b += p_space->view_offset; c += p_space->view_offset; d += p_space->view_offset; e += p_space->view_offset; f += p_space->view_offset; g += p_space->view_offset; h += p_space->view_offset; } if(scale_view) { a *= p_space->view_scale; b *= p_space->view_scale; c *= p_space->view_scale; d *= p_space->view_scale; e *= p_space->view_scale; f *= p_space->view_scale; g *= p_space->view_scale; h *= p_space->view_scale; } a *= scale; b *= scale; c *= scale; d *= scale; e *= scale; f *= scale; g *= scale; h *= scale; bmp_put_thick_line_fast(bmp, (int)a.x + bmp_center , bmp->yres - ((int)a.y + bmp_center) , (int)b.x + bmp_center , bmp->yres - ((int)b.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)b.x + bmp_center , bmp->yres - ((int)b.y + bmp_center) , (int)c.x + bmp_center , bmp->yres - ((int)c.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)c.x + bmp_center , bmp->yres - ((int)c.y + bmp_center) , (int)d.x + bmp_center , bmp->yres - ((int)d.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)d.x + bmp_center , bmp->yres - ((int)d.y + bmp_center) , (int)a.x + bmp_center , bmp->yres - ((int)a.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)a.x + bmp_center , bmp->yres - ((int)a.y + bmp_center) , (int)e.x + bmp_center , bmp->yres - ((int)e.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)b.x + bmp_center , bmp->yres - ((int)b.y + bmp_center) , (int)f.x + bmp_center , bmp->yres - ((int)f.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)c.x + bmp_center , bmp->yres - ((int)c.y + bmp_center) , (int)g.x + bmp_center , bmp->yres - ((int)g.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)d.x + bmp_center , bmp->yres - ((int)d.y + bmp_center) , (int)h.x + bmp_center , bmp->yres - ((int)h.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)e.x + bmp_center , bmp->yres - ((int)e.y + bmp_center) , (int)f.x + bmp_center , bmp->yres - ((int)f.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)f.x + bmp_center , bmp->yres - ((int)f.y + bmp_center) , (int)g.x + bmp_center , bmp->yres - ((int)g.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)g.x + bmp_center , bmp->yres - ((int)g.y + bmp_center) , (int)h.x + bmp_center , bmp->yres - ((int)h.y + bmp_center) , bmp_clipping , thickness ); bmp_put_thick_line_fast(bmp, (int)h.x + bmp_center , bmp->yres - ((int)h.y + bmp_center) , (int)e.x + bmp_center , bmp->yres - ((int)e.y + bmp_center) , bmp_clipping , thickness ); if(p_space->show_quad_view) { a.x = LASERBOY_MIN_SHORT; a.y = LASERBOY_MIN_SHORT; a.z = 0; b.x = LASERBOY_MAX_SHORT; b.y = LASERBOY_MAX_SHORT; b.z = 0; a *= scale; b *= scale; bmp_put_thick_rectangle(bmp, (int)a.x + bmp_center, (int)a.y + bmp_center, (int)b.x + bmp_center, (int)b.y + bmp_center, bmp_clipping, thickness ); bmp_put_thick_rectangle(bmp, (int)a.x + bmp_3X_center, (int)a.y + bmp_center, (int)b.x + bmp_3X_center, (int)b.y + bmp_center, bmp_clipping, thickness ); bmp_put_thick_rectangle(bmp, (int)a.x + bmp_3X_center, (int)a.y + bmp_3X_center, (int)b.x + bmp_3X_center, (int)b.y + bmp_3X_center, bmp_clipping, thickness ); } } //------------------------------------------------------------------------ if(p_space->show_fulcrum) { LaserBoy_3D_double x1, x2, y1, y2, z1, z2; x1.x = -5000; x2.x = 5000; y1.y = -5000; y2.y = 5000; z1.z = -5000; z2.z = 5000; x1 = x1 += p_space->fulcrum; x2 = x2 += p_space->fulcrum; y1 = y1 += p_space->fulcrum; y2 = y2 += p_space->fulcrum; z1 = z1 += p_space->fulcrum; z2 = z2 += p_space->fulcrum; if(rotate_view) { x1 = rotate_vertex(x1, p_space->view_angle); x2 = rotate_vertex(x2, p_space->view_angle); y1 = rotate_vertex(y1, p_space->view_angle); y2 = rotate_vertex(y2, p_space->view_angle); z1 = rotate_vertex(z1, p_space->view_angle); z2 = rotate_vertex(z2, p_space->view_angle); } if(offset_view) { x1 += p_space->view_offset; x2 += p_space->view_offset; y1 += p_space->view_offset; y2 += p_space->view_offset; z1 += p_space->view_offset; z2 += p_space->view_offset; } if(scale_view) { x1 *= p_space->view_scale; x2 *= p_space->view_scale; y1 *= p_space->view_scale; y2 *= p_space->view_scale; z1 *= p_space->view_scale; z2 *= p_space->view_scale; } bmp_put_thick_line_fast(bmp, (int)(x1.x * scale) + bmp_center , bmp->yres - ((int)(x1.y * scale) + bmp_center) , (int)(x2.x * scale) + bmp_center , bmp->yres - ((int)(x2.y * scale) + bmp_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)(y1.x * scale) + bmp_center , bmp->yres - ((int)(y1.y * scale) + bmp_center) , (int)(y2.x * scale) + bmp_center , bmp->yres - ((int)(y2.y * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)(z1.x * scale) + bmp_center , bmp->yres - ((int)(z1.y * scale) + bmp_center) , (int)(z2.x * scale) + bmp_center , bmp->yres - ((int)(z2.y * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); if(p_space->show_quad_view) { x1 = x2 = y1 = y2 = z1 = z2 = 0; x1.x = -5000; x2.x = 5000; y1.y = -5000; y2.y = 5000; z1.z = -5000; z2.z = 5000; x1 = x1 += p_space->fulcrum; x2 = x2 += p_space->fulcrum; y1 = y1 += p_space->fulcrum; y2 = y2 += p_space->fulcrum; z1 = z1 += p_space->fulcrum; z2 = z2 += p_space->fulcrum; if(offset_view) { x1 += p_space->view_offset; x2 += p_space->view_offset; y1 += p_space->view_offset; y2 += p_space->view_offset; z1 += p_space->view_offset; z2 += p_space->view_offset; } if(scale_view) { x1 *= p_space->view_scale; x2 *= p_space->view_scale; y1 *= p_space->view_scale; y2 *= p_space->view_scale; z1 *= p_space->view_scale; z2 *= p_space->view_scale; } // front XY bmp_put_thick_line_fast(bmp, (int)(x1.x * scale) + bmp_3X_center , bmp->yres - ((int)(x1.y * scale) + bmp_3X_center) , (int)(x2.x * scale) + bmp_3X_center , bmp->yres - ((int)(x2.y * scale) + bmp_3X_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)(y1.x * scale) + bmp_3X_center , bmp->yres - ((int)(y1.y * scale) + bmp_3X_center) , (int)(y2.x * scale) + bmp_3X_center , bmp->yres - ((int)(y2.y * scale) + bmp_3X_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); // top XZ bmp_put_thick_line_fast(bmp, (int)(x1.x * scale) + bmp_center , bmp->yres - ((int)(x1.z * -scale) + bmp_3X_center) , (int)(x2.x * scale) + bmp_center , bmp->yres - ((int)(x2.z * -scale) + bmp_3X_center) , bmp->make_rgb(255,0,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)(z1.x * scale) + bmp_center , bmp->yres - ((int)(z1.z * -scale) + bmp_3X_center) , (int)(z2.x * scale) + bmp_center , bmp->yres - ((int)(z2.z * -scale) + bmp_3X_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); // side YZ bmp_put_thick_line_fast(bmp, (int)(y1.z * scale) + bmp_3X_center , bmp->yres - ((int)(y1.y * scale) + bmp_center) , (int)(y2.z * scale) + bmp_3X_center , bmp->yres - ((int)(y2.y * scale) + bmp_center) , bmp->make_rgb(0,255,0) , p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)(z1.z * scale) + bmp_3X_center , bmp->yres - ((int)(z1.y * scale) + bmp_center) , (int)(z2.z * scale) + bmp_3X_center , bmp->yres - ((int)(z2.y * scale) + bmp_center) , bmp->make_rgb(0,0,255) , p_space->rendered_line_width ); } } //------------------------------------------------------------------------ // ACTUAL VECTOR ART !!! //------------------------------------------------------------------------ if(at(index).size() > 1) { if(p_space->show_onion_skin) { int skins = p_space->number_of_skins <= size() ? p_space->number_of_skins : size(); for(int skin = skins; skin >= 0; skin--) { if((index - skin) >= 0) at(index - skin).render(skin, bmp); else if(p_space->loop_animation) at(size() + index - skin).render(skin, bmp); } } else at(index).render(0, bmp); //---------------------------------------------------------------- // END ACTUAL VECTOR ART !!! //---------------------------------------------------------------- if(p_space->show_cursors) { bit_masked = at(index).at(at(index).egg).bit_masked_color(p_space->signal_bit_mask); egg_color = at(index).at(at(index).egg).is_blank() ? bmp_blank : at(index).at(at(index).egg).is_black(p_space->black_level) ? bmp->make_rgb(0xff, 0xff, 0xff) : bmp->make_rgb(bit_masked.r, bit_masked.g, bit_masked.b); //---------------------------------------------------------------- bit_masked = at(index).at(at(index).spider).bit_masked_color(p_space->signal_bit_mask); spider_color = at(index).at(at(index).spider).is_blank() ? bmp_blank : at(index).at(at(index).spider).is_black(p_space->black_level) ? bmp->make_rgb(0xff, 0xff, 0xff) : bmp->make_rgb(bit_masked.r, bit_masked.g, bit_masked.b); //---------------------------------------------------------------- if(p_space->infinite_vector && (at(index).spider) > 0) { _0 = at(index).at(at(index).spider - 1).bit_masked_position(p_space->signal_bit_mask); _1 = at(index).at(at(index).spider).bit_masked_position(p_space->signal_bit_mask); if(p_space->show_Z_as_order) { _0.z = (at(index).spider - 1) * z_depth_scale - z_depth_body_offset; _1.z = at(index).spider * z_depth_scale - z_depth_body_offset; } if(rotate_view) { _0 = rotate_vertex(_0, p_space->view_angle); _1 = rotate_vertex(_1, p_space->view_angle); } if(offset_view) { _0 += p_space->view_offset; _1 += p_space->view_offset; } if(scale_view) { _0 *= p_space->view_scale; _1 *= p_space->view_scale; } bmp_put_thick_infinite_line_fast(bmp, (int)round((_0.x) * scale) + bmp_center, bmp->yres - ((int)round((_0.y) * scale) + bmp_center), (int)round((_1.x) * scale) + bmp_center, bmp->yres - ((int)round((_1.y) * scale) + bmp_center), at(index).at(at(index).spider).is_blank() ? bmp->make_rgb(0x40, 0x40, 0x40) : at(index).at(at(index).spider).is_black(p_space->black_level) ? bmp->make_rgb(0xa0, 0xa0, 0xa0) : bmp->make_rgb(bit_masked.r / 2, bit_masked.g / 2, bit_masked.b / 2), p_space->rendered_line_width ); bmp_put_thick_line_fast(bmp, (int)round((_0.x) * scale) + bmp_center, bmp->yres - ((int)round((_0.y) * scale) + bmp_center), (int)round((_1.x) * scale) + bmp_center, bmp->yres - ((int)round((_1.y) * scale) + bmp_center), spider_color, p_space->rendered_line_width ); } //---------------------------------------------------------------- _0 = at(index).at(at(index).egg ).bit_masked_position(p_space->signal_bit_mask); _1 = at(index).at(at(index).spider).bit_masked_position(p_space->signal_bit_mask); if(p_space->show_Z_as_order) { _0.z = at(index).egg * z_depth_scale - z_depth_body_offset; _1.z = at(index).spider * z_depth_scale - z_depth_body_offset; } if(rotate_view) { _0 = rotate_vertex(_0, p_space->view_angle); _1 = rotate_vertex(_1, p_space->view_angle); } if(offset_view) { _0 += p_space->view_offset; _1 += p_space->view_offset; } if(scale_view) { _0 *= p_space->view_scale; _1 *= p_space->view_scale; } //---------------------------------------------------------------- // egg cursor bmp_put_thick_rectangle(bmp, (int)round((_0.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_0.y - 1000) * scale) + bmp_center), (int)round((_0.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_0.y + 1000) * scale) + bmp_center), egg_color, cursor_line ); //---------------------------------------------------------------- if(p_space->show_indices) bmp_printf(bmp, (int)( _0.x * scale) + bmp_center, (int)(-_0.y * scale) + bmp_3X_center, bmp_bg_color, egg_color, 0, p_space->font_size_factor, "%d", at(index).egg ); //---------------------------------------------------------------- // spider cursor bmp_put_thick_line_fast (bmp, (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_center), (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_center), (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), (int)round((_1.x + 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), (int)round((_1.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_center), (int)round((_1.x - 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_center), (int)round((_1.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_center), (int)round((_1.x + 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_center), (int)round((_1.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_center), spider_color, cursor_line ); //---------------------------------------------------------------- if(p_space->show_indices) bmp_printf(bmp, (int)( _1.x * scale) + bmp_center, (int)(-_1.y * scale) + bmp_3X_center, bmp_bg_color, spider_color, 0, p_space->font_size_factor, "%d", at(index).spider ); //---------------------------------------------------------------- if(p_space->show_quad_view) { _0 = at(index).at(at(index).egg ).bit_masked_position(p_space->signal_bit_mask); _1 = at(index).at(at(index).spider).bit_masked_position(p_space->signal_bit_mask); if(p_space->show_Z_as_order) { _0.z = at(index).egg * z_depth_scale - z_depth_body_offset; _1.z = at(index).spider * z_depth_scale - z_depth_body_offset; } if(offset_view) { _0 += p_space->view_offset; _1 += p_space->view_offset; } if(scale_view) { _0 *= p_space->view_scale; _1 *= p_space->view_scale; } //------------------------------------------------------------ // egg cursor front bmp_put_thick_rectangle(bmp, (int)round((_0.x - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_0.y - 1000) * scale) + bmp_3X_center), (int)round((_0.x + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_0.y + 1000) * scale) + bmp_3X_center), egg_color, cursor_line ); //------------------------------------------------------------ if(p_space->show_indices) bmp_printf(bmp, (int)( _0.x * scale) + bmp_3X_center, (int)(-_0.y * scale) + bmp_center, bmp_bg_color, egg_color, 0, p_space->font_size_factor, "%d", at(index).egg ); //------------------------------------------------------------ // spider cursor front bmp_put_thick_line_fast (bmp, (int)round((_1.x ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_3X_center), (int)round((_1.x ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_3X_center), (int)round((_1.x ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_3X_center), (int)round((_1.x + 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_3X_center), (int)round((_1.x - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_3X_center), (int)round((_1.x - 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_3X_center), (int)round((_1.x + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_3X_center), (int)round((_1.x + 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_3X_center), (int)round((_1.x - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_3X_center), spider_color, cursor_line ); //------------------------------------------------------------ if(p_space->show_indices) bmp_printf(bmp, (int)( _1.x * scale) + bmp_3X_center, (int)(-_1.y * scale) + bmp_center, bmp_bg_color, spider_color, 0, p_space->font_size_factor, "%d", at(index).spider ); //------------------------------------------------------------ // egg cursor top bmp_put_thick_rectangle(bmp, (int)round((_0.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_0.z - 1000) * -scale) + bmp_3X_center), (int)round((_0.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_0.z + 1000) * -scale) + bmp_3X_center), egg_color, cursor_line ); //------------------------------------------------------------ if(p_space->show_indices) bmp_printf(bmp, (int)( _0.x * scale) + bmp_center, (int)( _0.z * scale) + bmp_center, bmp_bg_color, egg_color, 0, p_space->font_size_factor, "%d", at(index).egg ); //------------------------------------------------------------ // spider cursor top bmp_put_thick_line_fast (bmp, (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z + 400 ) * scale) + bmp_3X_center), (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z + 1000) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z - 1000) * scale) + bmp_3X_center), (int)round((_1.x ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z - 400 ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.z ) * scale) + bmp_3X_center), (int)round((_1.x + 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z ) * scale) + bmp_3X_center), (int)round((_1.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.z ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.z - 1000) * scale) + bmp_3X_center), (int)round((_1.x - 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z - 400 ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z + 400 ) * scale) + bmp_3X_center), (int)round((_1.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.z + 1000) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.x + 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.z - 1000) * scale) + bmp_3X_center), (int)round((_1.x + 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z - 400 ) * scale) + bmp_3X_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z - 400 ) * scale) + bmp_center, bmp->yres - ((int)round((_1.z + 400 ) * scale) + bmp_3X_center), (int)round((_1.z - 1000) * scale) + bmp_center, bmp->yres - ((int)round((_1.z + 1000) * scale) + bmp_3X_center), spider_color, cursor_line ); //------------------------------------------------------------ if(p_space->show_indices) bmp_printf(bmp, (int)(_1.x * scale) + bmp_center, (int)(_1.z * scale) + bmp_center, bmp_bg_color, spider_color, 0, p_space->font_size_factor, "%d", at(index).spider ); //------------------------------------------------------------ // egg cursor side bmp_put_thick_rectangle(bmp, (int)((_0.z - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)((_0.y - 1000) * scale) + bmp_center), (int)((_0.z + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)((_0.y + 1000) * scale) + bmp_center), egg_color, cursor_line ); //------------------------------------------------------------ if(p_space->show_indices) bmp_printf(bmp, (int)( _0.z * scale) + bmp_3X_center, (int)(-_0.y * scale) + bmp_3X_center, bmp_bg_color, egg_color, 0, p_space->font_size_factor, "%d", at(index).egg ); //------------------------------------------------------------ // spider cursor side bmp_put_thick_line_fast (bmp, (int)round((_1.z ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_center), (int)round((_1.z ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_center), (int)round((_1.z ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), (int)round((_1.z + 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z - 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), (int)round((_1.z - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_center), (int)round((_1.z - 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z + 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_center), (int)round((_1.z + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z + 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 1000) * scale) + bmp_center), (int)round((_1.z + 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y - 400 ) * scale) + bmp_center), spider_color, cursor_line ); bmp_put_thick_line_fast (bmp, (int)round((_1.z - 400 ) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 400 ) * scale) + bmp_center), (int)round((_1.z - 1000) * scale) + bmp_3X_center, bmp->yres - ((int)round((_1.y + 1000) * scale) + bmp_center), spider_color, cursor_line ); //------------------------------------------------------------ if(p_space->show_indices) bmp_printf(bmp, (int)( _1.z * scale) + bmp_3X_center, (int)(-_1.y * scale) + bmp_3X_center, bmp_bg_color, spider_color, 0, p_space->font_size_factor, "%d", at(index).spider ); } //---------------------------------------------------------------- } // end if(p_space->show_cursors) //---------------------------------------------------------------- } // end if(at(index).size() > 1) return; } //############################################################################ bool LaserBoy_frame_set::from_nothing() { LaserBoy_frame frame; push_back(frame); p_space->palette_index = LASERBOY_ILDA_DEFAULT; num_2D_frames = 0; num_3D_frames = 0; p_space->p_GUI->display_state("NO DATA"); return true; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_ild_file(const string& file) { long int bytes_skipped; LaserBoy_ild_header_count counter; return from_ild_file(file, bytes_skipped, counter); } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_ild_file(const string& file, long int& bytes_skipped, LaserBoy_ild_header_count& counter ) { std::ifstream in(file.c_str(), ios::in | ios::binary); if(in.is_open()) { from_ifstream_ild(in, bytes_skipped, counter); in.close(); if(size() == 0) // create an empty frame_set { from_nothing(); frame_set_error |= LASERBOY_NO_FRAMES_FOUND; } else p_space->last_ild_file_name = file; } else // file failed to open { from_nothing(); frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } return frame_set_error; } //############################################################################ void LaserBoy_frame_set::superimpose_frame_set(LaserBoy_frame_set& overlay) { size_t i; LaserBoy_frame_set sum; if(overlay.size() > 1 && size() > 1) { if(size() > overlay.size()) { for(i = 0; i < overlay.size(); i++) sum += (frame(i) + overlay.frame(i)); for(i = overlay.size(); i < size(); i++) sum += frame(i); } else if(size() < overlay.size()) { for(i = 0; i < size(); i++) sum += (frame(i) + overlay.frame(i)); for(i = size(); i < overlay.size(); i++) sum += overlay.frame(i); } else for(i = 0; i < size(); i++) sum += (frame(i) + overlay.frame(i)); } else if(overlay.size() == 1) for(i = 0; i < size(); i++) sum += (frame(i) + overlay.frame(0)); else if(size() == 1) for(i = 0; i < overlay.size(); i++) sum += (frame(0) + overlay.frame(i)); *this = sum; return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::superimpose_from_txt_file(const string& file, int &new_frame_count, int &new_palette_count ) { LaserBoy_frame_set overlay, sum; size_t i = p_space->number_of_palettes(); overlay.from_txt_file(file); new_frame_count = overlay.size(); new_palette_count = p_space->number_of_palettes() - i; if(new_frame_count) { if(overlay.size() > 1 && size() > 1) { if(size() > overlay.size()) { for(i = 0; i < overlay.size(); i++) sum += (frame(i) + overlay.frame(i)); for(i = overlay.size(); i < size(); i++) sum += frame(i); } else if(size() < overlay.size()) { for(i = 0; i < size(); i++) sum += (frame(i) + overlay.frame(i)); for(i = size(); i < overlay.size(); i++) sum += overlay.frame(i); } else { for(i = 0; i < size(); i++) sum += (frame(i) + overlay.frame(i)); } } else if(overlay.size() == 1) { for(i = 0; i < size(); i++) sum += (frame(i) + overlay.frame(0)); } else if(size() == 1) { for(i = 0; i < overlay.size(); i++) sum += (frame(0) + overlay.frame(i)); } *this = sum; } frame_set_error = overlay.frame_set_error; return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_dxf_file(const string& file, bool append) { std::ifstream in(file.c_str(), ios::in); //------------------------------------------------------------------------ if(in.is_open()) { LaserBoy_frame frame; frame_set_error = LASERBOY_OK; if(!append) { clear(); num_2D_frames = 0; num_3D_frames = 0; frame_index = 0; } frame_set_error |= frame.from_ifstream_dxf(in); if(frame_set_error == LASERBOY_OK) { p_space->palette_index = frame.palette_index; push_back(frame); if(back().find_rgb_in_palette(p_space->palette_picker(LASERBOY_DXF))) back().palette_index = LASERBOY_DXF; } else { from_nothing(); frame_index = 0; } in.close(); } else { if(!append) { from_nothing(); frame_index = 0; } frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } //------------------------------------------------------------------------ return frame_set_error; } //############################################################################ bool LaserBoy_frame_set::from_dxf_directory(const string& dir, bool append) { int opened_frames = 0; DIR *pDIR; struct dirent *pDirEnt; vector file_list; pDIR = opendir(dir.c_str()); if(pDIR == NULL) { if(!append) { from_nothing(); frame_index = 0; frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } else frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } // end if(pDIR == NULL) else { pDirEnt = readdir(pDIR); while(pDirEnt != NULL) { if( strcmp(pDirEnt->d_name, "." ) // not the dot && strcmp(pDirEnt->d_name, "..") // not the dot dot ) file_list.push_back(pDirEnt->d_name); pDirEnt = readdir(pDIR); } closedir(pDIR); if(file_list.size()) { bool valid_data = false; int i, j; LaserBoy_real_segment real_vertices; LaserBoy_real_segment_set real_segments; LaserBoy_vertex vertex; LaserBoy_frame frame; //---------------------------------------------------------------- frame.format = LASERBOY_3D_FRAME ; frame.palette_index = LASERBOY_TRUE_COLOR; //---------------------------------------------------------------- if(!append) { clear(); num_2D_frames = 0; num_3D_frames = 0; } //---------------------------------------------------------------- // for systems that don't return file lists in alpha-numeric order! sort(file_list.begin(), file_list.end()); //---------------------------------------------------------------- p_space->p_GUI->display_state("opening DXF files"); for(i = 0; i < (int)file_list.size(); i++) { if( file_list[i].size() >= 5 && iends_with(file_list[i], ".dxf") ) // ?.dxf { std::ifstream in((dir + '/' + file_list[i]).c_str(), ios::in); if(in.is_open()) { real_vertices.from_ifstream_dxf(in); if(real_vertices.size() >= 2) // there is a picture in there valid_data = true; real_segments.push_back(real_vertices); real_vertices.clear(); in.close(); p_space->p_GUI->display_progress(file_list.size() - i); } } } //---------------------------------------------------------------- if(valid_data) { if(p_space->auto_scale_dxf) real_segments.normalize(); reserve(real_segments.size()); //------------------------------------------------------------ p_space->p_GUI->display_state("normalizing DXF frames"); for(j = 0; j < (int)real_segments.size(); j++) { if(real_segments[j].size() >= 4) // more than the origin vector { for(i = 2; i < (int)real_segments[j].size(); i++) // don't include the origin vector { vertex = (LaserBoy_vertex)real_segments[j][i]; if(real_segments[j][i].is_blank()) vertex.blank(); else vertex.unblank(); frame.push_back(vertex); opened_frames++; vertex.clear(); } } // end if(real_segments[j].size() >= 2) else { frame.push_back(vertex); frame.push_back(vertex); } if(frame.find_rgb_in_palette(p_space->palette_picker(LASERBOY_DXF))) frame.palette_index = LASERBOY_DXF; frame.is_2D(); push_back(frame); frame.clear(); p_space->p_GUI->display_progress(real_segments.size() - j); } //------------------------------------------------------------ } // end if(valid_data) else { frame.push_back(vertex); frame.push_back(vertex); frame.palette_index = LASERBOY_DXF; push_back(frame); opened_frames++; } //---------------------------------------------------------------- } // end if(file_list.size()) if(!opened_frames) { if(!append) { from_nothing(); frame_index = 0; frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } else frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } } // end else of if(pDIR == NULL) if(!opened_frames) { from_nothing(); frame_index = 0; frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } file_list.clear(); if(frame_set_error) return false; return true; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_dxf_font(const string& file, bool append) { std::ifstream in(file.c_str(), ios::in); //------------------------------------------------------------------------ if(in.is_open()) { u_int i, last_i; double the_move = 0.0, height = 0.0, span = 3.0, // squares move_per_frame = 2.0; // squares LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2, rs3; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; LaserBoy_Error_Code error_code = rs1.from_ifstream_dxf(in); if(error_code) return error_code; in.close(); // double rescale = 65535.00 / rs1.height(); // rs1.scale(rescale); rs1.reduce_blank_vectors(); rs1.reduce_lit_vectors(); rs1.strip_color(); height = rs1.height(); min.x = -(span * height) / 2.0; max.x = (span * height) / 2.0; min.y = -height / 2.0; max.y = height / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.x = rs1.segment_left().x; last_i = (u_int)( ( ( rs1.width() / height ) + (2.0 * span) ) // in squares / move_per_frame ); the_move = height * move_per_frame; p_space->p_GUI->display_state("finding glyphs in dxf."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, height * 2.0); if(rs2.number_of_lit_vectors() > rs3.number_of_lit_vectors()) rs3 = rs2; else if(rs2.number_of_lit_vectors() < rs3.number_of_lit_vectors()) { rss.push_back(rs3); rs3.clear(); } center.x += the_move; } rss.center_x(true); rss.normalize(false); frames = rss; frames.normalize(0.495); frames.move(LaserBoy_3D_double(16384, 16384, 0)); frames.conglomerate_lit_segments(); frames.minimize(); frames.convert_blank_to_black(); if(append) *this += frames; else *this = frames; } // end if(in.is_open()) else { if(!append) { from_nothing(); frame_index = 0; } frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } //------------------------------------------------------------------------ return frame_set_error; } //############################################################################ bool LaserBoy_frame_set::from_LaserBoy_wav_file(const string& file, bool append) { std::fstream in(file.c_str(), ios::in | ios::binary); if(in.is_open()) { LaserBoy_wav_header header; if(!header.from_fstream_wav(in, file)) { frame_set_error |= LASERBOY_WAV_HEADER_ERROR; return false; } frame_index = 0; //---------------------------------------------------------------- if(header.version == "!LaserBoy!") { frame_set_error |= LASERBOY_LB_WAV_FORMAT_ERROR; return false; } //---------------------------------------------------------------- else if(header.LaserBoy_wav_mode & LASERBOY_WAVE_END_OF_FRAME) frame_set_error |= from_fstream_LaserBoy_wav(header, in, append); //---------------------------------------------------------------- else frame_set_error |= LASERBOY_LB_WAV_FORMAT_ERROR; //---------------------------------------------------------------- in.close(); } else frame_set_error |= LASERBOY_FILE_OPEN_FAILED; if(frame_set_error) return false; return true; } //############################################################################ bool LaserBoy_frame_set::from_unformatted_wav_file(const string& file, bool global_polarity, bool append) { std::fstream in(file.c_str(), ios::in | ios::binary); if(in.is_open()) { LaserBoy_wav_header header; if(!header.from_fstream_wav(in, file)) { frame_set_error |= LASERBOY_WAV_HEADER_ERROR; return false; } if(header.num_channels < p_space->wav_channel_map.size()) frame_set_error |= LASERBOY_LB_WAV_FORMAT_ERROR; else { frame_index = 0; frame_set_error |= from_fstream_unformatted_wav(header, in, global_polarity, append); } in.close(); } else frame_set_error |= LASERBOY_FILE_OPEN_FAILED; if(frame_set_error) return false; return true; } //############################################################################ bool LaserBoy_frame_set::from_headerless_LB_wav_file(const string& file, bool global_polarity, bool append) { std::fstream in(file.c_str(), ios::in | ios::binary); if(in.is_open()) { LaserBoy_wav_header header; if(!header.from_fstream_wav(in, file)) { frame_set_error |= LASERBOY_WAV_HEADER_ERROR; return false; } if(header.num_channels < p_space->wav_channel_map.size()) frame_set_error |= LASERBOY_LB_WAV_FORMAT_ERROR; else { frame_index = 0; frame_set_error |= from_fstream_headerless_LB_wav(header, in, global_polarity, append); } in.close(); } else frame_set_error |= LASERBOY_FILE_OPEN_FAILED; if(frame_set_error) return false; return true; } //############################################################################ bool LaserBoy_frame_set::from_qm_wav_file(const string& file, bool global_polarity, bool append) { std::fstream in(file.c_str(), ios::in | ios::binary); if(in.is_open()) { LaserBoy_wav_header header; if(!header.from_fstream_wav(in, file)) { frame_set_error |= LASERBOY_WAV_HEADER_ERROR; return false; } frame_index = 0; frame_set_error |= from_fstream_qm_wav(header, in, global_polarity, append); in.close(); } else frame_set_error |= LASERBOY_FILE_OPEN_FAILED; if(frame_set_error) return false; return true; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_ifstream_ild(std::ifstream& in, long int& bytes_skipped, LaserBoy_ild_header_count& counter ) { LaserBoy_ild_header header ; LaserBoy_frame frame; LaserBoy_palette palette; int file_sections = 0; //------------------------------------------------------------------------ clear(); frame_set_error = LASERBOY_OK; num_2D_frames = 0; num_3D_frames = 0; //------------------------------------------------------------------------ p_space->palette_index = LASERBOY_ILDA_DEFAULT; //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening ild file sections"); while(header.from_ifstream_ild(in, bytes_skipped)) { if(header.quantity) { switch(header.format) { //------------------------------------------------------------ case LASERBOY_3D_FRAME: // format 0 case LASERBOY_2D_FRAME: // format 1 if(!(frame.from_ifstream_ild(in, header) & LASERBOY_EOF)) { frame.format ? counter._1++ : counter._0++; frame.is_2D() ? num_2D_frames++ : num_3D_frames++; frame.palette_index = p_space->palette_index; frame.set_rgb_from_palette(); push_back(frame); p_space->p_GUI->display_progress(++file_sections); } else frame_set_error |= LASERBOY_EOF; break; //------------------------------------------------------------ case LASERBOY_PALETTE: // format 2 if(palette.from_ifstream_ild(in, header)) { bool built_in_palette = false; bool palette_defined = false; for(int i = 0; i < LASERBOY_BUILT_IN_PALETTES; i++) if(header.name == p_space->palette_picker(i).name) { p_space->palette_index = i; built_in_palette = true; break; } for(int i = p_space->number_of_palettes() - 1; i >= 0; i--) { if(p_space->palette_picker(i) == palette) { p_space->palette_index = i; palette_defined = true; } } if( !built_in_palette && !palette_defined ) { p_space->push_back_palette(palette); p_space->palette_index = p_space->number_of_palettes() - 1; } p_space->p_GUI->display_progress(++file_sections); counter._2++; } else frame_set_error |= LASERBOY_EOF; break; //------------------------------------------------------------ case LASERBOY_COLOR_TABLE: // format 3 if(frame.from_ifstream_format_3(in, header, bytes_skipped)) { frame.format ? counter._1++ : counter._0++; frame.is_2D() ? num_2D_frames++ : num_3D_frames++; p_space->palette_index = LASERBOY_TRUE_COLOR; push_back(frame); p_space->p_GUI->display_progress(++file_sections); frame_set_error |= frame.segment_error; counter._3++; } else frame_set_error |= LASERBOY_EOF; break; //------------------------------------------------------------ case LASERBOY_3D_FRAME_RGB: // format 4 case LASERBOY_2D_FRAME_RGB: // format 5 if(!(frame.from_ifstream_ild(in, header) & LASERBOY_EOF)) { frame.format == LASERBOY_3D_FRAME_RGB ? counter._4++ : counter._5++; frame.is_2D() ? num_2D_frames++ : num_3D_frames++; frame.palette_index = LASERBOY_TRUE_COLOR; push_back(frame); p_space->p_GUI->display_progress(++file_sections); } else frame_set_error |= LASERBOY_EOF; break; //------------------------------------------------------------ } // end switch(header.format) } // end if(header.quantity) else { counter._e++; ild_file_GUID = header.owner; } } // end while(header.from_ifstream_ild(in)) //------------------------------------------------------------------------ return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_ifstream_ctn(std::ifstream& in, long int& bytes_skipped ) { LaserBoy_ild_header header; LaserBoy_frame frame; LaserBoy_palette palette; int file_sections = 0; //------------------------------------------------------------------------ clear(); num_2D_frames = 0; num_3D_frames = 0; frame_set_error = LASERBOY_OK; //------------------------------------------------------------------------ p_space->palette_index = LASERBOY_ILDA_DEFAULT; //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening ctn file sections"); while(header.from_ifstream_ctn(in, bytes_skipped)) { if(header.quantity) { if(!(frame.from_ifstream_ild(in, header) & LASERBOY_EOF)) { frame.palette_index = p_space->palette_index; frame.set_rgb_from_palette(); frame.is_2D() ? num_2D_frames++ : num_3D_frames++; push_back(frame); p_space->p_GUI->display_progress(++file_sections); frame_set_error |= frame.segment_error; } } // end if(header.quantity) } // end while(header.from_ifstream_ild(in)) //------------------------------------------------------------------------ return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_txt_file(const string& file_name, bool append) { bool bond_word = false, bond_line = false, intra_interval = false, intra_interval_false = false, moving_fulcrum = false, moving_fulcrum_false = false, norm_individually = false, norm_with_origin = false, true_color_dxf = false, overwrite_txt_files = false, include_unit_reference = false, bmp_render_vertices = false, bmp_render_vectors = true, disable_bmp = false, disable_dxf = false, disable_txt = false, x_of_pi = false, y_of_pi = false, z_of_pi = false, radii_of_pi = false, math_success = false, divide_by_zero = false, lost_data = false, save_txt_with_color_was = p_space->save_txt_with_color, save_txt_color_hex_was = p_space->save_txt_color_hex; int line_number = 1, frames = 3, hues_shift = 0, hues_index_multiple = 1; u_int i, frame_count = 0, still_frames = 1, first_frames = 1, last_frames = 1, section_count = 0, text_frames_rendered = 0, math_frames_rendered = 0, txt_frames_saved = 0, dxf_frames_saved = 0, bmp_frames_saved = 0, rendered_line_width = 1; double number, hues_span_factor = 1.0, to_space = 0.90, // to frame mono_font_space = 0.70, // per square char_width = 1.00, // per square vari_font_gap = 0.20, // per square vari_font_space = 1.00, // per square super_diacritic_gap = 0.07, // per square line_space = 1.10, // per square view_span = 8.00, // 8 suqares move_per_frame = 0.15, // per square phase_cycle = 360.0, rotation_cycle = 1.00, interval_cycle = 1.00, start = 0.00, _start = 0.00, duration = two_pi, _duration = two_pi, iterations = 100.00, _iterations = 100.00, move_acceleration = 0.0, _move_acceleration = 0.0, scale_acceleration = 0.0, _scale_acceleration = 0.0, fulcrum_acceleration = 0.0, _fulcrum_acceleration = 0.0, rotate_acceleration = 0.0, _rotate_acceleration = 0.0, rhodonea_numerator = 1.0, _rhodonea_numerator = 1.0, rhodonea_denominator = 1.0, _rhodonea_denominator = 1.0, fixed_radius = 1.0, _fixed_radius = 1.0, roller_radius = 1.0, _roller_radius = 1.0, roller_offset = 1.0, _roller_offset = 1.0, polar_grid_radius_max = 1.0, polar_grid_radii_units = 1.0, polar_grid_angle_units = 90.0, rectangular_grid_x_units = 1.0, rectangular_grid_y_units = 1.0, rectangular_grid_z_units = 1.0; LaserBoy_3D_double displacement (0.0, 0.0, 0.0), _displacement (0.0, 0.0, 0.0), factor (1.0, 1.0, 1.0), factor_ (1.0, 1.0, 1.0), _factor (1.0, 1.0, 1.0), _factor_ (1.0, 1.0, 1.0), fulcrum (0.0, 0.0, 0.0), fulcrum_ (0.0, 0.0, 0.0), _fulcrum (0.0, 0.0, 0.0), _fulcrum_ (0.0, 0.0, 0.0), rotation (0.0, 0.0, 0.0), _rotation (0.0, 0.0, 0.0), P0 (-1.0, -1.0, -1.0), _P0 (-1.0, -1.0, -1.0), P1 ( 1.0, 1.0, 1.0), _P1 ( 1.0, 1.0, 1.0); string word, report, font_name = "laserellipse"; u32string unicode_char_list; vector coordinate_real_frames_index; long int bytes_skipped = 0; LaserBoy_ild_header_count counter; LaserBoy_color color (255, 255, 255); LaserBoy_oscillator LBO1 , LBO2 , LBO3 , LBO4 , LBO5 , LBO6 , LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, _LBO1 , _LBO2 , _LBO3 , _LBO4 , _LBO5 , _LBO6 , _LBO1_, _LBO2_, _LBO3_, _LBO4_, _LBO5_, _LBO6_; LaserBoy_oscillator* LBO_set[4][6] = { { &LBO1 , &LBO2 , &LBO3 , &LBO4 , &LBO5 , &LBO6 }, { &LBO1_, &LBO2_, &LBO3_, &LBO4_, &LBO5_, &LBO6_ }, { &_LBO1 , &_LBO2 , &_LBO3 , &_LBO4 , &_LBO5 , &_LBO6 }, { &_LBO1_, &_LBO2_, &_LBO3_, &_LBO4_, &_LBO5_, &_LBO6_ } }; LaserBoy_frame frame; LaserBoy_palette palette; LaserBoy_real_segment real_segment; LaserBoy_real_segment_set coordinate_real_segments; LaserBoy_frame_set font_frames, current = *this; LaserBoy_real_segment_set *A = NULL, *B = NULL, *C = NULL; vector math_list; std::ifstream in (file_name.c_str(), ios::in ); std::ofstream error_log ("txt_in_errors.txt", ios::out); //------------------------------------------------------------------------ wstring_convert, char32_t> conv_utf8_utf32; //------------------------------------------------------------------------ if(LASERBOY_OK == font_frames.from_ild_file(LASERBOY_FONT_SHARE + font_name + ".ild", bytes_skipped, counter)) { LaserBoy_Error_Code ret = font_frames.get_unicode_index(unicode_char_list); if(ret & LASERBOY_INVALID_UNICODE) { error_log << font_name << " error: invalid unicode names." << ENDL; error_log.close(); return frame_set_error; } if(ret & LASERBOY_REDUNDANT_UNICODE) { error_log << font_name << " error: redundant unicode names." << ENDL; error_log.close(); return frame_set_error; } } else { error_log << font_name << " error: file not found." << ENDL; error_log.close(); frame_set_error |= LASERBOY_FILE_OPEN_FAILED; return frame_set_error; } //------------------------------------------------------------------------ if(in.is_open()) { frame_index = 0; frame_set_error = LASERBOY_OK; } else { error_log << file_name << " error: file does not exist" << ENDL; error_log.close(); frame_set_error |= LASERBOY_FILE_OPEN_FAILED; return frame_set_error; } //------------------------------------------------------------------------ if(!append) { clear(); num_2D_frames = 0; num_3D_frames = 0; } //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening text file sections"); while(in.good()) { p_space->p_GUI->display_txt_line_number(line_number); clear_to_alpha(in, line_number); if(get_next_token(in, word, line_number)) { //---------------------------------------------------------------- // comment_block_start // ..... // comment_block_end //---------------------------------------------------------------- if(word == "comment_block_start") { do { if(!get_next_token(in, word, line_number)) break; if(word == "comment_block_start") { error_log << file_name << " line " << line_number << ", comment_block_start found again without a comment_block_end in between" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } while(word != "comment_block_end"); if(word != "comment_block_end") { error_log << file_name << " end of file reached before comment_block_end" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } //---------------------------------------------------------------- else if(word == "comment_block_end") { error_log << file_name << " comment_block_end encountered with no comment_block_start" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //---------------------------------------------------------------- // frame //---------------------------------------------------------------- else if(word == "frame") { if(get_next_word(in, word, line_number)) { if(word == "xy") // 2D { // frame xy if(get_next_word(in, word, line_number)) { if(word == "rgb") { // frame xy rgb if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xy rgb short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } else if(word == "unit") { // frame xy rgb unit frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_RGB, LASERBOY_UNIT, line_number); push_back(frame); frame_count++; } else if(word == "real") { // frame xy rgb real real_segment.from_ifstream_txt(in, LASERBOY_2D_FRAME_RGB, line_number); coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame.clear(); push_back(frame); frame_count++; } else { // frame xy rgb bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xy rgb ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xy rgb short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "hex") { // frame xy hex if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xy hex short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_HEX, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } else if(word == "unit") { // frame xy hex unit frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_HEX, LASERBOY_UNIT, line_number); push_back(frame); frame_count++; } else if(word == "real") { // frame xy hex real real_segment.from_ifstream_txt(in, LASERBOY_2D_FRAME_HEX, line_number); coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame.clear(); push_back(frame); frame_count++; } else { // frame xy hex bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token.(frame xy hex ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xy hex short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_HEX, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "palette") { // frame xy palette if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xy palette short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_PALETTE, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } else if(word == "unit") { // frame xy palette unit frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_PALETTE, LASERBOY_UNIT, line_number); push_back(frame); frame_count++; } else if(word == "real") { // frame xy palette real real_segment.from_ifstream_txt(in, LASERBOY_2D_FRAME_PALETTE, line_number); coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame.clear(); push_back(frame); frame_count++; } else { // frame xy palette bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. ( frame xy palette ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xy palette short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_PALETTE, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "table") { // frame xy table if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xy table short if(size()) { back().from_ifstream_txt(in, LASERBOY_2D_FRAME_TABLE, LASERBOY_SHORT, line_number); if(back().segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xy table short ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } frame_count++; } } else if(word == "unit") { // frame xy table unit if(size()) { back().from_ifstream_txt(in, LASERBOY_2D_FRAME_TABLE, LASERBOY_UNIT, line_number); if(back().segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xy table unit ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } frame_count++; } } else if(word == "real") { // frame xy table real real_segment.from_ifstream_txt(in, LASERBOY_2D_FRAME_TABLE, line_number); for(size_t i = 0; i < back().size(); i++) { real_segment[i + 2].r = back()[i].r; real_segment[i + 2].g = back()[i].g; real_segment[i + 2].b = back()[i].b; real_segment[i + 2].c = back()[i].c; real_segment[i + 2].k = back()[i].k; } if(real_segment.real_segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xy table real ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame_count++; } else { // frame xy table bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xy table ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xy table [short] back().from_ifstream_txt(in, LASERBOY_2D_FRAME_TABLE, LASERBOY_SHORT, line_number); if(back().segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xy table short ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } frame_count++; } } // end else if(word == "table") else { // frame xy bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xy ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xy rgb short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "xyz") // 3D { // frame xyz if(get_next_word(in, word, line_number)) { if(word == "rgb") { // frame xyz rgb if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xyz rgb short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } else if(word == "unit") { // frame xyz rgb unit frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_RGB, LASERBOY_UNIT, line_number); push_back(frame); frame_count++; } else if(word == "real") { // frame xyz rgb real real_segment.from_ifstream_txt(in, LASERBOY_3D_FRAME_RGB, line_number); coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame.clear(); push_back(frame); frame_count++; } else { // frame xyz rgb bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xyz rgb ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xyz rgb short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "hex") { // frame xyz hex if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xyz hex short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_HEX, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } else if(word == "unit") { // frame xyz hex unit frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_HEX, LASERBOY_UNIT, line_number); push_back(frame); frame_count++; } else if(word == "real") { // frame xyz hex real real_segment.from_ifstream_txt(in, LASERBOY_3D_FRAME_HEX, line_number); coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame.clear(); push_back(frame); frame_count++; } else { // frame xyz hex bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xyz hex ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xyz hex short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_HEX, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "palette") { // frame xyz palette if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xyz palette short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_PALETTE, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } else if(word == "unit") { // frame xyz palette unit frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_PALETTE, LASERBOY_UNIT, line_number); push_back(frame); frame_count++; } else if(word == "real") { // frame xyz palette real real_segment.from_ifstream_txt(in, LASERBOY_3D_FRAME_PALETTE, line_number); coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame.clear(); push_back(frame); frame_count++; } else { // frame xyz palette bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xyz palette ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xyz palette short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_PALETTE, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else if(word == "table") { // frame xyz table if(get_next_word(in, word, line_number)) { if(word == "short") { // frame xyz table short if(size()) { back().from_ifstream_txt(in, LASERBOY_3D_FRAME_TABLE, LASERBOY_SHORT, line_number); if(back().segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xyz table short ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } frame_count++; } } else if(word == "unit") { // frame xyz table unit if(size()) { back().from_ifstream_txt(in, LASERBOY_3D_FRAME_TABLE, LASERBOY_UNIT, line_number); if(back().segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xyz table unit ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } frame_count++; } } else if(word == "real") { // frame xyz table real real_segment.from_ifstream_txt(in, LASERBOY_3D_FRAME_TABLE, line_number); if(real_segment.real_segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xyz table real ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } for(size_t i = 0; i < back().size(); i++) { real_segment[i + 2].r = back()[i].r; real_segment[i + 2].g = back()[i].g; real_segment[i + 2].b = back()[i].b; real_segment[i + 2].c = back()[i].c; real_segment[i + 2].k = back()[i].k; } coordinate_real_segments.push_back(real_segment); coordinate_real_frames_index.push_back(frame_count); frame_count++; } else { // frame xyz table bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xyz table ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xyz table [short] if(size()) { back().from_ifstream_txt(in, LASERBOY_3D_FRAME_TABLE, LASERBOY_SHORT, line_number); if(back().segment_error & LASERBOY_COLOR_VERTEX_MISSMATCH) { error_log << file_name << " error before line: " << line_number << " color table to vertex count mismatch. (frame xyz table [short] ERROR)" << ENDL; frame_set_error |= LASERBOY_COLOR_VERTEX_MISSMATCH; } frame_count++; } } } else { // frame xyz bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame xyz ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xyz rgb short frame.from_ifstream_txt(in, LASERBOY_3D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } else { // frame bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (frame ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // frame xy rgb short frame.from_ifstream_txt(in, LASERBOY_2D_FRAME_RGB, LASERBOY_SHORT, line_number); push_back(frame); frame_count++; } } //---------------------------------------------------------------- // palette //---------------------------------------------------------------- else if(word == "palette") { // palette if(get_next_word(in, word, line_number)) { if(word == "named") { if(get_next_word(in, word, line_number)) { // palette named name switch(p_space->palette_from_ifstream_txt(in, LASERBOY_RGB, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: // this is what we expect. break; case LASERBOY_OK: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a valid LaserBoy palette name." << ENDL; error_log << file_name << " on line: " << line_number << " new named palette \'" << word << "\' added to set." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_NAME_NOT_FOUND; frame_set_error |= LASERBOY_TXT_UNEXPECED_PALETTE; break; case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a valid LaserBoy palette name." << ENDL; error_log << file_name << " error on line: " << line_number << " \'" << word << "\' palette name is more than 8 characters." << ENDL; error_log << file_name << " on line: " << line_number << " new named palette \'" << word << "\' added to set." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_NAME_NOT_FOUND; frame_set_error |= LASERBOY_TXT_PALETTE_NAME_TOO_LONG; frame_set_error |= LASERBOY_TXT_UNEXPECED_PALETTE; break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a valid LaserBoy palette name." << ENDL; error_log << file_name << " error on line: " << line_number << " new named palette \'" << word << "\' invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_NAME_NOT_FOUND; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } else { // palette named [no-name] error_log << file_name << " error on line: " << line_number << " LaserBoy palette name is missing. (palette named [no-name])" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; word.clear(); switch(p_space->palette_from_ifstream_txt(in, LASERBOY_RGB, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: // this is impossible break; case LASERBOY_OK: error_log << file_name << " on line: " << line_number << " new named palette added to set." << ENDL; frame_set_error |= LASERBOY_TXT_UNEXPECED_PALETTE; break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } } else if(word == "rgb") { if(get_next_word(in, word, line_number)) { // palette rgb name switch(p_space->palette_from_ifstream_txt(in, LASERBOY_RGB, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is already named in the LaserBoy palette set." << ENDL; frame_set_error |= LASERBOY_PALETTE_NAME_IN_USE; break; case LASERBOY_OK: // this is what we expect. break; case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' palette name is more than 8 characters." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_NAME_TOO_LONG; break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } else // palette rgb [no-name] { word.clear(); switch(p_space->palette_from_ifstream_txt(in, LASERBOY_RGB, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: // impossible break; case LASERBOY_OK: // this is what we expect. break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } } else if(word == "hex") { if(get_next_word(in, word, line_number)) { // palette hex name switch(p_space->palette_from_ifstream_txt(in, LASERBOY_HEX, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is already named in the LaserBoy palette set." << ENDL; frame_set_error |= LASERBOY_PALETTE_NAME_IN_USE; break; case LASERBOY_OK: // this is what we expect. break; case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: error_log << file_name << " error on line: " << line_number << " \'" << word << "\' palette name is more than 8 characters." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_NAME_TOO_LONG; break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } else // palette hex [no-name] { word.clear(); switch(p_space->palette_from_ifstream_txt(in, LASERBOY_HEX, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: // impossible break; case LASERBOY_OK: // this is what we expect. break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } } else { // palette bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (palette ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } // end if(get_next_word(in, word, line_number)) else // there was no word after palette { // palette rgb [no-name] word.clear(); switch(p_space->palette_from_ifstream_txt(in, LASERBOY_RGB, line_number, word)) { case LASERBOY_PALETTE_NAME_IN_USE: case LASERBOY_TXT_PALETTE_NAME_TOO_LONG: // impossible break; case LASERBOY_OK: // this is what we expect. break; case LASERBOY_TXT_PALETTE_FAILED: error_log << file_name << " error on line: " << line_number << " invalid palette data." << ENDL; frame_set_error |= LASERBOY_TXT_PALETTE_FAILED; break; } } } //---------------------------------------------------------------- // table //---------------------------------------------------------------- else if(word == "table") { if(get_next_word(in, word, line_number)) { if(word == "rgb") { // table rgb frame.from_ifstream_txt(in, LASERBOY_COLOR_TABLE, LASERBOY_RGB, line_number); push_back(frame); } else if(word == "hex") { // table hex frame.from_ifstream_txt(in, LASERBOY_COLOR_TABLE, LASERBOY_HEX, line_number); push_back(frame); } else { // table bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (table ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } else { // table rgb frame.from_ifstream_txt(in, LASERBOY_COLOR_TABLE, LASERBOY_RGB, line_number); push_back(frame); } } //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- // math //---------------------------------------------------------------- else if(word == "math") { math_success = false; lost_data = false; LBO1.phase_cycle = phase_cycle; LBO1_.phase_cycle = phase_cycle; _LBO1.phase_cycle = phase_cycle; _LBO1_.phase_cycle = phase_cycle; LBO2.phase_cycle = phase_cycle; LBO2_.phase_cycle = phase_cycle; _LBO2.phase_cycle = phase_cycle; _LBO2_.phase_cycle = phase_cycle; LBO3.phase_cycle = phase_cycle; LBO3_.phase_cycle = phase_cycle; _LBO3.phase_cycle = phase_cycle; _LBO3_.phase_cycle = phase_cycle; LBO4.phase_cycle = phase_cycle; LBO4_.phase_cycle = phase_cycle; _LBO4.phase_cycle = phase_cycle; _LBO4_.phase_cycle = phase_cycle; LBO5.phase_cycle = phase_cycle; LBO5_.phase_cycle = phase_cycle; _LBO5.phase_cycle = phase_cycle; _LBO5_.phase_cycle = phase_cycle; LBO6.phase_cycle = phase_cycle; LBO6_.phase_cycle = phase_cycle; _LBO6.phase_cycle = phase_cycle; _LBO6_.phase_cycle = phase_cycle; if(!intra_interval || intra_interval_false) { LBO1_ = LBO1; LBO2_ = LBO2; LBO3_ = LBO3; LBO4_ = LBO4; LBO5_ = LBO5; LBO6_ = LBO6; _LBO1_ = _LBO1; _LBO2_ = _LBO2; _LBO3_ = _LBO3; _LBO4_ = _LBO4; _LBO5_ = _LBO5; _LBO6_ = _LBO6; } if(!moving_fulcrum || moving_fulcrum_false) { fulcrum_ = fulcrum; _fulcrum_ =_fulcrum; } //------------------------------------------------------------ if(get_next_word(in, word, line_number)) { if(word == "phase_cycle") { if(get_next_number(in, number, line_number)) { if(number > 0.0) { phase_cycle = number; math_success = true; } else divide_by_zero = true; } else report = "missing value"; } //-------------------------------------------------------- else if(word == "rotation_cycle") { if(get_next_number(in, number, line_number)) { if(number > 0.0) { rotation_cycle = number; math_success = true; } else divide_by_zero = true; } else report = "missing value"; } //-------------------------------------------------------- else if(word == "intra_interval_interpolation") { if(get_next_number(in, number, line_number)) { intra_interval = (bool)number; if(!intra_interval) intra_interval_false = true; else intra_interval_false = false; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "moving_fulcrum") { if(get_next_number(in, number, line_number)) { moving_fulcrum = (bool)number; if(!moving_fulcrum) moving_fulcrum_false = true; else moving_fulcrum_false = false; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "to_space") { if(get_next_number(in, number, line_number)) { if(to_space > 0.0 && to_space <= 1.0) { to_space = number; math_success = true; } else report = "to_space value must be > 0.0 and <= 1.0"; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "normalize_frames_with_origin") { if(get_next_number(in, number, line_number)) { norm_with_origin = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "normalize_frames_individually") { if(get_next_number(in, number, line_number)) { norm_individually = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "save_true_color_dxf") { if(get_next_number(in, number, line_number)) { true_color_dxf = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "save_txt_with_color") { if(get_next_number(in, number, line_number)) { p_space->save_txt_with_color = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "save_txt_color_hex") { if(get_next_number(in, number, line_number)) { p_space->save_txt_color_hex = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "overwrite_txt_files") { if(get_next_number(in, number, line_number)) { overwrite_txt_files = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "include_unit_reference") { if(get_next_number(in, number, line_number)) { include_unit_reference = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "bmp_render_vertices") { if(get_next_number(in, number, line_number)) { bmp_render_vertices = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "bmp_render_vectors") { if(get_next_number(in, number, line_number)) { bmp_render_vectors = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "bmp_line_width") { if(get_next_number(in, number, line_number)) { if(number >= 0) { rendered_line_width = number; math_success = true; } else report = "value must be a positive integer"; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "disable_bmp") { if(get_next_number(in, number, line_number)) { disable_bmp = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "disable_dxf") { if(get_next_number(in, number, line_number)) { disable_dxf = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "disable_txt") { if(get_next_number(in, number, line_number)) { disable_txt = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "x_of_pi") { if(get_next_number(in, number, line_number)) { x_of_pi = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "y_of_pi") { if(get_next_number(in, number, line_number)) { y_of_pi = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "z_of_pi") { if(get_next_number(in, number, line_number)) { z_of_pi = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "radii_of_pi") { if(get_next_number(in, number, line_number)) { radii_of_pi = (bool)number; math_success = true; } else report = "missing numeric value (zero or nonzero)"; } //-------------------------------------------------------- else if(word == "interval_cycle") { if(get_next_number(in, number, line_number)) { if(number > 0.0) { interval_cycle = number; math_success = true; } else report = "value must be positive"; } else report = "missing value"; } //-------------------------------------------------------- else if(word == "hues_shift") { if(get_next_number(in, number, line_number)) { hues_shift = (int)number; while(hues_shift < 0) hues_shift += 1530; math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "hues_index_multiple") { if(get_next_number(in, number, line_number)) { hues_index_multiple = (u_int)abs(number); if(hues_index_multiple == 0) { hues_index_multiple = 1; report = "hues_index_multiple cannot be 0"; } else math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "hues_span_factor") { if(get_next_number(in, number, line_number)) { hues_span_factor = abs(number); if(hues_span_factor == 0) { hues_index_multiple = 1; report = "hues_span_factor cannot be 0"; } else math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "still_frames") { if(get_next_number(in, number, line_number)) { still_frames = (u_int)abs(number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "first_frames") { if(get_next_number(in, number, line_number)) { first_frames = (u_int)abs(number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "last_frames") { if(get_next_number(in, number, line_number)) { last_frames = (u_int)abs(number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "frames") { if(get_next_number(in, number, line_number)) { frames = (int)abs(number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "start") { if(get_next_number(in, number, line_number)) { start = number * (two_pi / interval_cycle); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_start") { if(get_next_number(in, number, line_number)) { _start = number * (two_pi / interval_cycle); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "duration") { if(get_next_number(in, number, line_number)) { duration = abs(number) * (two_pi / interval_cycle); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_duration") { if(get_next_number(in, number, line_number)) { _duration = abs(number) * (two_pi / interval_cycle); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "iterations") { if(get_next_number(in, number, line_number)) { iterations = abs(number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_iterations") { if(get_next_number(in, number, line_number)) { _iterations = abs(number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "rhodonea_numerator") { if(get_next_number(in, number, line_number)) { rhodonea_numerator = number; math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_rhodonea_numerator") { if(get_next_number(in, number, line_number)) { _rhodonea_numerator = number; math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "rhodonea_denominator") { if(get_next_number(in, number, line_number)) { if(number != 0) { rhodonea_denominator = number; math_success = true; } else report = "divide by zero error"; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_rhodonea_denominator") { if(get_next_number(in, number, line_number)) { if(number != 0) { _rhodonea_denominator = number; math_success = true; } else report = "divide by zero error"; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "fixed_radius") { if(get_next_number(in, number, line_number)) { fixed_radius = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_fixed_radius") { if(get_next_number(in, number, line_number)) { _fixed_radius = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "roller_radius") { if(get_next_number(in, number, line_number)) { roller_radius = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_roller_radius") { if(get_next_number(in, number, line_number)) { _roller_radius = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "roller_offset") { if(get_next_number(in, number, line_number)) { roller_offset = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "_roller_offset") { if(get_next_number(in, number, line_number)) { _roller_offset = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "polar_grid_radius_max") { if(get_next_number(in, number, line_number)) { polar_grid_radius_max = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "polar_grid_radii_units") { if(get_next_number(in, number, line_number)) { polar_grid_radii_units = (radii_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "polar_grid_angle_units") { if(get_next_number(in, number, line_number)) { polar_grid_angle_units = number * (two_pi / phase_cycle); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "rectangular_grid_x_units") { if(get_next_number(in, number, line_number)) { rectangular_grid_x_units = (x_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "rectangular_grid_y_units") { if(get_next_number(in, number, line_number)) { rectangular_grid_y_units = (y_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "rectangular_grid_z_units") { if(get_next_number(in, number, line_number)) { rectangular_grid_z_units = (z_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing numeric value"; } //-------------------------------------------------------- else if(word == "displacement") { if(get_next_number(in, number, line_number)) { displacement.x = (x_of_pi) ? (number * pi) : (number); if(get_next_number(in, number, line_number)) { displacement.y = (y_of_pi) ? (number * pi) : (number); if(get_next_number(in, number, line_number)) { displacement.z = (z_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing displacement Z value"; } else report = "missing displacement Y value"; } else report = "missing displacement X value"; } //-------------------------------------------------------- else if(word == "_displacement") { if(get_next_number(in, number, line_number)) { _displacement.x = (x_of_pi) ? (number * pi) : (number); if(get_next_number(in, number, line_number)) { _displacement.y = (y_of_pi) ? (number * pi) : (number); if(get_next_number(in, number, line_number)) { _displacement.z = (z_of_pi) ? (number * pi) : (number); math_success = true; } else report = "missing _displacement Z value"; } else report = "missing _displacement Y value"; } else report = "missing _displacement X value"; } //-------------------------------------------------------- else if(word == "factor") { if(get_next_number(in, number, line_number)) { factor.x = number; if(get_next_number(in, number, line_number)) { factor.y = number; if(get_next_number(in, number, line_number)) { factor.z = number; math_success = true; } else report = "missing factor Z value"; } else report = "missing factor Y value"; } else report = "missing factor X value"; } //-------------------------------------------------------- else if(word == "factor_") { if(get_next_number(in, number, line_number)) { factor_.x = number; if(get_next_number(in, number, line_number)) { factor_.y = number; if(get_next_number(in, number, line_number)) { factor_.z = number; math_success = true; } else report = "missing factor_ Z value"; } else report = "missing factor_ Y value"; } else report = "missing factor_ X value"; } //-------------------------------------------------------- else if(word == "_factor") { if(get_next_number(in, number, line_number)) { _factor.x = number; if(get_next_number(in, number, line_number)) { _factor.y = number; if(get_next_number(in, number, line_number)) { _factor.z = number; math_success = true; } else report = "missing _factor Z value"; } else report = "missing _factor Y value"; } else report = "missing _factor X value"; } //-------------------------------------------------------- else if(word == "_factor_") { if(get_next_number(in, number, line_number)) { _factor_.x = number; if(get_next_number(in, number, line_number)) { _factor_.y = number; if(get_next_number(in, number, line_number)) { _factor_.z = number; math_success = true; } else report = "missing _factor_ Z value"; } else report = "missing _factor_ Y value"; } else report = "missing _factor_ X value"; } //-------------------------------------------------------- else if(word == "fulcrum") { if(get_next_number(in, number, line_number)) { fulcrum.x = number; if(get_next_number(in, number, line_number)) { fulcrum.y = number; if(get_next_number(in, number, line_number)) { fulcrum.z = number; math_success = true; } else report = "missing fulcrum Z value"; } else report = "missing fulcrum Y value"; } else report = "missing fulcrum X value"; } //-------------------------------------------------------- else if(word == "fulcrum_") { if(get_next_number(in, number, line_number)) { fulcrum_.x = number; if(get_next_number(in, number, line_number)) { fulcrum_.y = number; if(get_next_number(in, number, line_number)) { fulcrum_.z = number; math_success = true; moving_fulcrum = true; } else report = "missing fulcrum_ Z value"; } else report = "missing fulcrum_ Y value"; } else report = "missing fulcrum_ X value"; } //-------------------------------------------------------- else if(word == "_fulcrum") { if(get_next_number(in, number, line_number)) { _fulcrum.x = number; if(get_next_number(in, number, line_number)) { _fulcrum.y = number; if(get_next_number(in, number, line_number)) { _fulcrum.z = number; math_success = true; } else report = "missing _fulcrum Z value"; } else report = "missing _fulcrum Y value"; } else report = "missing _fulcrum X value"; } //-------------------------------------------------------- else if(word == "_fulcrum_") { if(get_next_number(in, number, line_number)) { _fulcrum_.x = number; if(get_next_number(in, number, line_number)) { _fulcrum_.y = number; if(get_next_number(in, number, line_number)) { _fulcrum_.z = number; math_success = true; moving_fulcrum = true; } else report = "missing _fulcrum_ Z value"; } else report = "missing _fulcrum_ Y value"; } else report = "missing _fulcrum_ X value"; } //-------------------------------------------------------- else if(word == "rotation") { if(get_next_number(in, number, line_number)) { rotation.x = number * (two_pi / rotation_cycle); if(get_next_number(in, number, line_number)) { rotation.y = number * (two_pi / rotation_cycle); if(get_next_number(in, number, line_number)) { rotation.z = number * (two_pi / rotation_cycle); math_success = true; } else report = "missing rotation Z value"; } else report = "missing rotation Y value"; } else report = "missing rotation X value"; } //-------------------------------------------------------- else if(word == "_rotation") { if(get_next_number(in, number, line_number)) { _rotation.x = number * (two_pi / rotation_cycle); if(get_next_number(in, number, line_number)) { _rotation.y = number * (two_pi / rotation_cycle); if(get_next_number(in, number, line_number)) { _rotation.z = number * (two_pi / rotation_cycle); math_success = true; } else report = "missing _rotation Z value"; } else report = "missing _rotation Y value"; } else report = "missing _rotation X value"; } //-------------------------------------------------------- else if(word == "P0") { if(get_next_number(in, number, line_number)) { if(x_of_pi) P0.x = number * pi; else P0.x = number; if(get_next_number(in, number, line_number)) { if(y_of_pi) P0.y = number * pi; else P0.y = number; if(get_next_number(in, number, line_number)) { if(z_of_pi) P0.z = number * pi; else P0.z = number; math_success = true; } else report = "missing P0 Z value"; } else report = "missing P0 Y value"; } else report = "missing P0 X value"; } //-------------------------------------------------------- else if(word == "_P0") { if(get_next_number(in, number, line_number)) { if(x_of_pi) _P0.x = number * pi; else _P0.x = number; if(get_next_number(in, number, line_number)) { if(y_of_pi) _P0.y = number * pi; else _P0.y = number; if(get_next_number(in, number, line_number)) { if(z_of_pi) _P0.z = number * pi; else _P0.z = number; math_success = true; } else report = "missing _P0 Z value"; } else report = "missing _P0 Y value"; } else report = "missing _P0 X value"; } //-------------------------------------------------------- else if(word == "P1") { if(get_next_number(in, number, line_number)) { if(x_of_pi) P1.x = number * pi; else P1.x = number; if(get_next_number(in, number, line_number)) { if(y_of_pi) P1.y = number * pi; else P1.y = number; if(get_next_number(in, number, line_number)) { if(z_of_pi) P1.z = number * pi; else P1.z = number; math_success = true; } else report = "missing P1 Z value"; } else report = "missing P1 Y value"; } else report = "missing P1 X value"; } //-------------------------------------------------------- else if(word == "_P1") { if(get_next_number(in, number, line_number)) { if(x_of_pi) _P1.x = number * pi; else _P1.x = number; if(get_next_number(in, number, line_number)) { if(y_of_pi) _P1.y = number * pi; else _P1.y = number; if(get_next_number(in, number, line_number)) { if(z_of_pi) _P1.z = number * pi; else _P1.z = number; math_success = true; } else report = "missing _P1 Z value"; } else report = "missing _P1 Y value"; } else report = "missing _P1 X value"; } //-------------------------------------------------------- else if(word == "move_acceleration") { if(get_next_number(in, number, line_number)) { move_acceleration = number; math_success = true; } else report = "missing move_acceleration value"; } //-------------------------------------------------------- else if(word == "_move_acceleration") { if(get_next_number(in, number, line_number)) { _move_acceleration = number; math_success = true; } else report = "missing _move_acceleration value"; } //-------------------------------------------------------- else if(word == "scale_acceleration") { if(get_next_number(in, number, line_number)) { scale_acceleration = number; math_success = true; } else report = "missing scale_acceleration value"; } //-------------------------------------------------------- else if(word == "_scale_acceleration") { if(get_next_number(in, number, line_number)) { _scale_acceleration = number; math_success = true; } else report = "missing _scale_acceleration value"; } //-------------------------------------------------------- else if(word == "rotate_acceleration") { if(get_next_number(in, number, line_number)) { rotate_acceleration = number; math_success = true; } else report = "missing rotate_acceleration value"; } //-------------------------------------------------------- else if(word == "_rotate_acceleration") { if(get_next_number(in, number, line_number)) { _rotate_acceleration = number; math_success = true; } else report = "missing _rotate_acceleration value"; } //-------------------------------------------------------- else if(word == "fulcrum_acceleration") { if(get_next_number(in, number, line_number)) { fulcrum_acceleration = number; math_success = true; } else report = "missing fulcrum_acceleration value"; } //-------------------------------------------------------- else if(word == "_fulcrum_acceleration") { if(get_next_number(in, number, line_number)) { _fulcrum_acceleration = number; math_success = true; } else report = "missing _fulcrum_acceleration value"; } //-------------------------------------------------------- else if( word == "LBO1" || word == "LBO1_" || word == "_LBO1" || word == "_LBO1_" || word == "LBO2" || word == "LBO2_" || word == "_LBO2" || word == "_LBO2_" || word == "LBO3" || word == "LBO3_" || word == "_LBO3" || word == "_LBO3_" || word == "LBO4" || word == "LBO4_" || word == "_LBO4" || word == "_LBO4_" || word == "LBO5" || word == "LBO5_" || word == "_LBO5" || word == "_LBO5_" || word == "LBO6" || word == "LBO6_" || word == "_LBO6" || word == "_LBO6_" ) { int rank, generation; string lbo_name = word, parameter; if(lbo_name[0] == 'L') { generation = 0; rank = atoi(word.substr(3, 1).c_str()) - 1; if(word.size() == 5) { generation = 1; intra_interval = true; } } else { generation = 2; rank = atoi(word.substr(4, 1).c_str()) - 1; if(word.size() == 6) { generation = 3; intra_interval = true; } } if(get_next_word(in, word, line_number)) { parameter = word; if(parameter == "function") { if(get_next_word(in, word, line_number)) { if(LBO_set[generation][rank]->function(word)) math_success = true; else report = word + " is not a valid LBO function"; } } else if(parameter == "amplitude") { if(get_next_number(in, number, line_number)) { LBO_set[generation][rank]->amplitude = number; math_success = true; } else report = lbo_name + " missing amplitude value"; } else if(parameter == "frequency") { if(get_next_number(in, number, line_number)) { LBO_set[generation][rank]->frequency = number; math_success = true; } else report = lbo_name + " missing frequency value"; } else if(parameter == "phase") { if(get_next_number(in, number, line_number)) { LBO_set[generation][rank]->phase = number; math_success = true; } else report = lbo_name + " missing phase value"; } else if(parameter == "duty_cycle") { if(get_next_number(in, number, line_number)) { LBO_set[generation][rank]->duty_cycle = number; math_success = true; } else report = lbo_name + " missing duty_cycle value"; } else if(parameter == "damping") { if(get_next_number(in, number, line_number)) { LBO_set[generation][rank]->damping = number; math_success = true; } else report = lbo_name + " missing damping value"; } else if(parameter == "offset") { if(get_next_number(in, number, line_number)) { LBO_set[generation][rank]->offset = number; math_success = true; } else report = lbo_name + " missing offset value"; } else if(parameter == "sin") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->sin_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "triangle") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->triangle_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "ramp") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->ramp_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "square") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->square_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "pulse") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->pulse_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "trapezoid") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->trapezoid_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "circle") { if(get_next_number(in, number, line_number)) { if(number >= 0 && number <= 1) { LBO_set[generation][rank]->circle_level = number; math_success = true; } else report = lbo_name + " mix must be from 0.0 ~ 1.0"; } else report = lbo_name + " missing " + parameter + " mix value"; } else if(parameter == "reset") { LBO_set[generation][rank]->reset(); math_success = true; } else report = parameter + " is not a valie LBO parameter"; } else report = lbo_name + " missing parameter"; } //-------------------------------------------------------- else if(word == "LBO_reset_all") { LBO1.reset(); LBO2.reset(); LBO3.reset(); LBO4.reset(); LBO5.reset(); LBO6.reset(); LBO1_.reset(); LBO2_.reset(); LBO3_.reset(); LBO4_.reset(); LBO5_.reset(); LBO6_.reset(); _LBO1.reset(); _LBO2.reset(); _LBO3.reset(); _LBO4.reset(); _LBO5.reset(); _LBO6.reset(); _LBO1_.reset(); _LBO2_.reset(); _LBO3_.reset(); _LBO4_.reset(); _LBO5_.reset(); _LBO6_.reset(); math_success = true; } //-------------------------------------------------------- else if(word == "reverse_frames") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->reverse_frame_order(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "collapse_frames") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->collapse_frames(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "reverse_vectors") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->reverse_vector_order(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "to_polar") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->to_polar(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "differences") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->differences(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "sums") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->sums(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "to_rectangular") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->to_rectangular(); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "size") { if(get_next_number(in, number, line_number)) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); if(norm_individually) for(size_t i = 0; i < B->size(); i++) if(norm_with_origin) B->at(i).to_unit_with_origin(false); else B->at(i).to_unit(false); else if(norm_with_origin) B->to_unit_with_origin(false); else B->to_unit(false); A->been_used = true; B->scale_around_origin(number); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } else report = "missing value for size"; } //-------------------------------------------------------- else if(word == "move") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->move(displacement); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "_move") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_move( displacement, _displacement, move_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if( (word == "spread_move") || (word == "move_") ) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->move_(displacement, move_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if( (word == "_spread_move") || (word == "_move_") ) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_move_( displacement, _displacement, move_acceleration, _move_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "scale") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->scale_around_origin(factor); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "_scale") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_scale_around_origin( factor, _factor, scale_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "clip") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->clip(P1, P0, 1.0 / LASERBOY_EPSILON); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "_clip") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_clip( P1, _P1, P0, _P0, 1.0 / LASERBOY_EPSILON ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if( (word == "spread_scale") || (word == "scale_") ) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->scale_( factor, factor_, scale_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if( (word == "_spread_scale") || (word == "_scale_") ) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_scale_( factor, _factor, factor_, _factor_, scale_acceleration, _scale_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "rotate") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->rotate_on_coordinates(fulcrum, fulcrum_, fulcrum_acceleration, rotation ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "_rotate") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_rotate(fulcrum, // from _fulcrum, // _from fulcrum_, // to _fulcrum_, // _to fulcrum_acceleration, _fulcrum_acceleration, rotation, _rotation ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if( (word == "spread_rotate") || (word == "rotate_") ) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->rotate_( fulcrum, fulcrum_, fulcrum_acceleration, rotation, rotate_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if( (word == "_spread_rotate") || (word == "_rotate_") ) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = new LaserBoy_real_segment_set(*B); } else B = new LaserBoy_real_segment_set(*A); A->been_used = true; B->_rotate_( fulcrum, // from _fulcrum, // _from fulcrum_, // to _fulcrum_, // _to fulcrum_acceleration, _fulcrum_acceleration, rotation, _rotation, rotate_acceleration, _rotate_acceleration ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no math frames defined before " + word; } //-------------------------------------------------------- else if(word == "swap") { if(A != NULL && B != NULL) { C = A; A = B; B = C; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "splice") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); *A += *B; delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "composite") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->composite(*B); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "add") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->add(B->at(0)); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "_add") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->_add(*B); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "multiply") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->multiply(B->at(0)); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "_multiply") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->_multiply(*B); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "warp") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->warp(fulcrum, fulcrum_, fulcrum_acceleration, B->at(0) ); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "_warp") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->_warp(fulcrum, // from _fulcrum, // _from fulcrum_, // to _fulcrum_, // _to fulcrum_acceleration, _fulcrum_acceleration, *B ); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "xyz_rgb") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->xyz_rgb(B->at(0)); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "_xyz_rgb") { if(A != NULL && B != NULL) { C = new LaserBoy_real_segment_set(*B); A->_xyz_rgb(*B); delete B; B = A; A = C; A->been_used = true; B->been_used = true; math_success = true; } else report = "two math frame_sets must be defined before " + word; } //-------------------------------------------------------- else if(word == "import_space") { double size = 1.0; if(current.number_of_frames()) // this is the current frame_set { if(get_next_number(in, number, line_number)) size = number; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set(current.to_real_segment_set(false)); C = B; } else { A = new LaserBoy_real_segment_set(current.to_real_segment_set(false)); C = A; } if(norm_individually) { for(size_t i = 0; i < C->size(); i++) { if(norm_with_origin) C->at(i).to_unit_with_origin(false); else C->at(i).to_unit(false); } } else { if(norm_with_origin) C->to_unit_with_origin(false); else C->to_unit(false); } C->scale_around_origin(size); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else report = "no frames currently loaded in LaserBoy app"; } //-------------------------------------------------------- else if(word == "import_txt") { if(get_next_word(in, word, line_number)) { LaserBoy_Error_Code error_code = LASERBOY_OK; if(word.size() < 5 || !iends_with(word, ".txt")) word += ".txt"; if(file_exists(LASERBOY_TXT_SHARE + word)) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } if(!(error_code |= C->from_txt_file(LASERBOY_TXT_SHARE + word))) { if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else if(error_code & LASERBOY_FILE_OPEN_FAILED) report = string("./txt/") + word + " failed to open"; else if(C->size() != 0) report = string("./txt/") + word + " errors reported in ./LaserBoy/txt_in_real_segment_errors.txt."; } else report = string("./txt/") + word + " does not exist"; } else report = "missing txt file name"; } //-------------------------------------------------------- else if(word == "import_dxf") { if(get_next_word(in, word, line_number)) { LaserBoy_Error_Code error_code = LASERBOY_OK; if(directory_exists(LASERBOY_DXF_SHARE + word, p_space->absolute_path_of_LaserBoy)) { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } if(!(error_code |= C->from_dxf_directory(LASERBOY_DXF_SHARE + word))) { if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } else if(error_code & LASERBOY_DIR_OPEN_FAILED) report = string("./dxf/") + word + " failed to open"; else if(error_code & LASERBOY_FILE_OPEN_FAILED) report = string("one or more files in ./dxf/") + word + " failed to open"; } else report = string("./dxf/") + word + " does not exist"; } else report = "missing dxf directory name"; } //-------------------------------------------------------- else if(word == "color_rgb") { if(color.from_ifstream_txt(in, LASERBOY_RGB, line_number, report)) { if(A != NULL) { if(B != NULL) C = B; else C = A; C->strip_color_rgb(color); math_success = true; } else report = "no frames defined to color"; } } //-------------------------------------------------------- else if(word == "color_hex") { if(color.from_ifstream_txt(in, LASERBOY_HEX, line_number, report)) { if(A != NULL) { if(B != NULL) C = B; else C = A; C->strip_color_rgb(color); math_success = true; } else report = "no frames defined to color"; } } //-------------------------------------------------------- else if(word == "color_index_hues") { if(A != NULL) { if(B != NULL) C = B; else C = A; C->index_hues(hues_index_multiple, hues_shift); math_success = true; } else report = "no frames defined to color"; } //-------------------------------------------------------- else if(word == "color_span_hues") { if(A != NULL) { if(B != NULL) C = B; else C = A; C->span_hues(hues_span_factor, hues_shift); math_success = true; } else report = "no frames defined to color"; } //-------------------------------------------------------- else if(word == "color_set_index_hues") { if(A != NULL) { if(B != NULL) C = B; else C = A; C->index_hues_set(hues_index_multiple); math_success = true; } else report = "no frames defined to color"; } //-------------------------------------------------------- else if(word == "color_set_span_hues") { if(A != NULL) { if(B != NULL) C = B; else C = A; C->span_hues_set(hues_span_factor); math_success = true; } else report = "no frames defined to color"; } //-------------------------------------------------------- else if(word == "splice_list_from_name") { if(get_next_word(in, word, line_number)) { if(math_list.size()) { bool name_found = false; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == word) { C = new LaserBoy_real_segment_set; name_found = true; for(size_t j = i; j < math_list.size(); j++) { *C += *(math_list[j]); math_list[j]->been_used = true; } if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; break; } } // end for(size_t i = 0; i < math_list.size(); i++) if(!name_found) report = "no math frames named " + word; } else report = "no math frames defined before splice_frame_sets_from_name"; } else report = "missing frame_set name"; } //-------------------------------------------------------- else if(word == "composite_list_from_name") { if(get_next_word(in, word, line_number)) { if(math_list.size()) { bool name_found = false; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == word) { C = new LaserBoy_real_segment_set; name_found = true; *C = *(math_list[i]); for(size_t j = i + 1; j < math_list.size(); j++) { C->composite(*(math_list[j])); math_list[j]->been_used = true; } if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; break; } } // end for(size_t i = 0; i < math_list.size(); i++) if(!name_found) report = "no math frames named " + word; } else report = "no math frames defined before splice_frame_sets_from_name"; } else report = "missing frame_set name"; } //-------------------------------------------------------- else if(word == "glean_list") { int unused = 0; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name.size() == 0) { if(!math_list[i]->been_used) unused++; delete math_list[i]; math_list.erase(math_list.begin() + i); } } if(unused) report = to_string(unused) + " unused frame_sets delted in glean_list"; else math_success = true; } //-------------------------------------------------------- else if(word == "delist") { if(get_next_word(in, word, line_number)) { bool name_found = false, unused = false; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == word) { name_found = true; if(!math_list[i]->been_used) unused = true; delete math_list[i]; math_list.erase(math_list.begin() + i); break; } } if(!name_found) report = word + " not found in list"; else { if(unused) report = "unused frame_set " + word + " delted in delist"; math_success = true; } } else report = "missing name to delist"; } //-------------------------------------------------------- else if(word == "clear_list") { for(size_t i = 0; i < math_list.size(); i++) delete math_list[i]; math_list.clear(); math_success = true; } //-------------------------------------------------------- else if(word == "render") { if(A != NULL) { LaserBoy_real_segment_set rss; if(include_unit_reference) rss = LaserBoy_real_segment::unit_reference(); if(B != NULL) { B->been_used = true; rss += *B; } else { A->been_used = true; rss += *A; } if(norm_individually) { for(size_t i = 0; i < rss.size(); i++) { if(norm_with_origin) rss.at(i).normalize_vectors_with_origin(false); else rss.at(i).normalize_vectors(false); } } else { if(norm_with_origin) rss.normalize_vectors_with_origin(false); else rss.normalize_vectors(false); } if(get_next_number(in, number, line_number)) { if(number > 0.0 && number <= 1.0) { rss.scale(number); *this += rss; math_frames_rendered += rss.size(); math_success = true; } else { *this += rss; math_frames_rendered += rss.size(); report = "render_result to value must be > 0.0 and <= 1.0"; } } else { rss.scale(to_space); *this += rss; math_frames_rendered += rss.size(); math_success = true; } } else report = "no frames defined to render"; } //-------------------------------------------------------- else if(word == "render_list_from_name") { if(get_next_word(in, word, line_number)) { if(math_list.size()) { bool name_found = false; size_t i, j; for(i = 0; i < math_list.size(); i++) { if(math_list[i]->name == word) { name_found = true; break; } } // end for(...) if(!name_found) report = "no math frames named " + word; else { LaserBoy_real_segment_set rss; if(include_unit_reference) rss = LaserBoy_real_segment::unit_reference(); for(j = i; j < math_list.size(); j++) { rss += *(math_list[j]); math_list[j]->been_used = true; } if(norm_individually) { if(norm_with_origin) for(i = 0; i < rss.size(); i++) rss.at(i).normalize_vectors_with_origin(false); else for(i = 0; i < rss.size(); i++) rss.at(i).normalize_vectors(false); } else { if(norm_with_origin) rss.normalize_vectors_with_origin(false); else rss.normalize_vectors(false); } if(get_next_number(in, number, line_number)) { if(number > 0.0 && number <= 1.0) { rss.scale(number); *this += rss; math_frames_rendered += rss.size(); math_success = true; } else { *this += rss; math_frames_rendered += rss.size(); report = "render_frames to value must be > 0.0 and <= 1.0"; } } else { rss.scale(to_space); *this += rss; math_frames_rendered += rss.size(); math_success = true; } } } else report = "no frames defined to render"; } else report = "missing frames name"; } //-------------------------------------------------------- else if(word == "store") { if(get_next_word(in, word, line_number)) { bool name_found = false; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == word) { name_found = true; break; } } if(!name_found) { if(A != NULL) { if(B != NULL) { C = new LaserBoy_real_segment_set(*B); B->been_used = true; } else { C = new LaserBoy_real_segment_set(*A); A->been_used = true; } math_list.push_back(C); math_list.back()->name = word; math_success = true; } else report = "no math frames defined before store_frames"; } else report = word + " is already defined"; } else { if(math_list.size()) { if(A != NULL) { if(B != NULL) { C = new LaserBoy_real_segment_set(*B); B->been_used = true; } else { C = new LaserBoy_real_segment_set(*A); A->been_used = true; } math_list.push_back(C); math_success = true; } else report = "no math frames defined before store_frames"; } else report = "first frame_set stored in the list must be named"; } } //-------------------------------------------------------- else if(word == "recall") { if(get_next_word(in, word, line_number)) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; for(size_t i = 0; i < math_list.size(); i++) if(math_list[i]->name == word) { *B = *(math_list[i]); math_list[i]->been_used = true; if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; break; } if(!math_success) report = "no math frames named " + word; } else report = "missing frames name"; } //-------------------------------------------------------- else if(word == "save_as_txt") { if(get_next_word(in, word, line_number)) { if(word.size() < 5 || !iends_with(word, ".txt")) word += ".txt"; if( !file_exists(LASERBOY_TXT_SHARE + word) || overwrite_txt_files ) { if(A != NULL) { if(B != NULL) C = B; else C = A; if(!disable_txt) { C->save_as_txt(LASERBOY_TXT_SHARE + word); C->been_used = true; txt_frames_saved += C->size(); } math_success = true; } else report = "no math frames defined before save_as_txt"; } else report = "txt file name already exists"; } else report = "missing txt file name"; } //-------------------------------------------------------- else if(word == "save_list_from_name_as_txt") { if(get_next_word(in, word, line_number)) { string real_segments_name = word; if(get_next_word(in, word, line_number)) { string txt_name = word; if(math_list.size()) { bool name_found = false; LaserBoy_real_segment_set rss; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == real_segments_name) { if(!disable_txt) { for(size_t j = i; j < math_list.size(); j++) { rss += *(math_list[j]); math_list[j]->been_used = true; } rss.save_as_txt(LASERBOY_TXT_SHARE + txt_name); txt_frames_saved += rss.size(); } math_success = true; name_found = true; break; } } // end for(size_t i = 0; i < math_list.size(); i++) if(!name_found) report = "no math frames named " + real_segments_name; } else report = "no math frames defined before save_list_from_name_as_txt"; } else report = "missing bmp directory name"; } else report = "missing frame_set name"; } //-------------------------------------------------------- else if(word == "save_as_dxf") { if(get_next_word(in, word, line_number)) { if(A != NULL) { if(B != NULL) C = B; else C = A; if(!disable_dxf) { C->save_as_dxf_directory(LASERBOY_DXF_SHARE, word, true_color_dxf); C->been_used = true; dxf_frames_saved += C->size(); } math_success = true; } else report = "no math frames defined before save_as_dxf"; } else report = "missing dxf directory name"; } //-------------------------------------------------------- else if(word == "save_list_from_name_as_dxf") { if(get_next_word(in, word, line_number)) { string real_segments_name = word; if(get_next_word(in, word, line_number)) { string dxf_dir_name = word; if(math_list.size()) { bool name_found = false; LaserBoy_real_segment_set rss; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == real_segments_name) { if(!disable_dxf) { for(size_t j = i; j < math_list.size(); j++) { rss += *(math_list[j]); math_list[j]->been_used = true; } rss.save_as_dxf_directory(LASERBOY_DXF_SHARE, dxf_dir_name, true_color_dxf); dxf_frames_saved += rss.size(); } math_success = true; name_found = true; break; } } // end for(size_t i = 0; i < math_list.size(); i++) if(!name_found) report = "no math frames named " + real_segments_name; } else report = "no math frames defined before save_list_from_name_as_dxf"; } else report = "missing bmp directory name"; } else report = "missing frame_set name"; } //-------------------------------------------------------- else if(word == "save_as_bmp") { if(get_next_word(in, word, line_number)) { u_int x_res, y_res; if(get_next_number(in, number, line_number)) { x_res = (u_int)number; if(get_next_number(in, number, line_number)) { y_res = (u_int)number; if(A != NULL) { if(B != NULL) C = B; else C = A; if(bmp_render_vectors || bmp_render_vertices) { if(!disable_bmp) { C->save_as_bmp_directory(LASERBOY_BMP_SHARE, word, x_res, y_res, norm_individually, rendered_line_width, bmp_render_vectors, bmp_render_vertices ); C->been_used = true; bmp_frames_saved += C->size(); } math_success = true; } else report = "either bmp_render_vectors or bmp_render_vertices must be true (1)"; } else report = "no math frames defined before save_as_bmp"; } else report = "missing Y resolution"; } else report = "missing X resolution"; } else report = "missing bmp directory name"; } //-------------------------------------------------------- else if(word == "save_list_from_name_as_bmp") { if(get_next_word(in, word, line_number)) { string real_segments_name = word; if(get_next_word(in, word, line_number)) { u_int x_res, y_res; string bmp_dir_name = word; if(get_next_number(in, number, line_number)) { x_res = (u_int)number; if(get_next_number(in, number, line_number)) { y_res = (u_int)number; if(!disable_bmp) { if(bmp_render_vectors || bmp_render_vertices) { if(math_list.size()) { bool name_found = false; for(size_t i = 0; i < math_list.size(); i++) { if(math_list[i]->name == real_segments_name) { if(bmp_render_vectors || bmp_render_vertices) { LaserBoy_real_segment_set rss; for(size_t j = i; j < math_list.size(); j++) { rss += *(math_list[j]); math_list[j]->been_used = true; } rss.save_as_bmp_directory(LASERBOY_BMP_SHARE, bmp_dir_name, x_res, y_res, norm_individually, rendered_line_width, bmp_render_vectors, bmp_render_vertices ); bmp_frames_saved += rss.size(); math_success = true; name_found = true; break; } } } // end for(size_t i = 0; i < math_list.size(); i++) if(!name_found) report = "no math frames named " + real_segments_name; } else report = "no math frames stored before save_list_from_name_as_bmp"; } else report = "either bmp_render_vectors or bmp_render_vertices must be true"; } else math_success = true; } else report = "missing Y resolution"; } else report = "missing X resolution"; } else report = "missing bmp directory name"; } else report = "missing frame_set name"; } //-------------------------------------------------------- // math frames //-------------------------------------------------------- else if(word == "line") { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::line(P0, P1); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "rectangular_grid_xy") // P0 to P1 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::rectangular_grid_xy(P0, P1, rectangular_grid_x_units, rectangular_grid_y_units ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "rectangular_grid_xz") // P0 to P1 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::rectangular_grid_xz(P0, P1, rectangular_grid_x_units, rectangular_grid_z_units ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "rectangular_grid_yz") // P0 to P1 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::rectangular_grid_yz(P0, P1, rectangular_grid_y_units, rectangular_grid_z_units ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "rectangular_grid_xyz") // P0 to P1 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += ( LaserBoy_real_segment::rectangular_grid_xy(P0, P1, rectangular_grid_x_units, rectangular_grid_y_units ) + LaserBoy_real_segment::rectangular_grid_xz(P0, P1, rectangular_grid_x_units, rectangular_grid_z_units ) + LaserBoy_real_segment::rectangular_grid_yz(P0, P1, rectangular_grid_y_units, rectangular_grid_z_units ) ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_grid_xy") // P0 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::polar_grid_xy(P0, polar_grid_radius_max, polar_grid_radii_units, polar_grid_angle_units ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_grid_xz") // P0 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::polar_grid_xz(P0, polar_grid_radius_max, polar_grid_radii_units, polar_grid_angle_units ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_grid_yz") // P0 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += LaserBoy_real_segment::polar_grid_yz(P0, polar_grid_radius_max, polar_grid_radii_units, polar_grid_angle_units ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_grid_xyz") // P0 { if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = new LaserBoy_real_segment_set; C = B; } else { A = new LaserBoy_real_segment_set; C = A; } *C += ( LaserBoy_real_segment::polar_grid_xy(P0, polar_grid_radius_max, polar_grid_radii_units, polar_grid_angle_units ) + LaserBoy_real_segment::polar_grid_xz(P0, polar_grid_radius_max, polar_grid_radii_units, polar_grid_angle_units ) + LaserBoy_real_segment::polar_grid_yz(P0, polar_grid_radius_max, polar_grid_radii_units, polar_grid_angle_units ) ); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "rhodonea") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::rhodonea(fixed_radius, rhodonea_numerator, rhodonea_denominator, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator_rhodonea") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_rhodonea(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, rhodonea_numerator, rhodonea_denominator, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_rhodonea") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_rhodonea(fixed_radius, rhodonea_numerator, rhodonea_denominator, start, duration, iterations, _fixed_radius, _rhodonea_numerator, _rhodonea_denominator, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator_rhodonea") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_rhodonea(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, rhodonea_numerator, rhodonea_denominator, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _fixed_radius, _rhodonea_numerator, _rhodonea_denominator, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "epicycloid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::epicycloid(fixed_radius, roller_radius, roller_radius, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator_epicycloid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_epicycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_radius, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_epicycloid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_epicycloid(fixed_radius, roller_radius, roller_radius, start, duration, iterations, _fixed_radius, _roller_radius, _roller_radius, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator_epicycloid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_epicycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_radius, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _fixed_radius, _roller_radius, _roller_radius, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "epitrochoid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::epicycloid(fixed_radius, roller_radius, roller_offset, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator_epitrochoid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_epicycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_offset, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_epitrochoid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_epicycloid(fixed_radius, roller_radius, roller_offset, start, duration, iterations, _fixed_radius, _roller_radius, _roller_offset, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator_epitrochoid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_epicycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_offset, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _fixed_radius, _roller_radius, _roller_offset, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "hypocycloid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::hypocycloid(fixed_radius, roller_radius, roller_radius, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator_hypocycloid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_hypocycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_radius, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_hypocycloid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_hypocycloid(fixed_radius, roller_radius, roller_radius, start, duration, iterations, _fixed_radius, _roller_radius, _roller_radius, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator_hypocycloid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_hypocycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_radius, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _fixed_radius, _roller_radius, _roller_radius, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "hypotrochoid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::hypocycloid(fixed_radius, roller_radius, roller_offset, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator_hypotrochoid") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_hypocycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_offset, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_hypotrochoid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_hypocycloid(fixed_radius, roller_radius, roller_offset, start, duration, iterations, _fixed_radius, _roller_radius, _roller_offset, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator_hypotrochoid") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_hypocycloid(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, fixed_radius, roller_radius, roller_offset, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _fixed_radius, _roller_radius, _roller_offset, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator(LBO1, LBO1_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator(LBO1, LBO1_, start, duration, iterations, _LBO1, _LBO1_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "oscillator_sum") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_sum(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_oscillator_sum") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_sum(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if( word == "lissajou" || word == "oscillator_xy" ) { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_xy(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if( word == "_lissajou" || word == "_oscillator_xy" ) { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_xy(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if( word == "lissajou_xyz" || word == "oscillator_xyz" ) { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::oscillator_xyz(LBO1, LBO2, LBO3, LBO1_, LBO2_, LBO3_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if( word == "_lissajou_xyz" || word == "_oscillator_xyz" ) { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_oscillator_xyz(LBO1, LBO2, LBO3, LBO1_, LBO2_, LBO3_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO1_, _LBO2_, _LBO3_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "harmonograph") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::harmonograph(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } // end if(word == "harmonograph") //-------------------------------------------------------- else if(word == "_harmonograph") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_harmonograph(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "harmonograph_xyz") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::harmonograph_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } // end if(word == "harmonograph_xyz") //-------------------------------------------------------- else if(word == "_harmonograph_xyz") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_harmonograph_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO5, _LBO6, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _LBO5_, _LBO6_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "amplitude_mod") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::amplitude_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_amplitude_mod") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_amplitude_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "amplitude_mod_xy") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::amplitude_mod_xy(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_amplitude_mod_xy") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_amplitude_mod_xy(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "amplitude_mod_xyz") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::amplitude_mod_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_amplitude_mod_xyz") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_amplitude_mod_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO5, _LBO6, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _LBO5_, _LBO6_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "frequency_mod") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::frequency_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_frequency_mod") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_frequency_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "frequency_mod_xy") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::frequency_mod_xy(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_frequency_mod_xy") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_frequency_mod_xy(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "frequency_mod_xyz") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::frequency_mod_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_frequency_mod_xyz") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_frequency_mod_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO5, _LBO6, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _LBO5_, _LBO6_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "phase_mod") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::phase_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_phase_mod") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_phase_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "phase_mod_xy") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::phase_mod_xy(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_phase_mod_xy") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_phase_mod_xy(LBO1, LBO2, LBO3, LBO4, LBO1_, LBO2_, LBO3_, LBO4_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "phase_mod_xyz") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::phase_mod_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_phase_mod_xyz") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_phase_mod_xyz(LBO1, LBO2, LBO3, LBO4, LBO5, LBO6, LBO1_, LBO2_, LBO3_, LBO4_, LBO5_, LBO6_, start, duration, iterations, _LBO1, _LBO2, _LBO3, _LBO4, _LBO5, _LBO6, _LBO1_, _LBO2_, _LBO3_, _LBO4_, _LBO5_, _LBO6_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::polar(LBO1, LBO1_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_polar") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_polar(LBO1, LBO1_, start, duration, iterations, _LBO1, _LBO1_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_sum") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::polar_sum(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_polar_sum") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_polar_sum(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_amplitude_mod") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::polar_amplitude_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_polar_amplitude_mod") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_polar_amplitude_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_frequency_mod") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::polar_frequency_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_polar_frequency_mod") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_polar_frequency_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "polar_phase_mod") { C = new LaserBoy_real_segment_set; if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; *C += LaserBoy_real_segment::polar_phase_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations ); if(still_frames > 1) C->repeat_back(still_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else if(word == "_polar_phase_mod") { C = new LaserBoy_real_segment_set; *C = LaserBoy_real_segment_set::_polar_phase_mod(LBO1, LBO2, LBO1_, LBO2_, start, duration, iterations, _LBO1, _LBO2, _LBO1_, _LBO2_, _start, _duration, _iterations, frames ); if(A != NULL) { if(B != NULL) { if(!A->been_used) lost_data = true; delete A; A = B; } B = C; } else A = C; if(first_frames > 1) C->repeat_front(first_frames); if(last_frames > 1) C->repeat_back(last_frames); if(lost_data) report = "unused frame_set deleted at " + word; else math_success = true; } //-------------------------------------------------------- else { // math [nonsense] error_log << file_name << " error on line: " << line_number << " : math " << word << " is not a recognized form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //-------------------------------------------------------- //-------------------------------------------------------- //-------------------------------------------------------- if(divide_by_zero) { error_log << file_name << " error on line: " << line_number << " : " << word << " divide by zero. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //-------------------------------------------------------- else if(!math_success) { error_log << file_name << " error on line: " << line_number << " : " << word << " syntax. (ERROR) " << report << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } // end if(get_next_word(in, word, line_number)) (after finding math) //------------------------------------------------------------ else { // math [nothing] error_log << file_name << " error on line: " << line_number << " \'math\' not followd by any form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //------------------------------------------------------------ } // end else if(word == "math") //---------------------------------------------------------------- //---------------------------------------------------------------- // utf8 //---------------------------------------------------------------- else if(word == "utf8") { bool utf8_success = false; string some_text, report; if(get_next_word(in, word, line_number)) // utf8 (word) { if(word == "codes") { if(get_next_word(in, word, line_number)) // file name { bool fail = false; char32_t uni_char = 0, uni_char_from = 0, uni_char_to = 0; string utf8_name = word; u32string unicode; word.clear(); report.clear(); //------------------------------------------------ get_next_token(in, word, line_number); while(in.good() && word.substr(0, 16) != "<<__TEXT_END__>>") { if(hex_string(word, number)) { uni_char = (char32_t)number; unicode.push_back(uni_char); } else if(word == "range") { get_next_token(in, word, line_number); if(hex_string(word, number)) { uni_char_from = (char32_t)number; get_next_token(in, word, line_number); if(hex_string(word, number)) { uni_char_to = (char32_t)number; if(uni_char_from > uni_char_to) { report += "text codes range is out of order.\n"; fail = true; } else for(uni_char = uni_char_from; uni_char <= uni_char_to; uni_char++) unicode.push_back(uni_char); } // end if(hex_string(word, number)) else { report += " : " + word + " is not valid after text codes range.\n"; fail = true; } } // end if(hex_string(word, number)) else { report += " : " + word + " is not valid after text codes range.\n"; fail = true; } } // end if(word == "range") else if(word.substr(0, 16) != "<<__TEXT_END__>>") { report += " : " + word + " is not valid after text codes range.\n"; fail = true; } if(fail) { string text_end_token = "<<__TEXT_END__>>"; clear_through_string(in, text_end_token, line_number); break; } else get_next_token(in, word, line_number); } // end while(in.good() && word.substr(0, 16) != "<<__TEXT_END__>>") //------------------------------------------------ if( unicode.size() && report.size() == 0 ) { size_t i = 0; u32string characters; sort(unicode.begin(), unicode.end()); for(i = 0; i < unicode.size(); i++) { if(unicode.at(i) > 0x00000020) { characters.push_back(unicode.at(i)); // first visible character break; } } if(characters.size()) { bool has_diacritics = false; char buffer[5]; std::ofstream out((LASERBOY_UTF8_SHARE + utf8_name + ".utf8").c_str(), ios::out); buffer[4] = '\0'; while(i < unicode.size()) { if(characters.back() != unicode.at(i)) characters.push_back(unicode.at(i)); i++; } for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); if(is_diacritic(characters[i])) { has_diacritics = true; out << ' '; } out << buffer; if(is_diacritic(characters[i])) out << ' '; } // end for(i = 0; i < characters.size(); i++) out << endl << endl; out << "........................" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << buffer; out << ' '; } out << endl << endl; if(has_diacritics) { out << "........................" << endl; out << endl; out << utf8_name << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; out << endl << endl; } out << "........................" << endl; out << " frame glyph Unicode" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << characters[i]; if(is_diacritic(characters[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < characters.size(); i++) out << endl; out << "........................" << endl; out.close(); utf8_success = true; } // end if(characters.size()) else report += " : text codes no visible characters found."; } // end else if(report.size() == 0 && unicode.size()) else report += " : text codes no unicode values found."; } // if(get_next_word(in, word, line_number)) // file name else report = " : text codes missing file name."; } // end if(word == "codes") //-------------------------------------------------------- else if(word == "chars") { if(get_next_word(in, word, line_number)) { string all_text, utf8_name = word; word.clear(); report.clear(); //------------------------------------------------ get_next_line(in, some_text, line_number); all_text += some_text; some_text.clear(); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) all_text += some_text; some_text.clear(); get_next_line(in, some_text, line_number); } if(all_text.size()) { u32string unicode = conv_utf8_utf32.from_bytes(all_text); if(unicode.size()) { size_t i = 0; u32string characters; sort(unicode.begin(), unicode.end()); for(i = 0; i < unicode.size(); i++) { if(unicode.at(i) > 0x00000020) { characters.push_back(unicode.at(i)); break; } } if(characters.size()) { bool has_diacritics = false; char buffer[5]; std::ofstream out((LASERBOY_UTF8_SHARE + utf8_name + ".utf8").c_str(), ios::out); buffer[4] = '\0'; while(i < unicode.size()) { if(characters.back() != unicode.at(i)) characters.push_back(unicode.at(i)); i++; } for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); if(is_diacritic(characters[i])) { has_diacritics = true; out << ' '; } out << buffer; if(is_diacritic(characters[i])) out << ' '; } // end for(i = 0; i < characters.size(); i++) out << endl << endl; out << "........................" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << buffer; out << ' '; } out << endl << endl; if(has_diacritics) { out << "........................" << endl; out << endl; out << utf8_name << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; } out << endl; out << "........................" << endl; out << " frame glyph Unicode" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << characters[i]; if(is_diacritic(characters[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < characters.size(); i++) out << "........................" << endl; out << all_text << endl; out << "........................" << endl; out.close(); utf8_success = true; } // end if(characters.size()) else report = " : no text found in text chars."; } // end if(unicode.size()) else report = " : no text found in text chars."; } // end if(all_text.size()) else report = " : no text found in text chars."; } // if(get_next_word(in, word, line_number)) // file name else report = " : text chars missing file name."; } // end else if(word == "chars") //-------------------------------------------------------- else if(word == "chars_to_codes") { if(get_next_word(in, word, line_number)) { string all_text, utf8_name = word; word.clear(); report.clear(); //------------------------------------------------ get_next_line(in, some_text, line_number); all_text += some_text; some_text.clear(); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) all_text += some_text; some_text.clear(); get_next_line(in, some_text, line_number); } if(all_text.size()) { u32string unicode = conv_utf8_utf32.from_bytes(all_text); if(unicode.size()) { size_t i = 0; u32string characters; for(i = 0; i < unicode.size(); i++) { if(unicode.at(i) > 0x00000020) { characters.push_back(unicode.at(i)); break; } } if(characters.size()) { bool has_diacritics = false; char buffer[5]; std::ofstream out((LASERBOY_UTF8_SHARE + utf8_name + ".utf8").c_str(), ios::out); buffer[4] = '\0'; while(i < unicode.size()) { if(characters.back() != unicode.at(i)) characters.push_back(unicode.at(i)); i++; } for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); if(is_diacritic(characters[i])) { has_diacritics = true; out << ' '; } out << buffer; if(is_diacritic(characters[i])) out << ' '; } // end for(i = 0; i < characters.size(); i++) out << endl << endl; out << "........................" << endl; for(i = 0; i < characters.size(); i++) { out << " 0x" << hex << setw(8) << setfill('0') << right << characters[i] << endl; } // end for(i = 0; i < characters.size(); i++) if(has_diacritics) { out << "........................" << endl; out << endl; out << utf8_name << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; } out << "........................" << endl; out << " frame glyph Unicode" << endl; for(i = 0; i < characters.size(); i++) { char_utf32_to_utf8(characters[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; if(is_diacritic(characters[i])) out << ' '; out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << characters[i]; if(is_diacritic(characters[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < characters.size(); i++) out << "........................" << endl; out << endl; out.close(); utf8_success = true; } // end if(characters.size()) else report = " : no text found in text chars."; } // end if(unicode.size()) else report = " : no text found in text chars."; } // end if(all_text.size()) else report = " : no text found in text chars."; } // if(get_next_word(in, word, line_number)) // file name else report = " : text chars missing file name."; } // end else if(word == "chars_to_codes") //-------------------------------------------------------- else if(word == "compare") { do { if(get_next_word(in, word, line_number)) // file_name A { string utf8str, A_name = word; u32string A; if(!get_utf8_index(A, LASERBOY_FONT_SHARE + word + ".utf8")) if(!get_utf8_index(A, LASERBOY_UTF8_SHARE + word + ".utf8")) { report = " : " + word + ".utf8 not found"; break; } if(get_next_word(in, word, line_number)) // file_name B { bool has_diacritics = false; size_t i, j; string utf8_name, B_name = word; u32string B, A_B, B_A, AB; char buffer[5]; buffer[4] = '\0'; if(!get_utf8_index(B, LASERBOY_FONT_SHARE + word + ".utf8")) if(!get_utf8_index(B, LASERBOY_UTF8_SHARE + word + ".utf8")) { report = " : " + word + ".utf8 not found"; break; } utf8_name = A_name + '_'; utf8_name += B_name; std::ofstream out((LASERBOY_UTF8_SHARE + utf8_name + ".utf8").c_str(), ios::out); A_B = A + B; sort( A.begin(), A.end()); sort( B.begin(), B.end()); sort(A_B.begin(), A_B.end()); for(i = 1; i < A_B.size(); i++) if(A_B[i] != A_B[i - 1]) AB.push_back(A_B[i]); A_B.clear(); for(i = 0; i < A.size(); i++) { for(j = 0; j < B.size(); j++) { if(A[i] == B[j]) break; } if(j == B.size()) A_B.push_back(A[i]); } for(i = 0; i < B.size(); i++) { for(j = 0; j < A.size(); j++) { if(B[i] == A[j]) break; } if(j == A.size()) B_A.push_back(B[i]); } //---------------------------------------------- // print to file for(i = 0; i < AB.size(); i++) { char_utf32_to_utf8(AB[i], buffer); if(is_diacritic(AB[i])) out << ' '; out << buffer; if(is_diacritic(AB[i])) out << ' '; } // end for(i = 0; i < AB.size(); i++) out << endl << endl; //---------------------------------------------- out << "........................" << endl; out << A_name << " (in unicode order)" << endl; for(i = 0; i < A.size(); i++) { char_utf32_to_utf8(A[i], buffer); if(is_diacritic(A[i])) out << ' '; out << buffer; if(is_diacritic(A[i])) out << ' '; } // end for(i = 0; i < A.size(); i++) out << endl << endl << A_name << " not in " << B_name << endl; for(i = 0; i < A_B.size(); i++) { char_utf32_to_utf8(A_B[i], buffer); if(is_diacritic(A_B[i])) out << ' '; out << buffer; if(is_diacritic(A_B[i])) out << ' '; } // end for(i = 0; i < A_B.size(); i++) out << endl << endl; out << "........................" << endl; out << B_name << " (in unicode order)" << endl; for(i = 0; i < B.size(); i++) { char_utf32_to_utf8(B[i], buffer); if(is_diacritic(B[i])) out << ' '; out << buffer; if(is_diacritic(B[i])) out << ' '; } // end for(i = 0; i < B.size(); i++) out << endl << endl << B_name << " not in " << A_name << endl; for(i = 0; i < B_A.size(); i++) { char_utf32_to_utf8(B_A[i], buffer); if(is_diacritic(B_A[i])) out << ' '; out << buffer; if(is_diacritic(B_A[i])) out << ' '; } // end for(i = 0; i < B_A.size(); i++) out << endl << endl; out << "........................" << endl; out << A_name << endl; out << " frame glyph Unicode" << endl; for(i = 0; i < A.size(); i++) { char_utf32_to_utf8(A[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; if(is_diacritic(A[i])) { has_diacritics = true; out << ' '; } out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << A[i]; if(is_diacritic(A[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < A.size(); i++) if(has_diacritics) { out << "........................" << endl; out << endl; out << A_name << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; has_diacritics = false; } out << endl << endl; out << "........................" << endl; out << B_name << endl; out << " frame glyph Unicode" << endl; for(i = 0; i < B.size(); i++) { char_utf32_to_utf8(B[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; if(is_diacritic(B[i])) { has_diacritics = true; out << ' '; } out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << B[i]; if(is_diacritic(B[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < B.size(); i++) if(has_diacritics) { out << "........................" << endl; out << endl; out << B_name << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; has_diacritics = false; } out << endl << endl; out << "........................" << endl; out << A_name << " union " << B_name << endl; out << " frame glyph Unicode" << endl; for(i = 0; i < AB.size(); i++) { char_utf32_to_utf8(AB[i], buffer); out << " " << dec << setw(8) << setfill(' ') << right << i << " "; if(is_diacritic(AB[i])) { has_diacritics = true; out << ' '; } out << buffer << " 0x" << hex << setw(8) << setfill('0') << right << AB[i]; if(is_diacritic(AB[i])) out << " O" << buffer << " o" << buffer << " " << buffer; out << endl; } // end for(i = 0; i < AB.size(); i++) out << "........................" << endl; if(has_diacritics) { out << endl; out << A_name << " union " << B_name << " contains diacritic marks that add to the previous character and do not advance the text cursor." << endl; has_diacritics = false; } out << endl; out.close(); utf8_success = true; } // end if(get_next_word(in, word, line_number)) // file_name B } // end if(get_next_word(in, word, line_number)) // file_name A } while(false); } // end else if(word == "compare") //-------------------------------------------------------- else // "utf8 (word)" { error_log << file_name << " error on line: " << line_number << " : " << word << " is not a recognized utf8 form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //-------------------------------------------------------- if(!utf8_success) { error_log << file_name << " error on line: " << line_number << " : " << word << " syntax. (ERROR) " << report << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } // end if(get_next_word(in, word, line_number)) (after finding utf8) //------------------------------------------------------------ else { // utf8 [nothing] error_log << file_name << " error on line: " << line_number << " \'text\' not followd by any form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //------------------------------------------------------------ } // end else if(word == "utf8") //---------------------------------------------------------------- //---------------------------------------------------------------- // text //---------------------------------------------------------------- //---------------------------------------------------------------- else if(word == "text") { bool text_success = false, allow_lit_black_was = p_space->allow_lit_black, no_black_match_was = p_space->no_black_match; string some_text, report; LaserBoy_3D_double line_offset; //------------------------------------------------------------ p_space->allow_lit_black = true; p_space->no_black_match = false; //------------------------------------------------------------ if(get_next_word(in, word, line_number)) { if(word == "fixed_space") { if(get_next_number(in, number, line_number)) { mono_font_space = number; text_success = true; } else report = " : text fixed_space missing value."; } //-------------------------------------------------------- else if(word == "char_width") { if(get_next_number(in, number, line_number)) { char_width = number; text_success = true; } else report = " : text char_width missing value."; } //-------------------------------------------------------- else if(word == "vari_space") { if(get_next_number(in, number, line_number)) { vari_font_space = number; text_success = true; } else report = " : text vari_space missing value."; } //-------------------------------------------------------- else if(word == "vari_gap") { if(get_next_number(in, number, line_number)) { vari_font_gap = number; text_success = true; } else report = " : text vari_gap missing value."; } //-------------------------------------------------------- else if(word == "super_diacritic_gap") { if(get_next_number(in, number, line_number)) { super_diacritic_gap = number; text_success = true; } else report = " : text super_diacritic_gap missing value."; } //-------------------------------------------------------- else if(word == "line_space") { if(get_next_number(in, number, line_number)) { line_space = number; text_success = true; } else report = " : text line_space missing value."; } //-------------------------------------------------------- else if(word == "to_space") { if(get_next_number(in, number, line_number)) { to_space = number; text_success = true; } else report = " : text to_space missing value."; } //-------------------------------------------------------- else if(word == "color_rgb") { if(color.from_ifstream_txt(in, LASERBOY_RGB, line_number, report)) text_success = true; } //-------------------------------------------------------- else if(word == "color_hex") { if(color.from_ifstream_txt(in, LASERBOY_HEX, line_number, report)) text_success = true; } //-------------------------------------------------------- else if(word == "bond_word") { if(get_next_number(in, number, line_number)) { bond_word = (bool)number; text_success = true; } else report = " : text bond_word missing value."; } //-------------------------------------------------------- else if(word == "bond_line") { if(get_next_number(in, number, line_number)) { bond_line = (bool)number; text_success = true; } else report = " : text bond_line missing value."; } //-------------------------------------------------------- else if(word == "move_per_frame") { if(get_next_number(in, number, line_number)) { if(number >= 0) { move_per_frame = number; text_success = true; } } else report = " : text move_per_frame missing value."; } //-------------------------------------------------------- else if(word == "view_span") { if(get_next_number(in, number, line_number)) { if(number >= 0) { view_span = number; text_success = true; } } else report = " : text view_span missing value."; } //-------------------------------------------------------- else if(word == "font_name") { if(get_next_word(in, word, line_number)) { LaserBoy_Error_Code ret = LASERBOY_OK; font_name = word; if(LASERBOY_OK == font_frames.from_ild_file(LASERBOY_FONT_SHARE + font_name + ".ild", bytes_skipped, counter)) { ret = font_frames.get_unicode_index(unicode_char_list); if(ret & LASERBOY_INVALID_UNICODE) { unicode_char_list = conv_utf8_utf32.from_bytes(string("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~")); error_log << file_name << " error on line: " << line_number << " : " << font_name << ".ild contains invalid unicode frame names." << ENDL; } else if(ret & LASERBOY_REDUNDANT_UNICODE) { error_log << file_name << " error on line: " << line_number << " : " << font_name << ".ild contains redundant unicode frame names." << ENDL; } else text_success = true; } // end if(LASERBOY_OK == font_frames.from_ild_file(LASERBOY_FONT_SHARE + font_name + ".ild", bytes_skipped, counter)) else { font_frames.from_ild_file(LASERBOY_FONT_SHARE + "laserellipse.ild", bytes_skipped, counter); font_frames.get_unicode_index(unicode_char_list); error_log << file_name << " error on line: " << line_number << " : " << font_name << " is not a recognized font name. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } // end if(get_next_word(in, word, line_number)) else report = " : text font_name missing value."; } //-------------------------------------------------------- else if(word == "still_frames") { if(get_next_number(in, number, line_number)) { if(number >= 0) { still_frames = (u_int)number; text_success = true; } } else report = " : text still_frames missing value."; } //-------------------------------------------------------- // text generators //-------------------------------------------------------- //-------------------------------------------------------- // font frames //-------------------------------------------------------- else if(word == "characters") // text characters { string all_text; report.clear(); //------------------------------------------------ get_next_line(in, some_text, line_number); all_text += some_text; some_text.clear(); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) all_text += some_text; some_text.clear(); get_next_line(in, some_text, line_number); } if(all_text.size()) { u32string unicode = conv_utf8_utf32.from_bytes(all_text); if(unicode.size()) { size_t i = 0; u32string characters; for(i = 0; i < unicode.size(); i++) if(unicode.at(i) > 0x00000020) characters.push_back(unicode.at(i)); if(characters.size()) { size_t char_index = 0; LaserBoy_real_segment character, diacritc; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; while(char_index < characters.size()) { if(unicode_char_list.find(characters[char_index]) == string::npos) // character not found character = LaserBoy_real_segment(characters[char_index]); else character = font_frames[unicode_char_list.find(characters[char_index])].to_real_segment(); //-------------------------------------------------------------------- while( (char_index + 1) < characters.size() && is_super_diacritic(characters[char_index + 1]) ) { if(unicode_char_list.find(characters[char_index + 1]) == string::npos) // character not found diacritc = LaserBoy_real_segment(characters[char_index + 1]); else { diacritc = font_frames[unicode_char_list.find(characters[char_index + 1])].to_real_segment(); diacritc.move(LaserBoy_3D_double( 0.0, -diacritc.min_y() + character.max_y() + (super_diacritic_gap * LASERBOY_MAX_SHORT), 0.0 ) ); } character += diacritc; character.convert_blank_to_black(); char_index++; } //-------------------------------------------------------------------- while( (char_index + 1) < characters.size() && is_sub_diacritic(characters[char_index + 1]) ) { if(unicode_char_list.find(characters[char_index + 1]) == string::npos) // character not found diacritc = LaserBoy_real_segment(characters[char_index + 1]); else diacritc = font_frames[unicode_char_list.find(characters[char_index + 1])].to_real_segment(); character += diacritc; character.convert_blank_to_black(); char_index++; } rss += character; char_index++; } rss.normalize(false); rss.scale(LaserBoy_3D_double(0.5, 0.5, 0.0)); rss.move(LaserBoy_3D_double(LASERBOY_HALF_SHORT, LASERBOY_HALF_SHORT, 0.0)); frames = rss; *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end if(characters.size()) else report = " : no text found in text chars."; } // end if(unicode.size()) else report = " : no text found in text chars."; } // end if(all_text.size()) else report = " : no text found in text chars."; } //-------------------------------------------------------- else if(word == "compose") // text compose { size_t i, j, k, pos; u32string unicode, diacritics, characters, new_uni, uni_name_list; LaserBoy_3D_double point; LaserBoy_real_segment character, diacritc; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; report.clear(); some_text.clear(); get_next_visible_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { pos = some_text.find("diacritic"); if(pos != string::npos) { if(hex_string(some_text.substr(pos + 10), number)) { if(((char32_t)number)) diacritics.push_back((char32_t)number); } else { report = " : diacritic followed by non hex value in text compose."; break; } } // end if((pos = some_text.find("diacritic")) != string::npos) else { pos = some_text.find("reverse"); if(pos != string::npos) diacritics.push_back((char32_t)0x0001); else { pos = some_text.find("invert"); if(pos != string::npos) diacritics.push_back((char32_t)0x0002); else { pos = some_text.find("rotate"); if(pos != string::npos) diacritics.push_back((char32_t)0x0003); else // next 2 lines are characters and new_uni { unicode = conv_utf8_utf32.from_bytes(some_text); for(i = 0; i < unicode.size(); i++) if(unicode.at(i) > 0x00000020) characters.push_back(unicode.at(i)); if(!characters.size()) { report = " : no character list found in text compose."; break; } get_next_visible_line(in, some_text, line_number); unicode = conv_utf8_utf32.from_bytes(some_text); for(i = 0; i < unicode.size(); i++) if(unicode.at(i) > 0x00000020) new_uni.push_back(unicode.at(i)); if(characters.size() != new_uni.size()) { report = " : number of characters and new unicode names is not the same in text compose."; break; } for(i = 0; i < characters.size(); i++) { if(unicode_char_list.find(characters[i]) == string::npos) // character not found character = LaserBoy_real_segment(characters[i]); else character = font_frames[unicode_char_list.find(characters[i])].to_real_segment(); for(j = 0; j < diacritics.size(); j++) { switch(diacritics[j]) { case 0x0000: break; case 0x0001: point = character.rectangular_center_of(); for(k = 0; k < character.size(); k++) character.at(k) = rotate_vertex_on_coordinates_y(character.at(k), point, pi); break; case 0x0002: point = character.rectangular_center_of(); for(k = 0; k < character.size(); k++) character.at(k) = rotate_vertex_on_coordinates_x(character.at(k), point, pi); break; case 0x0003: point = character.rectangular_center_of(); for(k = 0; k < character.size(); k++) character.at(k) = rotate_vertex_on_coordinates_z(character.at(k), point, pi); break; default: if(unicode_char_list.find(diacritics[j]) == string::npos) // character not found diacritc = LaserBoy_real_segment(diacritics[j]); else diacritc = font_frames[unicode_char_list.find(diacritics[j])].to_real_segment(); if(is_super_diacritic(diacritics[j])) diacritc.move(LaserBoy_3D_double( 0.0, -diacritc.min_y() + character.max_y() + (super_diacritic_gap * LASERBOY_MAX_SHORT), 0.0 ) ); character += diacritc; character.convert_blank_to_black(); break; } } // end for(i = 0; i < diacritcs.size(); i++) rss += character; } // end for(i = 0; i < characters.size(); i++) diacritics.clear(); characters.clear(); uni_name_list += new_uni; new_uni.clear(); } // end else // next 2 lines are characters and new_uni } } } // end if((pos = some_text.find("diacritic")) != string::npos) get_next_visible_line(in, some_text, line_number); } // while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") rss.normalize(false); rss.scale(LaserBoy_3D_double(0.499, 0.499, 0.0)); rss.move(LaserBoy_3D_double(LASERBOY_HALF_SHORT, LASERBOY_HALF_SHORT, 0.0)); frames = rss; if(frames.size() == uni_name_list.size()) for(i = 0; i < frames.size(); i++) frames.at(i).name = as_hex_string(uni_name_list[i]); *this += frames; text_frames_rendered += frames.size(); text_success = true; } //-------------------------------------------------------- //-------------------------------------------------------- // fixed (word) //-------------------------------------------------------- else if(word == "fixed") { if(get_next_word(in, word, line_number)) { if(word == "line") // text fixed line { get_next_visible_line(in, some_text, line_number); LaserBoy_real_segment rs(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs.strip_color_rgb(color); rs.normalize(false); frame = rs; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } // end else if(word == "line") //------------------------------------------------ else if(word == "left") // text fixed left { if(get_next_word(in, word, line_number)) { if(word == "lines") // text fixed left lines { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); if(rs.size()) { rs.strip_color_rgb(color); rss.push_back(rs); rs.clear(); } get_next_line(in, some_text, line_number); } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } //---------------------------------------- else if(word == "pages") // text fixed left pages { int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end else if(word == "pages") // text fixed left pages } // end if(get_next_word(in, word, line_number)) //-------------------------------------------- else { LaserBoy_real_segment rs1, rs2; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.normalize(false); frame = rs1; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } // end else if(word == "left") //------------------------------------------------ else if(word == "right") // text fixed right { if(get_next_word(in, word, line_number)) { if(word == "lines") // text fixed right lines { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); if(rs.size()) { rs.strip_color_rgb(color); line_offset.x = -rs.segment_right().x; rs.move(line_offset); rss.push_back(rs); rs.clear(); } get_next_line(in, some_text, line_number); } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } else if(word == "pages") // text fixed right pages { int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.segment_right().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end else if(word == "pages") // text fixed right pages } // end if(get_next_word(in, word, line_number)) //-------------------------------------------- else // text fixed right { LaserBoy_real_segment rs1, rs2; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.segment_right().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.normalize(false); frame = rs1; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } // end else if(word == "right") //------------------------------------------------ else if(word == "center") // text fixed center { if(get_next_word(in, word, line_number)) { if(word == "lines") // text fixed right lines { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); if(rs.size()) { rs.strip_color_rgb(color); line_offset.x = -rs.rectangular_center_of().x; rs.move(line_offset); rss.push_back(rs); rs.clear(); } get_next_line(in, some_text, line_number); } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } //---------------------------------------- else if(word == "pages") // text fixed center pages { int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.rectangular_center_of().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end else if(word == "pages") // text fixed center pages } //-------------------------------------------- else // text fixed center { LaserBoy_real_segment rs1, rs2; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.rectangular_center_of().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.normalize(false); frame = rs1; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } // end else if(word == "center") //------------------------------------------------ else if(word == "just") // text fixed just { int number_of_lines, line_index, line_number_was, line_diff; LaserBoy_real_segment each_word(LASERBOY_ILDA_DEFAULT, false), each_line(LASERBOY_ILDA_DEFAULT, false), page (LASERBOY_ILDA_DEFAULT, false); LaserBoy_real_segment_set rss; vector rss_S; word.clear(); line_number_was = line_number; while(in.good()) { get_next_token(in, word, line_number); if(word == "<<__TEXT_END__>>") break; if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was - 1); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines rss.clear(); line_number_was = line_number; } rss += LaserBoy_real_segment(font_frames, unicode_char_list, word, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); } // if(word == "<<__TEXT_END__>>") || EOF if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines } rss.clear(); number_of_lines = (int)rss_S.size(); if(number_of_lines > 0) { int word_index, number_of_words = 0; double words_width = 0.0, line_width = 0.0, widest_line = 0.0, word_gap = 0.0; LaserBoy_3D_double word_offset; for(line_index = 0; line_index < number_of_lines; line_index++) { number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; line_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); line_width = words_width + ( (number_of_words - 1) * LASERBOY_MAX_SHORT * mono_font_space ); if(widest_line < line_width) widest_line = line_width; } // end for(line_index = 0; line_index < rss_S.size(); line_index++) word_offset.x = 0.0; word_offset.y = 0.0; word_offset.z = 0.0; for(line_index = 0; line_index < number_of_lines; line_index++) { word_offset.x = 0.0; number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) // more than one word. word_gap = (widest_line - words_width) / (number_of_words - 1); else word_gap = 0.0; if(number_of_words > 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; word_offset.x += (each_word.width() + word_gap); for(word_index = 1; word_index < number_of_words; word_index++) { each_word = rss_S.at(line_index).at(word_index); each_word.move(word_offset); if(bond_line) each_word.front().black(); each_line += each_word; word_offset.x += (each_word.width() + word_gap); } } else if(number_of_words == 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; } if(each_line.size() && bond_line) { each_line.convert_blank_to_black(); each_line.front().blank(); } page += each_line; each_line.clear(); word_offset.y -= (LASERBOY_MAX_SHORT * line_space); } // end for(size_t line_index = 0; line_index < rss_S.size(); line_index++) page.strip_color_rgb(color); page.normalize(false); frame = page; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } // end if(rss_S.size()) rss_S.clear(); } // end else if(word == "just") //------------------------------------------------ else if(word == "at") // text fixed at { if(get_next_word(in, word, line_number)) { if(word == "pages") // text fixed at pages { if(get_next_number(in, number, line_number)) { double chars_per_space = number; if(get_next_number(in, number, line_number)) { double x_pos = number; if(get_next_number(in, number, line_number)) { int line_number_was = line_number; double y_pos = number + 1; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.move(LaserBoy_3D_double(x_pos * LASERBOY_MAX_SHORT, y_pos * LASERBOY_MAX_SHORT, 0.0 ) ); rss.scale_around_origin(1.0 / chars_per_space); rss.clip(); frames = rss; *this += frames; text_frames_rendered += frames.size(); text_success = true; } // if(get_next_number(in, number, line_number)) y_pos } // if(get_next_number(in, number, line_number)) x_pos } // if(get_next_number(in, number, line_number)) chars_per_space } // end if(word == "pages") } // end if(get_next_word(in, word, line_number)) //-------------------------------------------- else // text fixed at { if(get_next_number(in, number, line_number)) { double chars_per_space = number; if(get_next_number(in, number, line_number)) { double x_pos = number; if(get_next_number(in, number, line_number)) { double y_pos = number; LaserBoy_real_segment rs1, rs2; while(in.good() && some_text.size() == 0) get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.move(LaserBoy_3D_double(x_pos * LASERBOY_MAX_SHORT, y_pos * LASERBOY_MAX_SHORT, 0.0 ) ); rs1.scale_around_origin(1.0 / chars_per_space); rs1.clip(); frame = rs1; for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } } } } // end else if(word == "at") //------------------------------------------------ // animated! //------------------------------------------------ else if(word == "marquee") // text fixed marquee { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.x = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.y = -rs1.height() / 2.0; max.y = rs1.height() / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.x = rs1.segment_left().x - ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.width() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text fixed marquee."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.x += the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end else if(word == "marquee") //------------------------------------------------ else if(word == "scroll") // text fixed scroll { if(get_next_word(in, word, line_number)) { if(word == "left") // text fixed scroll left { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -rs1.width() / 2.0; max.x = rs1.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.y = rs1.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text fixed scroll left."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(word == "left") //---------------------------------------- else if(word == "right") // text fixed scroll right { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.segment_right().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -rs1.width() / 2.0; max.x = rs1.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.y = rs1.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text fixed scroll right."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(word == "right") //---------------------------------------- else if(word == "center") // text fixed scroll center { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.rectangular_center_of().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -rs1.width() / 2.0; max.x = rs1.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.y = rs1.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text fixed scroll center."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(word == "center") //---------------------------------------- else if(word == "just") // text fixed scroll just { u_int i, last_i; int number_of_lines, line_index, line_number_was, line_diff; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment each_word(LASERBOY_ILDA_DEFAULT, false), each_line(LASERBOY_ILDA_DEFAULT, false), page (LASERBOY_ILDA_DEFAULT, false); LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; vector rss_S; word.clear(); line_number_was = line_number; while(in.good()) { get_next_token(in, word, line_number); if(word == "<<__TEXT_END__>>") break; if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was - 1); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines rss.clear(); line_number_was = line_number; } rss += LaserBoy_real_segment(font_frames, unicode_char_list, word, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); } // if(word == "<<__TEXT_END__>>") || EOF if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines } rss.clear(); number_of_lines = (int)rss_S.size(); if(number_of_lines > 0) { int word_index, number_of_words = 0; double words_width = 0.0, line_width = 0.0, widest_line = 0.0, word_gap = 0.0; LaserBoy_3D_double word_offset; for(line_index = 0; line_index < number_of_lines; line_index++) { number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; line_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); line_width = words_width + ( (number_of_words - 1) * LASERBOY_MAX_SHORT * mono_font_space ); if(widest_line < line_width) widest_line = line_width; } // end for(line_index = 0; line_index < rss_S.size(); line_index++) word_offset.x = 0.0; word_offset.y = 0.0; word_offset.z = 0.0; for(line_index = 0; line_index < number_of_lines; line_index++) { word_offset.x = 0.0; number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) // more than one word. word_gap = (widest_line - words_width) / (number_of_words - 1); else word_gap = 0.0; if(number_of_words > 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; word_offset.x += (each_word.width() + word_gap); for(word_index = 1; word_index < number_of_words; word_index++) { each_word = rss_S.at(line_index).at(word_index); each_word.move(word_offset); if(bond_line) each_word.front().black(); each_line += each_word; word_offset.x += (each_word.width() + word_gap); } } else if(number_of_words == 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; } if(each_line.size() && bond_line) { each_line.convert_blank_to_black(); each_line.front().blank(); } page += each_line; each_line.clear(); word_offset.y -= (LASERBOY_MAX_SHORT * line_space); } // end for(size_t line_index = 0; line_index < rss_S.size(); line_index++) page.strip_color_rgb(color); min.x = -page.width() / 2.0; max.x = page.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = page.rectangular_center_of(); center.y = page.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( page.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; rss.clear(); p_space->p_GUI->display_state("rendering text fixed scroll just."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); each_line = page; each_line.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(each_line); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(rss_S.size()) rss_S.clear(); } // end else if(word == "just") //---------------------------------------- else if(word == "starwars") // text fixed scroll starwars { u_int i, last_i; int number_of_lines, line_index, line_number_was, line_diff; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_palette palette; LaserBoy_real_segment each_word(LASERBOY_ILDA_DEFAULT, false), each_line(LASERBOY_ILDA_DEFAULT, false), page (LASERBOY_ILDA_DEFAULT, false); LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; vector rss_S; word.clear(); line_number_was = line_number; while(in.good()) { get_next_token(in, word, line_number); if(word == "<<__TEXT_END__>>") break; if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was - 1); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines rss.clear(); line_number_was = line_number; } rss += LaserBoy_real_segment(font_frames, unicode_char_list, word, char_width, mono_font_space, super_diacritic_gap, bond_word, bond_line ); } // if(word == "<<__TEXT_END__>>") || EOF if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines } rss.clear(); number_of_lines = (int)rss_S.size(); if(number_of_lines > 0) { int word_index, number_of_words = 0; double words_width = 0.0, line_width = 0.0, widest_line = 0.0, word_gap = 0.0, window_height = 0.0; LaserBoy_3D_double word_offset; for(line_index = 0; line_index < number_of_lines; line_index++) { number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; line_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); line_width = words_width + ( (number_of_words - 1) * LASERBOY_MAX_SHORT * mono_font_space ); if(widest_line < line_width) widest_line = line_width; } // end for(line_index = 0; line_index < rss_S.size(); line_index++) word_offset.x = 0.0; word_offset.y = 0.0; word_offset.z = 0.0; for(line_index = 0; line_index < number_of_lines; line_index++) { word_offset.x = 0.0; number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) // more than one word. word_gap = (widest_line - words_width) / (number_of_words - 1); else word_gap = 0.0; if(number_of_words > 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; word_offset.x += (each_word.width() + word_gap); for(word_index = 1; word_index < number_of_words; word_index++) { each_word = rss_S.at(line_index).at(word_index); each_word.move(word_offset); if(bond_line) each_word.front().black(); each_line += each_word; word_offset.x += (each_word.width() + word_gap); } } else if(number_of_words == 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; } if(each_line.size() && bond_line) { each_line.convert_blank_to_black(); each_line.front().blank(); } page += each_line; each_line.clear(); word_offset.y -= (LASERBOY_MAX_SHORT * line_space); } // end for(size_t line_index = 0; line_index < rss_S.size(); line_index++) line_width = page.width(); min.x = -line_width / 2.0; max.x = line_width / 2.0; min.y = -line_width; max.y = line_width; min.z = -32767.0; max.z = 32767.0; center = page.rectangular_center_of(); center.y = page.segment_top().y + line_width; window_height = line_width * 2.0; last_i = (u_int)( ( (page.height() / LASERBOY_MAX_SHORT) // whole page + (window_height / LASERBOY_MAX_SHORT) // the window ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; rss.clear(); page.strip_color_rgb(color); page.palette_index = LASERBOY_TRUE_COLOR; page.add_lit_span_vertices(512); for(i = 0; i < 256; i++) palette.push_back(color.blend(LaserBoy_color(0, 0, 0), i / 255.0)); palette.first = 0; palette.last = 254; palette.white = 0; palette.black = 255; palette.name = GUID8char(); *p_space += palette; p_space->p_GUI->display_state("rendering text fixed scroll starwars."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); each_line = page; each_line.clip_around_coordinate(center, max, min, 65536.0); for(size_t _i = 0; _i < each_line.size(); _i++) { words_width = (window_height - (each_line.at(_i).y + max.y)) / window_height; if(each_line.at(_i).is_color()) { each_line.at(_i).r = color.r * words_width; each_line.at(_i).g = color.g * words_width; each_line.at(_i).b = color.b * words_width; } } for(size_t _i = 0; _i < each_line.size(); _i++) { words_width = (window_height - each_line.at(_i).y) / window_height; words_width *= 0.5; each_line.at(_i) = LaserBoy_3D_double(each_line.at(_i).x, each_line.at(_i).y * words_width, -each_line.at(_i).y ); } for(size_t _i = 0; _i < each_line.size(); _i++) { words_width = (window_height - (each_line.at(_i).y + max.y)) / window_height; words_width *= 2.0; each_line.at(_i) = LaserBoy_3D_double(each_line.at(_i).x * words_width, each_line.at(_i).y, -each_line.at(_i).y ); } each_line.reduce_lit_vectors(); each_line.best_match_palette(p_space->number_of_palettes() - 1); rss.push_back(each_line); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(rss_S.size()) rss_S.clear(); } // end else if(word == "starwars") else // end if(word == "left") { error_log << file_name << " error on line: " << line_number << " : text fixed scroll " << word << " is not a recognized form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } } // end else if(word == "scroll") } } // end if(word == "fixed") //-------------------------------------------------------- // text generators //-------------------------------------------------------- // variable //-------------------------------------------------------- else if(word == "variable") { if(get_next_word(in, word, line_number)) { if(word == "line") // text variable line { get_next_visible_line(in, some_text, line_number); LaserBoy_real_segment rs(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs.strip_color_rgb(color); rs.normalize(false); frame = rs; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } // end else if(word == "line") //------------------------------------------------ else if(word == "left") // text variable left { if(get_next_word(in, word, line_number)) { if(word == "lines") // text variable left lines { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); if(rs.size()) { rs.strip_color_rgb(color); rss.push_back(rs); rs.clear(); } get_next_line(in, some_text, line_number); } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end if(word == "lines") //---------------------------------------- else if(word == "pages") // text variable left pages { int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } //-------------------------------------------- } // end if(get_next_word(in, word, line_number)) else // text variable left { LaserBoy_real_segment rs1, rs2; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.normalize(false); frame = rs1; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } //------------------------------------------------ else if(word == "right") // text variable right { if(get_next_word(in, word, line_number)) { if(word == "lines") // text fixed left lines { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); if(rs.size()) { rs.strip_color_rgb(color); line_offset.x = -rs.segment_right().x; rs.move(line_offset); rss.push_back(rs); rs.clear(); } get_next_line(in, some_text, line_number); } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end if(word == "lines") //---------------------------------------- else if(word == "pages") // text variable left pages { int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.segment_right().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } } //-------------------------------------------- else { LaserBoy_real_segment rs1, rs2; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.segment_right().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.normalize(false); frame = rs1; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } //------------------------------------------------ else if(word == "center") // text variable center { if(get_next_word(in, word, line_number)) { if(word == "lines") // text fixed left lines { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); if(rs.size()) { rs.strip_color_rgb(color); line_offset.x = -rs.rectangular_center_of().x; rs.move(line_offset); rss.push_back(rs); rs.clear(); } get_next_line(in, some_text, line_number); } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } // end if(word == "lines") //---------------------------------------- else if(word == "pages") // text variable left pages { int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.rectangular_center_of().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); text_success = true; } } //-------------------------------------------- else // text variable center { LaserBoy_real_segment rs1, rs2; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.rectangular_center_of().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.normalize(false); frame = rs1; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } } //------------------------------------------------ else if(word == "just") // text variable just { int number_of_lines, line_index, line_number_was, line_diff; LaserBoy_real_segment each_word(LASERBOY_ILDA_DEFAULT, false), each_line(LASERBOY_ILDA_DEFAULT, false), page (LASERBOY_ILDA_DEFAULT, false); LaserBoy_real_segment_set rss; vector rss_S; word.clear(); line_number_was = line_number; while(in.good()) { get_next_token(in, word, line_number); if(word == "<<__TEXT_END__>>") break; if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was - 1); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines rss.clear(); line_number_was = line_number; } rss += LaserBoy_real_segment(font_frames, unicode_char_list, word, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); } // if(word == "<<__TEXT_END__>>") || EOF if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines } rss.clear(); number_of_lines = (int)rss_S.size(); if(number_of_lines > 0) { int word_index, number_of_words = 0; double words_width = 0.0, line_width = 0.0, widest_line = 0.0, word_gap = 0.0; LaserBoy_3D_double word_offset; for(line_index = 0; line_index < number_of_lines; line_index++) { number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; line_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) line_width = words_width + ( (number_of_words - 1) * LASERBOY_MAX_SHORT * vari_font_space ); else line_width = words_width; if(widest_line < line_width) widest_line = line_width; } // end for(line_index = 0; line_index < rss_S.size(); line_index++) word_offset.x = 0.0; word_offset.y = 0.0; word_offset.z = 0.0; for(line_index = 0; line_index < number_of_lines; line_index++) { word_offset.x = 0.0; number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) // more than one word. word_gap = (widest_line - words_width) / (number_of_words - 1); else word_gap = 0.0; if(number_of_words > 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; word_offset.x += (each_word.width() + word_gap); for(word_index = 1; word_index < number_of_words; word_index++) { each_word = rss_S.at(line_index).at(word_index); each_word.move(word_offset); if(bond_line) each_word.front().black(); each_line += each_word; word_offset.x += (each_word.width() + word_gap); } } else if(number_of_words == 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; } if(each_line.size() && bond_line) { each_line.convert_blank_to_black(); each_line.front().blank(); } page += each_line; each_line.clear(); word_offset.y -= (LASERBOY_MAX_SHORT * line_space); } // end for(size_t line_index = 0; line_index < rss_S.size(); line_index++) page.strip_color_rgb(color); page.normalize(false); frame = page; frame.normalize(to_space); for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } // end if(rss_S.size()) rss_S.clear(); } // end else if(word == "just") //------------------------------------------------ else if(word == "at") // text variable at { if(get_next_word(in, word, line_number)) { if(word == "pages") // text variable at pages { if(get_next_number(in, number, line_number)) { double chars_per_space = number; if(get_next_number(in, number, line_number)) { double x_pos = number; if(get_next_number(in, number, line_number)) { double y_pos = number + 1; int line_number_was = line_number; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); line_offset.y += ((line_number - line_number_was) * (LASERBOY_MAX_SHORT * line_space)); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { while( in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>" && some_text.substr(0, 16) != "<<__PAGE_END__>>" ) { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } if(rs1.size()) { rs1.strip_color_rgb(color); rss.push_back(rs1); rs1.clear(); } if(some_text.substr(0, 16) == "<<__TEXT_END__>>") break; get_next_line(in, some_text, line_number); line_offset.y = 0.0; } rss.move(LaserBoy_3D_double(x_pos * LASERBOY_MAX_SHORT, y_pos * LASERBOY_MAX_SHORT, 0.0 ) ); rss.scale_around_origin(1.0 / chars_per_space); rss.clip(); frames = rss; *this += frames; text_frames_rendered += frames.size(); text_success = true; } // if(get_next_number(in, number, line_number)) y_pos } // if(get_next_number(in, number, line_number)) x_pos } // if(get_next_number(in, number, line_number)) chars_per_space } // end if(word == "pages") } // end if(get_next_word(in, word, line_number)) //-------------------------------------------- else // text variable at { if(get_next_number(in, number, line_number)) { double chars_per_space = number; if(get_next_number(in, number, line_number)) { double x_pos = number; if(get_next_number(in, number, line_number)) { double y_pos = number; LaserBoy_real_segment rs1, rs2; while(in.good() && some_text.size() == 0) get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); rs1.move(LaserBoy_3D_double(x_pos * LASERBOY_MAX_SHORT, y_pos * LASERBOY_MAX_SHORT, 0.0 ) ); rs1.scale_around_origin(1.0 / chars_per_space); rs1.clip(); frame = rs1; for(u_int i = 0; i < still_frames; i++) push_back(frame); text_frames_rendered += still_frames; frame.clear(); text_success = true; } // end if(get_next_number(in, number, line_number)) y_pos } // end if(get_next_number(in, number, line_number)) x_pos } // end if(get_next_number(in, number, line_number)) chars_per_space } // end else (word != "pages") } // end else if(word == "at") //------------------------------------------------ else if(word == "marquee") // text variable marquee (animated) { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.x = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.y = -rs1.height() / 2.0; max.y = rs1.height() / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.x = rs1.segment_left().x - ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.width() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text variable marquee."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.x += the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end else if(word == "marquee") //------------------------------------------------ else if(word == "scroll") // text variable scroll { if(get_next_word(in, word, line_number)) { if(word == "left") // text variable scroll left { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -rs1.width() / 2.0; max.x = rs1.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.y = rs1.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text variable scroll left."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(word == "left") //---------------------------------------- else if(word == "right") // text variable scroll right { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.segment_right().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -rs1.width() / 2.0; max.x = rs1.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.y = rs1.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text variable scroll right."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(word == "right") //---------------------------------------- else if(word == "center") // text variable scroll center { u_int i, last_i; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment rs1, rs2; LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; get_next_line(in, some_text, line_number); while(in.good() && some_text.substr(0, 16) != "<<__TEXT_END__>>") { if(some_text.size() > 0) rs2 = LaserBoy_real_segment(font_frames, unicode_char_list, some_text, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); line_offset.x = -rs2.rectangular_center_of().x; rs2.move(line_offset); rs1 += rs2; rs2.clear(); line_offset.y -= (LASERBOY_MAX_SHORT * line_space); get_next_line(in, some_text, line_number); } rs1.strip_color_rgb(color); min.x = -rs1.width() / 2.0; max.x = rs1.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = rs1.rectangular_center_of(); center.y = rs1.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( rs1.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; p_space->p_GUI->display_state("rendering text variable scroll center."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); rs2 = rs1; rs2.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(rs2); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(word == "center") //---------------------------------------- else if(word == "just") // text variable scroll just { u_int i, last_i; int number_of_lines, line_index, line_number_was, line_diff; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_real_segment each_word(LASERBOY_ILDA_DEFAULT, false), each_line(LASERBOY_ILDA_DEFAULT, false), page (LASERBOY_ILDA_DEFAULT, false); LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; vector rss_S; word.clear(); line_number_was = line_number; while(in.good()) { get_next_token(in, word, line_number); if(word == "<<__TEXT_END__>>") break; if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was - 1); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines rss.clear(); line_number_was = line_number; } rss += LaserBoy_real_segment(font_frames, unicode_char_list, word, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); } // if(word == "<<__TEXT_END__>>") || EOF if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines } rss.clear(); number_of_lines = (int)rss_S.size(); if(number_of_lines > 0) { int word_index, number_of_words = 0; double words_width = 0.0, line_width = 0.0, widest_line = 0.0, word_gap = 0.0; LaserBoy_3D_double word_offset; for(line_index = 0; line_index < number_of_lines; line_index++) { number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; line_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); line_width = words_width + ( (number_of_words - 1) * LASERBOY_MAX_SHORT * vari_font_space ); if(widest_line < line_width) widest_line = line_width; } // end for(line_index = 0; line_index < rss_S.size(); line_index++) word_offset.x = 0.0; word_offset.y = 0.0; word_offset.z = 0.0; for(line_index = 0; line_index < number_of_lines; line_index++) { word_offset.x = 0.0; number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) // more than one word. word_gap = (widest_line - words_width) / (number_of_words - 1); else word_gap = 0.0; if(number_of_words > 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; word_offset.x += (each_word.width() + word_gap); for(word_index = 1; word_index < number_of_words; word_index++) { each_word = rss_S.at(line_index).at(word_index); each_word.move(word_offset); if(bond_line) each_word.front().black(); each_line += each_word; word_offset.x += (each_word.width() + word_gap); } } else if(number_of_words == 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; } if(each_line.size() && bond_line) { each_line.convert_blank_to_black(); each_line.front().blank(); } page += each_line; each_line.clear(); word_offset.y -= (LASERBOY_MAX_SHORT * line_space); } // end for(size_t line_index = 0; line_index < rss_S.size(); line_index++) page.strip_color_rgb(color); min.x = -page.width() / 2.0; max.x = page.width() / 2.0; min.y = -(view_span * LASERBOY_MAX_SHORT) / 2.0; max.y = (view_span * LASERBOY_MAX_SHORT) / 2.0; min.z = -32767.0; max.z = 32767.0; center = page.rectangular_center_of(); center.y = page.segment_top().y + ( LASERBOY_MAX_SHORT * ( view_span / 2.0 ) ); last_i = (u_int)( ( ( page.height() / LASERBOY_MAX_SHORT ) + view_span ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; rss.clear(); p_space->p_GUI->display_state("rendering text variable scroll just."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); each_line = page; each_line.clip_around_coordinate(center, max, min, 65536.0); rss.push_back(each_line); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(rss_S.size()) rss_S.clear(); } // end else if(word == "just") //---------------------------------------- else if(word == "starwars") // text variable scroll starwars { u_int i, last_i; int number_of_lines, line_index, line_number_was, line_diff; double the_move = 0.0; LaserBoy_3D_double center, max, min; LaserBoy_palette palette; LaserBoy_real_segment each_word(LASERBOY_ILDA_DEFAULT, false), each_line(LASERBOY_ILDA_DEFAULT, false), page (LASERBOY_ILDA_DEFAULT, false); LaserBoy_real_segment_set rss; LaserBoy_frame_set frames; vector rss_S; word.clear(); line_number_was = line_number; while(in.good()) { get_next_token(in, word, line_number); if(word == "<<__TEXT_END__>>") break; if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was - 1); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines rss.clear(); line_number_was = line_number; } rss += LaserBoy_real_segment(font_frames, unicode_char_list, word, char_width, vari_font_gap, vari_font_space, super_diacritic_gap, bond_word, bond_line ); } // if(word == "<<__TEXT_END__>>") || EOF if(line_number - line_number_was) { rss_S.push_back(rss); for(line_diff = 0; line_diff < (line_number - line_number_was); line_diff++) rss_S.push_back(LaserBoy_real_segment_set()); // empty lines } rss.clear(); number_of_lines = (int)rss_S.size(); if(number_of_lines > 0) { int word_index, number_of_words = 0; double words_width = 0.0, line_width = 0.0, widest_line = 0.0, word_gap = 0.0, window_height = 0.0; LaserBoy_3D_double word_offset; for(line_index = 0; line_index < number_of_lines; line_index++) { number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; line_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); line_width = words_width + ( (number_of_words - 1) * LASERBOY_MAX_SHORT * vari_font_space ); if(widest_line < line_width) widest_line = line_width; } // end for(line_index = 0; line_index < rss_S.size(); line_index++) word_offset.x = 0.0; word_offset.y = 0.0; word_offset.z = 0.0; for(line_index = 0; line_index < number_of_lines; line_index++) { word_offset.x = 0.0; number_of_words = (int)rss_S.at(line_index).size(); words_width = 0.0; for(word_index = 0; word_index < number_of_words; word_index++) words_width += rss_S.at(line_index).at(word_index).width(); if(number_of_words > 1) // more than one word. word_gap = (widest_line - words_width) / (number_of_words - 1); else word_gap = 0.0; if(number_of_words > 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; word_offset.x += (each_word.width() + word_gap); for(word_index = 1; word_index < number_of_words; word_index++) { each_word = rss_S.at(line_index).at(word_index); each_word.move(word_offset); if(bond_line) each_word.front().black(); each_line += each_word; word_offset.x += (each_word.width() + word_gap); } } else if(number_of_words == 1) { each_word = rss_S.at(line_index).at(0); each_word.move(word_offset); // moves in Y each_line += each_word; } if(each_line.size() && bond_line) { each_line.convert_blank_to_black(); each_line.front().blank(); } page += each_line; each_line.clear(); word_offset.y -= (LASERBOY_MAX_SHORT * line_space); } // end for(size_t line_index = 0; line_index < rss_S.size(); line_index++) line_width = page.width(); min.x = -line_width / 2.0; max.x = line_width / 2.0; min.y = -line_width; max.y = line_width; min.z = -32767.0; max.z = 32767.0; center = page.rectangular_center_of(); center.y = page.segment_top().y + line_width; window_height = line_width * 2.0; last_i = (u_int)( ( (page.height() / LASERBOY_MAX_SHORT) // whole page + (window_height / LASERBOY_MAX_SHORT) // the window ) // in squares / move_per_frame ); the_move = LASERBOY_MAX_SHORT * move_per_frame; rss.clear(); page.strip_color_rgb(color); page.palette_index = LASERBOY_TRUE_COLOR; page.add_lit_span_vertices(512); for(i = 0; i < 256; i++) palette.push_back(color.blend(LaserBoy_color(0, 0, 0), i / 255.0)); palette.first = 0; palette.last = 254; palette.white = 0; palette.black = 255; palette.name = GUID8char(); *p_space += palette; p_space->p_GUI->display_state("rendering text variable scroll starwars."); for(i = 0; i <= last_i; i++) { p_space->p_GUI->display_progress(last_i - i); each_line = page; each_line.clip_around_coordinate(center, max, min, 65536.0); for(size_t _i = 0; _i < each_line.size(); _i++) { words_width = (window_height - (each_line.at(_i).y + max.y)) / window_height; if(each_line.at(_i).is_color()) { each_line.at(_i).r = color.r * words_width; each_line.at(_i).g = color.g * words_width; each_line.at(_i).b = color.b * words_width; } } for(size_t _i = 0; _i < each_line.size(); _i++) { words_width = (window_height - each_line.at(_i).y) / window_height; words_width *= 0.5; each_line.at(_i) = LaserBoy_3D_double( each_line.at(_i).x, each_line.at(_i).y * words_width, -each_line.at(_i).y ); } for(size_t _i = 0; _i < each_line.size(); _i++) { words_width = (window_height - (each_line.at(_i).y + max.y)) / window_height; words_width *= 2.0; each_line.at(_i) = LaserBoy_3D_double( each_line.at(_i).x * words_width, each_line.at(_i).y, -each_line.at(_i).y ); } each_line.reduce_lit_vectors(); each_line.best_match_palette(p_space->number_of_palettes() - 1); rss.push_back(each_line); center.y -= the_move; } rss.normalize(false); frames = rss; frames.normalize(to_space); *this += frames; text_frames_rendered += frames.size(); frames.clear(); text_success = true; } // end if(rss_S.size()) rss_S.clear(); } // end else if(word == "starwars") else // end if(word == "left") { error_log << file_name << " error on line: " << line_number << " : text variable scroll " << word << " is not a recognized form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } } // end else if(word == "scroll") } } // end else if(word == "variable") //-------------------------------------------------------- else // "text (word)" { error_log << file_name << " error on line: " << line_number << " : " << word << " is not a recognized text form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //-------------------------------------------------------- //-------------------------------------------------------- //-------------------------------------------------------- if(!text_success) { error_log << file_name << " error on line: " << line_number << " : " << word << " syntax. (ERROR) " << report << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } // end if(get_next_word(in, word, line_number)) (after finding text) //------------------------------------------------------------ else { // text [nothing] error_log << file_name << " error on line: " << line_number << " \'text\' not followd by any form. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //------------------------------------------------------------ p_space->allow_lit_black = allow_lit_black_was; p_space->no_black_match = no_black_match_was; //------------------------------------------------------------ } // end else if(word == "text") //---------------------------------------------------------------- //---------------------------------------------------------------- else { // bad_word! error_log << file_name << " error on line: " << line_number << " \'" << word << "\' is not a LaserBoy text format token. (ERROR)" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } } // end if(get_next_word(in, word, line_number)) p_space->p_GUI->display_progress(++section_count); p_space->p_GUI->display_txt_line_number(line_number); } // end while(in.good()) if(A != NULL && !A->been_used) { error_log << file_name << " unused frame_set in first register at end-of-file." << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; p_space->display_error("unused frame_set in first register at end of file"); p_space->p_GUI->wait_4_Esc(); } if(B != NULL && !B->been_used) { error_log << file_name << " unused frame_set in second register at end-of-file." << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; p_space->display_error("unused frame_set in second register at end of file"); p_space->p_GUI->wait_4_Esc(); } if(math_list.size()) { int unused = 0; for(size_t i = 0; i < math_list.size(); i++) if(math_list[i]->been_used == false) unused++; if(unused) { error_log << file_name << " " << unused << " unused frame_sets in list at end-of-file." << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; p_space->display_error(to_string(unused) + " unused frame_sets in list at end of file"); p_space->p_GUI->wait_4_Esc(); } } if(txt_frames_saved) { p_space->display_message(to_string(txt_frames_saved) + " frames saved as txt"); p_space->p_GUI->wait_4_any_key(); } if(dxf_frames_saved) { p_space->display_message(to_string(dxf_frames_saved) + " frames saved as dxf"); p_space->p_GUI->wait_4_any_key(); } if(bmp_frames_saved) { p_space->display_message(to_string(bmp_frames_saved) + " frames saved as bmp"); p_space->p_GUI->wait_4_any_key(); } if(math_frames_rendered) { p_space->display_message(to_string(math_frames_rendered) + " math frames rendered"); p_space->p_GUI->wait_4_any_key(); } if(text_frames_rendered) { p_space->display_message(to_string(text_frames_rendered) + " text frames rendered"); p_space->p_GUI->wait_4_any_key(); } if( section_count == 0 && math_frames_rendered == 0 && text_frames_rendered == 0 ) { error_log << file_name << " contains nothing to render!" << ENDL; frame_set_error |= LASERBOY_TXT_SYNTAX_ERROR; } //------------------------------------------------------------------------ if(coordinate_real_frames_index.size()) { coordinate_real_segments.normalize(); for(i = 0; i < coordinate_real_frames_index.size(); i++) at(coordinate_real_frames_index[i]) = coordinate_real_segments[i]; } //------------------------------------------------------------------------ p_space->save_txt_with_color = save_txt_with_color_was; p_space->save_txt_color_hex = save_txt_color_hex_was; in.close(); error_log.close(); return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_ctn_file(const string& file, long int& bytes_skipped ) { std::ifstream in(file.c_str(), ios::in | ios::binary); if(in.is_open()) { from_ifstream_ctn(in, bytes_skipped); in.close(); if(size() == 0) // create an empty frame_set { from_nothing(); frame_set_error |= LASERBOY_NO_FRAMES_FOUND; } } else // file failed to open { from_nothing(); frame_set_error |= LASERBOY_FILE_OPEN_FAILED; } return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_fstream_LaserBoy_wav(LaserBoy_wav_header header, std::fstream& in, bool append ) { u_int i, j, span, last; int X_index = header.channel_map.find('X'), Y_index = header.channel_map.find('Y'), Z_index = header.channel_map.find('Z'), r_index = header.channel_map.find('r'), g_index = header.channel_map.find('g'), b_index = header.channel_map.find('b'), i_index = header.channel_map.find('i'), eof_index = -1, unf_index = -1, X_offset = 0, Y_offset = 0, Z_offset = 0, r_offset = 0, g_offset = 0, b_offset = 0, i_offset = 0, eof_offset = 0, unf_offset = 0, offset_max = header.offset[0], offset_min = header.offset[0], total_frames = 0; LaserBoy_frame frame; LaserBoy_vertex vertex; LaserBoy_wav_sample_pointer roll_over, *samples_window; //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening formatted wav"); //------------------------------------------------------------------------ for(i = 0; i < header.num_channels; i++) { if(header.offset[i] > offset_max) offset_max = header.offset[i]; if(header.offset[i] < offset_min) offset_min = header.offset[i]; if(header.LSB_tag[i] == LASERBOY_LSB_END_OF_FRAME) { eof_index = i; eof_offset = -header.offset[i] + 1; } else if(header.LSB_tag[i] == LASERBOY_LSB_UNIQUE_FRAME) { unf_index = i; unf_offset = -header.offset[i] + 1; } } // end for(i = 0; i < header.num_channels; i++) //------------------------------------------------------------------------ if(X_index != (int)string::npos) X_offset = -header.offset[X_index] + 1; if(Y_index != (int)string::npos) Y_offset = -header.offset[Y_index] + 1; if(Z_index != (int)string::npos) Z_offset = -header.offset[Z_index] + 1; if(r_index != (int)string::npos) r_offset = -header.offset[r_index] + 1; if(g_index != (int)string::npos) g_offset = -header.offset[g_index] + 1; if(b_index != (int)string::npos) b_offset = -header.offset[b_index] + 1; if(i_index != (int)string::npos) i_offset = -header.offset[i_index] + 1; //------------------------------------------------------------------------ span = (offset_max - offset_min) + 2; // size of samples_window last = span - 1 ; // last index of samples_window //------------------------------------------------------------------------ samples_window = new LaserBoy_wav_sample_pointer[span]; for(i = 0; i < span; i++) samples_window[i] = new LaserBoy_wav_sample(header.num_channels); //------------------------------------------------------------------------ frame.format = (Z_index != (int)string::npos) ? (LASERBOY_3D_FRAME) : (LASERBOY_2D_FRAME); frame.palette_index = LASERBOY_TRUE_COLOR; //------------------------------------------------------------------------ if(!append) // to the current frame_set { clear(); num_2D_frames = 0; num_3D_frames = 0; } //------------------------------------------------------------------------ for(j = 0; j < last - 1; j++) { roll_over = samples_window[0]; for(i = 0; i < last; i++) samples_window[i] = samples_window[i + 1]; samples_window[last] = roll_over; if(!samples_window[last]->from_fstream_wav(in)) // if EOF { from_nothing(); frame_set_error |= LASERBOY_NO_FRAMES_FOUND; return frame_set_error; } if((header.LaserBoy_wav_mode & LASERBOY_WAVE_POSITIVE) == 0) samples_window[last]->negate(); } //------------------------------------------------------------------------ if(r_index == -1) // no red { if( g_index == (int)string::npos && b_index == (int)string::npos // no green or blue ) { vertex.r = 0xff; vertex.g = 0xff; vertex.b = 0xff; } else // we have either green or blue { vertex.r = 0x00; i_index = (int)string::npos; } } else // we have at least red i_index = (int)string::npos; //------------------------------------------------------------------------ while(true) { roll_over = samples_window[0]; for(i = 0; i < last; i++) samples_window[i] = samples_window[i + 1]; samples_window[last] = roll_over; if(!samples_window[last]->from_fstream_wav(in)) // if EOF break; if((header.LaserBoy_wav_mode & LASERBOY_WAVE_POSITIVE) == 0) samples_window[last]->negate(); //-------------------------------------------------------------------- if(X_index != (int)string::npos) vertex.x = samples_window[X_offset]->channel[X_index]; if(Y_index != (int)string::npos) vertex.y = samples_window[Y_offset]->channel[Y_index]; if(Z_index != (int)string::npos) vertex.z = samples_window[Z_offset]->channel[Z_index]; //-------------------------------------------------------------------- if(r_index != (int)string::npos) { if(header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_R) vertex.r = rescale_to_index(header.color_rescale_r, samples_window[r_offset]->channel[r_index]); else vertex.r = (u_char)abs(samples_window[r_offset]->channel[r_index] >> 7); } //-------------------------------------------------------------------- if(g_index != (int)string::npos) { if(header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_G) vertex.g = rescale_to_index(header.color_rescale_g, samples_window[g_offset]->channel[g_index]); else vertex.g = (u_char)abs(samples_window[g_offset]->channel[g_index] >> 7); } //-------------------------------------------------------------------- if(b_index != (int)string::npos) { if(header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_B) vertex.b = rescale_to_index(header.color_rescale_b, samples_window[b_offset]->channel[b_index]); else vertex.b = (u_char)abs(samples_window[b_offset]->channel[b_index] >> 7); } //-------------------------------------------------------------------- if(i_index != (int)string::npos) { if(header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_I) vertex.r = rescale_to_index(header.color_rescale_i, samples_window[i_offset]->channel[i_index]); else vertex.r = (u_char)abs(samples_window[i_offset]->channel[i_index] >> 7); vertex.g = vertex.r; vertex.b = vertex.r; } //-------------------------------------------------------------------- vertex.k = 0; vertex.c = 0; if((vertex.r + vertex.g + vertex.b) <= (int)p_space->black_level) { vertex.r = vertex.g = vertex.b = 0; vertex.k = LASERBOY_BLANKING_BIT; } frame.push_back(vertex); //-------------------------------------------------------------------- if( eof_index != -1 && (samples_window[eof_offset]->channel[eof_index] & 0x0001) // end of frame ) { frame.is_unique = true; if( unf_index != -1 && (!(samples_window[unf_offset]->channel[unf_index] & 0x0001)) // and we do not find it ) frame.is_unique = false; push_back(frame); frame.clear(); total_frames++; p_space->p_GUI->display_progress(total_frames); } } // end while(true) //------------------------------------------------------------------------ if(frame.size() > 2) // possible left over with no end_of_frame { frame.is_unique = true; if(total_frames) frame.is_unique = (!frame.same_as(back())); push_back(frame); total_frames++; p_space->p_GUI->display_progress(total_frames); } //------------------------------------------------------------------------ frame_set_error = LASERBOY_OK; //------------------------------------------------------------------------ for(i = 0; i < span; i++) delete samples_window[i]; delete samples_window; return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_fstream_qm_wav(LaserBoy_wav_header header, std::fstream& in, bool global_polarity, bool append ) { u_int i, color_sum, static_sample_count = 0, verticies = 0, span, last; int red, green, blue, offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X], offset_min, total_frames = 0; double red_gain = 1.0 / 128.0, green_gain = 1.0 / 128.0, blue_gain = 1.0 / 128.0; LaserBoy_frame frame; LaserBoy_vertex vertex, vertex_1, vertex_2, vertex_3, vertex_4; LaserBoy_wav_sample_pointer roll_over ; LaserBoy_wav_sample_pointer *sample_window; //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening blanked wav"); //------------------------------------------------------------------------ if(p_space->wav_offsets[LASERBOY_CHANNEL_X] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X]; if(p_space->wav_offsets[LASERBOY_CHANNEL_Y] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_Y]; if(p_space->wav_offsets[LASERBOY_CHANNEL_R] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_R]; if(p_space->wav_offsets[LASERBOY_CHANNEL_G] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_G]; if(p_space->wav_offsets[LASERBOY_CHANNEL_B] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_B]; //------------------------------------------------------------------------ p_space->wav_offsets[LASERBOY_CHANNEL_X] -= offset_max; p_space->wav_offsets[LASERBOY_CHANNEL_Y] -= offset_max; p_space->wav_offsets[LASERBOY_CHANNEL_R] -= offset_max; p_space->wav_offsets[LASERBOY_CHANNEL_G] -= offset_max; p_space->wav_offsets[LASERBOY_CHANNEL_B] -= offset_max; //------------------------------------------------------------------------ header.offset[0] = p_space->wav_offsets[LASERBOY_CHANNEL_X]; // use current system offsets header.offset[1] = p_space->wav_offsets[LASERBOY_CHANNEL_Y]; header.offset[2] = p_space->wav_offsets[LASERBOY_CHANNEL_R]; header.offset[3] = p_space->wav_offsets[LASERBOY_CHANNEL_G]; header.offset[4] = p_space->wav_offsets[LASERBOY_CHANNEL_B]; //------------------------------------------------------------------------ offset_min = header.offset[0]; offset_max = header.offset[0]; for(i = 1; i < 6; i++) { if(header.offset[i] > offset_max) offset_max = header.offset[i]; if(header.offset[i] < offset_min) offset_min = header.offset[i]; } //------------------------------------------------------------------------ span = (offset_max - offset_min) + 2; // at least 2 samples! last = span - 1; red = -header.offset[2] + 1; green = -header.offset[3] + 1; blue = -header.offset[4] + 1; //------------------------------------------------------------------------ sample_window = new LaserBoy_wav_sample_pointer[span]; for(i = 0; i < span; i++) sample_window[i] = new LaserBoy_wav_sample(header.num_channels); //------------------------------------------------------------------------ frame.format = LASERBOY_2D_FRAME; frame.palette_index = LASERBOY_TRUE_COLOR; //------------------------------------------------------------------------ if(!append) // to the current frame_set { clear(); num_2D_frames = 0; num_3D_frames = 0; } //------------------------------------------------------------------------ while(true) { roll_over = sample_window[0]; for(i = 0; i < last; i++) sample_window[i] = sample_window[i + 1]; sample_window[last] = roll_over; if(!sample_window[last]->from_fstream_wav(in)) // if EOF break; verticies++; if(global_polarity) sample_window[last]->negate(); //---------------------------------------------------------------- vertex.x = sample_window[1]->channel[0]; vertex.y = sample_window[1]->channel[1]; vertex.z = 0; color_sum = sample_window[red ]->channel[2] + sample_window[green]->channel[3] + sample_window[blue ]->channel[4]; if(color_sum < 2000) // very close to black! { vertex.r = 0; vertex.g = 0; vertex.b = 0; vertex.k = LASERBOY_BLANKING_BIT; vertex.c = 0; // 24 bit if( (vertex | vertex_2) <= p_space->insignificant_distance && (vertex | vertex_4) <= p_space->insignificant_distance ) static_sample_count++; if(static_sample_count > 80) // we found a frame boundary { frame.is_unique = true; if((int)frame.size() > 1) { frame.at(1).blank(); push_back(frame); frame.clear(); } verticies = 0; static_sample_count = 0; while(true) { roll_over = sample_window[0]; for(i = 0; i < last; i++) sample_window[i] = sample_window[i + 1]; sample_window[last] = roll_over; if(!sample_window[last]->from_fstream_wav(in)) // if EOF break; verticies++; if(global_polarity) sample_window[last]->negate(); color_sum = sample_window[red ]->channel[2] + sample_window[green]->channel[3] + sample_window[blue ]->channel[4]; vertex.x = sample_window[1]->channel[0]; vertex.y = sample_window[1]->channel[1]; vertex.z = 0; if(color_sum > 2000) // we have color! break; frame.push_back(vertex); } } vertex_4 = vertex_3; vertex_3 = vertex_2; vertex_2 = vertex_1; vertex_1 = vertex; } else { vertex.r = (u_char)((sample_window[red ]->channel[2] > 0) ? (sample_window[red ]->channel[2] * red_gain) : (0)); vertex.g = (u_char)((sample_window[green]->channel[3] > 0) ? (sample_window[green]->channel[3] * green_gain) : (0)); vertex.b = (u_char)((sample_window[blue ]->channel[4] > 0) ? (sample_window[blue ]->channel[4] * blue_gain) : (0)); vertex.k = 0; vertex.c = 0; static_sample_count = 0; } //---------------------------------------------------------------- if((vertex.r + vertex.g + vertex.b) <= (int)p_space->black_level) { vertex.r = vertex.g = vertex.b = 0; vertex.k = LASERBOY_BLANKING_BIT; } //---------------------------------------------------------------- frame.push_back(vertex); if(verticies == p_space->unframed_wav_stride) { frame.is_unique = true; push_back(frame); frame.clear(); verticies = 0; total_frames++; p_space->p_GUI->display_progress(total_frames); } } // end while(true) //------------------------------------------------------------------------ if(frame.size() > 1) { frame.is_unique = true; push_back(frame); total_frames++; p_space->p_GUI->display_progress(total_frames); } //------------------------------------------------------------------------ frame_set_error = LASERBOY_OK; //------------------------------------------------------------------------ frame_set_error = LASERBOY_OK; //------------------------------------------------------------------------ for(i = 0; i < span; i++) delete sample_window[i]; delete sample_window; return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_fstream_unformatted_wav(LaserBoy_wav_header header, std::fstream& in, bool global_polarity, bool append ) { u_int i, vertices = 0, span, last; int X_index = p_space->wav_channel_map.find('X'), Y_index = p_space->wav_channel_map.find('Y'), Z_index = p_space->wav_channel_map.find('Z'), r_index = p_space->wav_channel_map.find('r'), g_index = p_space->wav_channel_map.find('g'), b_index = p_space->wav_channel_map.find('b'), i_index = p_space->wav_channel_map.find('i'), X_offset = 0, Y_offset = 0, Z_offset = 0, r_offset = 0, g_offset = 0, b_offset = 0, i_offset = 0, offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X], offset_min = p_space->wav_offsets[LASERBOY_CHANNEL_X], total_frames = 0; LaserBoy_frame frame; LaserBoy_vertex vertex; LaserBoy_wav_sample_pointer roll_over; LaserBoy_wav_sample_pointer *samples_window; //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening unformatted wav"); //------------------------------------------------------------------------ if( X_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_X] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X]; //------------------------------------------------------------------------ if( Y_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_Y] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_Y]; //------------------------------------------------------------------------ if( Z_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_Z] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_Z]; //------------------------------------------------------------------------ if( r_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_R] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_R]; //------------------------------------------------------------------------ if( g_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_G] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_G]; //------------------------------------------------------------------------ if( b_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_B] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_B]; //------------------------------------------------------------------------ if( i_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_I] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_I]; //------------------------------------------------------------------------ if(X_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_X] -= offset_max; if(Y_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_Y] -= offset_max; if(Z_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_Z] -= offset_max; if(r_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_R] -= offset_max; if(g_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_G] -= offset_max; if(b_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_B] -= offset_max; if(i_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_I] -= offset_max; //------------------------------------------------------------------------ header.channel_map = p_space->wav_channel_map; //------------------------------------------------------------------------ if(X_index != (int)string::npos) header.offset[X_index] = p_space->wav_offsets[LASERBOY_CHANNEL_X]; // put system offsets into header if(Y_index != (int)string::npos) header.offset[Y_index] = p_space->wav_offsets[LASERBOY_CHANNEL_Y]; if(Z_index != (int)string::npos) header.offset[Z_index] = p_space->wav_offsets[LASERBOY_CHANNEL_Z]; if(r_index != (int)string::npos) header.offset[r_index] = p_space->wav_offsets[LASERBOY_CHANNEL_R]; if(g_index != (int)string::npos) header.offset[g_index] = p_space->wav_offsets[LASERBOY_CHANNEL_G]; if(b_index != (int)string::npos) header.offset[b_index] = p_space->wav_offsets[LASERBOY_CHANNEL_B]; if(i_index != (int)string::npos) header.offset[i_index] = p_space->wav_offsets[LASERBOY_CHANNEL_I]; //------------------------------------------------------------------------ offset_min = header.offset[0]; offset_max = header.offset[0]; for(i = 0; i < header.num_channels; i++) { if(header.offset[i] > offset_max) offset_max = header.offset[i]; if(header.offset[i] < offset_min) offset_min = header.offset[i]; } //------------------------------------------------------------------------ span = (offset_max - offset_min) + 2; // at least 2 samples! last = span - 1; //------------------------------------------------------------------------ if(X_index != (int)string::npos) X_offset = -header.offset[X_index] + 1; if(Y_index != (int)string::npos) Y_offset = -header.offset[Y_index] + 1; if(Z_index != (int)string::npos) Z_offset = -header.offset[Z_index] + 1; if(r_index != (int)string::npos) r_offset = -header.offset[r_index] + 1; if(g_index != (int)string::npos) g_offset = -header.offset[g_index] + 1; if(b_index != (int)string::npos) b_offset = -header.offset[b_index] + 1; if(i_index != (int)string::npos) i_offset = -header.offset[i_index] + 1; //------------------------------------------------------------------------ samples_window = new LaserBoy_wav_sample_pointer[span]; for(i = 0; i < span; i++) samples_window[i] = new LaserBoy_wav_sample(header.num_channels); //------------------------------------------------------------------------ frame.format = LASERBOY_2D_FRAME; frame.palette_index = LASERBOY_TRUE_COLOR; //------------------------------------------------------------------------ if(!append) // to the current frame_set { clear(); num_2D_frames = 0; num_3D_frames = 0; } //------------------------------------------------------------------------ if(r_index == (int)string::npos) // no red { if( g_index == (int)string::npos && b_index == (int)string::npos // no green or blue ) { vertex.r = 0xff; vertex.g = 0xff; vertex.b = 0xff; } else // we have either green or blue { vertex.r = 0x00; i_index = (int)string::npos; } } else // we have at least red i_index = (int)string::npos; //------------------------------------------------------------------------ while(true) { roll_over = samples_window[0]; for(i = 0; i < last; i++) samples_window[i] = samples_window[i + 1]; samples_window[last] = roll_over; if(!samples_window[last]->from_fstream_wav(in)) // if EOF break; vertices++; if(global_polarity) samples_window[last]->negate(); //-------------------------------------------------------------------- if(X_index != (int)string::npos) vertex.x = samples_window[X_offset]->channel[X_index]; if(Y_index != (int)string::npos) vertex.y = samples_window[Y_offset]->channel[Y_index]; if(Z_index != (int)string::npos) vertex.z = samples_window[Z_offset]->channel[Z_index]; if(r_index != (int)string::npos) vertex.r = (u_char)abs(samples_window[r_offset]->channel[r_index] >> 7); if(g_index != (int)string::npos) vertex.g = (u_char)abs(samples_window[g_offset]->channel[g_index] >> 7); if(b_index != (int)string::npos) vertex.b = (u_char)abs(samples_window[b_offset]->channel[b_index] >> 7); if(i_index != (int)string::npos) vertex.r = vertex.g = vertex.b = (u_char)abs(samples_window[i_offset]->channel[i_index] >> 7); //-------------------------------------------------------------------- vertex.k = 0; vertex.c = 0; if((vertex.r + vertex.g + vertex.b) <= (int)p_space->black_level) { vertex.r = vertex.g = vertex.b = 0; vertex.k = LASERBOY_BLANKING_BIT; } frame.push_back(vertex); //-------------------------------------------------------------------- if(!(vertices % p_space->unframed_wav_stride)) { frame.is_unique = true; push_back(frame); frame.clear(); total_frames++; p_space->p_GUI->display_progress(total_frames); } } // end while(true) //------------------------------------------------------------------------ if(frame.size() > 1) { frame.is_unique = true; push_back(frame); total_frames++; p_space->p_GUI->display_progress(total_frames); } //------------------------------------------------------------------------ frame_set_error = LASERBOY_OK; //------------------------------------------------------------------------ for(i = 0; i < span; i++) delete samples_window[i]; delete samples_window; return frame_set_error; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::from_fstream_headerless_LB_wav(LaserBoy_wav_header header, std::fstream& in, bool global_polarity, bool append ) { u_int i, vertices = 0, span, last; int X_index = p_space->wav_channel_map.find('X'), Y_index = p_space->wav_channel_map.find('Y'), Z_index = p_space->wav_channel_map.find('Z'), r_index = p_space->wav_channel_map.find('r'), g_index = p_space->wav_channel_map.find('g'), b_index = p_space->wav_channel_map.find('b'), i_index = p_space->wav_channel_map.find('i'), O_index_1 = p_space->wav_channel_map.find('0'), O_index_2 = p_space->wav_channel_map.find('0', O_index_1 + 1), eof_index = -1, unf_index = -1, X_offset = 0, Y_offset = 0, Z_offset = 0, r_offset = 0, g_offset = 0, b_offset = 0, i_offset = 0, O_offset_1 = 0, O_offset_2 = 0, eof_offset = 0, unf_offset = 0, offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X], offset_min = p_space->wav_offsets[LASERBOY_CHANNEL_X], total_frames = 0; LaserBoy_frame frame; LaserBoy_vertex vertex; LaserBoy_wav_sample_pointer roll_over; LaserBoy_wav_sample_pointer *samples_window; //------------------------------------------------------------------------ p_space->p_GUI->display_state("opening headerless LB wav"); //------------------------------------------------------------------------ header.channel_map = p_space->wav_channel_map; //------------------------------------------------------------------------ if( X_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_X] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X]; //------------------------------------------------------------------------ if( Y_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_Y] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_Y]; //------------------------------------------------------------------------ if( Z_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_Z] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_Z]; //------------------------------------------------------------------------ if( r_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_R] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_R]; //------------------------------------------------------------------------ if( g_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_G] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_G]; //------------------------------------------------------------------------ if( b_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_B] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_B]; //------------------------------------------------------------------------ if( i_index != (int)string::npos && p_space->wav_offsets[LASERBOY_CHANNEL_I] > offset_max ) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_I]; //------------------------------------------------------------------------ if(X_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_X] -= offset_max; if(Y_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_Y] -= offset_max; if(Z_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_Z] -= offset_max; if(r_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_R] -= offset_max; if(g_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_G] -= offset_max; if(b_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_B] -= offset_max; if(i_index != (int)string::npos) p_space->wav_offsets[LASERBOY_CHANNEL_I] -= offset_max; //------------------------------------------------------------------------ if(X_index != (int)string::npos) header.offset[X_index] = p_space->wav_offsets[LASERBOY_CHANNEL_X]; // put system offsets into header if(Y_index != (int)string::npos) header.offset[Y_index] = p_space->wav_offsets[LASERBOY_CHANNEL_Y]; if(Z_index != (int)string::npos) header.offset[Z_index] = p_space->wav_offsets[LASERBOY_CHANNEL_Z]; if(r_index != (int)string::npos) header.offset[r_index] = p_space->wav_offsets[LASERBOY_CHANNEL_R]; if(g_index != (int)string::npos) header.offset[g_index] = p_space->wav_offsets[LASERBOY_CHANNEL_G]; if(b_index != (int)string::npos) header.offset[b_index] = p_space->wav_offsets[LASERBOY_CHANNEL_B]; if(i_index != (int)string::npos) header.offset[i_index] = p_space->wav_offsets[LASERBOY_CHANNEL_I]; if(O_index_1 != (int)string::npos) header.offset[O_index_1] = p_space->wav_offsets[LASERBOY_CHANNEL_R]; if(O_index_2 != (int)string::npos) header.offset[O_index_2] = p_space->wav_offsets[LASERBOY_CHANNEL_G]; //------------------------------------------------------------------------ offset_min = header.offset[0]; offset_max = header.offset[0]; for(i = 0; i < header.num_channels; i++) { if(header.offset[i] > offset_max) offset_max = header.offset[i]; if(header.offset[i] < offset_min) offset_min = header.offset[i]; } //------------------------------------------------------------------------ span = (offset_max - offset_min) + 2; // at least 2 samples! last = span - 1; //------------------------------------------------------------------------ if(X_index != (int)string::npos) X_offset = -header.offset[X_index] + 1; if(Y_index != (int)string::npos) Y_offset = -header.offset[Y_index] + 1; if(Z_index != (int)string::npos) Z_offset = -header.offset[Z_index] + 1; if(r_index != (int)string::npos) r_offset = -header.offset[r_index] + 1; if(g_index != (int)string::npos) g_offset = -header.offset[g_index] + 1; if(b_index != (int)string::npos) b_offset = -header.offset[b_index] + 1; if(i_index != (int)string::npos) i_offset = -header.offset[i_index] + 1; if(O_index_1 != (int)string::npos) O_offset_1 = -header.offset[O_index_1] + 1; if(O_index_2 != (int)string::npos) O_offset_2 = -header.offset[O_index_2] + 1; //------------------------------------------------------------------------ samples_window = new LaserBoy_wav_sample_pointer[span]; for(i = 0; i < span; i++) samples_window[i] = new LaserBoy_wav_sample(header.num_channels); //------------------------------------------------------------------------ frame.format = LASERBOY_2D_FRAME; frame.palette_index = LASERBOY_TRUE_COLOR; //------------------------------------------------------------------------ if(!append) // to the current frame_set { clear(); num_2D_frames = 0; num_3D_frames = 0; } //------------------------------------------------------------------------ if(r_index != (int)string::npos) { eof_index = r_index; eof_offset = r_offset; if(g_index != (int)string::npos) { unf_index = g_index; unf_offset = g_offset; } else if(b_index != (int)string::npos) { unf_index = b_index; unf_offset = b_offset; } else if(i_index != (int)string::npos) { unf_index = i_index; unf_offset = i_offset; } else if(O_index_1 != (int)string::npos) { unf_index = O_index_1; unf_offset = O_offset_1; } } else if(g_index != (int)string::npos) { eof_index = g_index; eof_offset = g_offset; if(b_index != (int)string::npos) { unf_index = b_index; unf_offset = b_offset; } else if(i_index != (int)string::npos) { unf_index = i_index; unf_offset = i_offset; } else if(O_index_1 != (int)string::npos) { unf_index = O_index_1; unf_offset = O_offset_1; } } else if(b_index != (int)string::npos) { eof_index = b_index; eof_offset = b_offset; if(i_index != (int)string::npos) { unf_index = i_index; unf_offset = i_offset; } else if(O_index_1 != (int)string::npos) { unf_index = O_index_1; unf_offset = O_offset_1; } } else if(i_index != (int)string::npos) { eof_index = i_index; eof_offset = i_offset; if(O_index_1 != (int)string::npos) { unf_index = O_index_1; unf_offset = O_offset_1; } } else if(O_index_1 != (int)string::npos) { eof_index = O_index_1; eof_offset = O_offset_1; if(O_index_2 != (int)string::npos) { unf_index = O_index_2; unf_offset = O_offset_2; } } //------------------------------------------------------------------------ if(r_index == (int)string::npos) // no red { if( g_index == (int)string::npos && b_index == (int)string::npos // no green or blue ) { vertex.r = 0xff; vertex.g = 0xff; vertex.b = 0xff; } else // we have either green or blue { vertex.r = 0x00; i_index = (int)string::npos; } } else // we have at least red i_index = (int)string::npos; //------------------------------------------------------------------------ while(true) { roll_over = samples_window[0]; for(i = 0; i < last; i++) samples_window[i] = samples_window[i + 1]; samples_window[last] = roll_over; if(!samples_window[last]->from_fstream_wav(in)) // if EOF break; vertices++; if(global_polarity) samples_window[last]->negate(); //-------------------------------------------------------------------- if(X_index != (int)string::npos) vertex.x = samples_window[X_offset]->channel[X_index]; if(Y_index != (int)string::npos) vertex.y = samples_window[Y_offset]->channel[Y_index]; if(Z_index != (int)string::npos) vertex.z = samples_window[Z_offset]->channel[Z_index]; if(r_index != (int)string::npos) vertex.r = (u_char)abs(samples_window[r_offset]->channel[r_index] >> 7); if(g_index != (int)string::npos) vertex.g = (u_char)abs(samples_window[g_offset]->channel[g_index] >> 7); if(b_index != (int)string::npos) vertex.b = (u_char)abs(samples_window[b_offset]->channel[b_index] >> 7); if(i_index != (int)string::npos) vertex.r = vertex.g = vertex.b = (u_char)abs(samples_window[i_offset]->channel[i_index] >> 7); //-------------------------------------------------------------------- vertex.k = 0; vertex.c = 0; if((vertex.r + vertex.g + vertex.b) <= (int)p_space->black_level) { vertex.r = vertex.g = vertex.b = 0; vertex.k = LASERBOY_BLANKING_BIT; } frame.push_back(vertex); //-------------------------------------------------------------------- if(eof_index != -1) { if(samples_window[eof_offset]->channel[eof_index] & 0x0001) { frame.is_unique = true; if( unf_index != -1 && (!(samples_window[unf_offset]->channel[unf_index] & 0x0001)) // and we do not find it ) frame.is_unique = false; push_back(frame); frame.clear(); total_frames++; p_space->p_GUI->display_progress(total_frames); } } // end if(eof_index != -1 else { if(!(vertices % p_space->unframed_wav_stride)) { frame.is_unique = true; push_back(frame); frame.clear(); total_frames++; p_space->p_GUI->display_progress(total_frames); } } } // end while(true) //------------------------------------------------------------------------ if(frame.size() > 1) { frame.is_unique = true; push_back(frame); total_frames++; p_space->p_GUI->display_progress(total_frames); } //------------------------------------------------------------------------ frame_set_error = LASERBOY_OK; //------------------------------------------------------------------------ for(i = 0; i < span; i++) delete samples_window[i]; delete samples_window; return frame_set_error; } //############################################################################ bool LaserBoy_frame_set::is_ild_busted() { p_space->p_GUI->display_state("checking vertex counts"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(at(i).size() > LASERBOY_MAX_USHORT) return true; } return false; } //############################################################################ bool LaserBoy_frame_set::is_2D(bool silent) { size_t i; if(!silent) { p_space->p_GUI->display_state("checking for 2D"); for(i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(!at(i).is_2D()) return false; } } else { for(i = 0; i < size(); i++) if(!at(i).is_2D()) return false; } return true; } //############################################################################ void LaserBoy_frame_set::flatten_z() { p_space->p_GUI->display_state("flattening Z"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).flatten_z(); } return; } //############################################################################ void LaserBoy_frame_set::flat_to_2D() { p_space->p_GUI->display_state("checking for flat frames"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).flat_to_2D(); } return; } //############################################################################ void LaserBoy_frame_set::z_order_vertices(unsigned short span) { p_space->p_GUI->display_state("Z ordering"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).z_order_vertices(span); } return; } //############################################################################ void LaserBoy_frame_set::unblank_all_vertices() { p_space->p_GUI->display_state("unblanking all"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).unblank_all_vertices(); } return; } //############################################################################ void LaserBoy_frame_set::convert_black_to_blank() { p_space->p_GUI->display_state("converting black to blank"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).convert_black_to_blank(); } return; } //############################################################################ void LaserBoy_frame_set::convert_black_to_color() { p_space->p_GUI->display_state("converting black to color"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).convert_black_to_color(); } return; } //############################################################################ void LaserBoy_frame_set::convert_blank_to_black() { p_space->p_GUI->display_state("converting blank to black"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).convert_blank_to_black(); } return; } //############################################################################ void LaserBoy_frame_set::impose_black_level() { p_space->p_GUI->display_state("imposing black level"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).impose_black_level(); } return; } //############################################################################ void LaserBoy_frame_set::reduce_blank_vectors() { p_space->p_GUI->display_state("reducing blank vectors"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).reduce_blank_vectors(); } return; } //############################################################################ void LaserBoy_frame_set::remove_dots() { p_space->p_GUI->display_state("removing dots"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).remove_dots(); } return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::enhance_dots() { LaserBoy_Error_Code stat = LASERBOY_OK; p_space->p_GUI->display_state("enhancing dots"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); stat |= at(i).enhance_dots(); } return stat; } //############################################################################ void LaserBoy_frame_set::remove_dwell_vertices() { p_space->p_GUI->display_state("removing dwell"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).remove_dwell_vertices(); } return; } //############################################################################ void LaserBoy_frame_set::remove_short_vectors() { p_space->p_GUI->display_state("removing short vectors"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).remove_short_vectors(); } return; } //############################################################################ void LaserBoy_frame_set::reduce_lit_vectors() { p_space->p_GUI->display_state("reducing lit vectors"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).reduce_lit_vectors(); } return; } //############################################################################ void LaserBoy_frame_set::minimize() { p_space->p_GUI->display_state("minimizing frames"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).minimize(i); } return; } //############################################################################ void LaserBoy_frame_set::to_dots() { p_space->p_GUI->display_state("converting to dots"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).to_dots(); } return; } //############################################################################ void LaserBoy_frame_set::impose_bit_resolution() { p_space->p_GUI->display_state("bit reducing"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).impose_bit_resolution(); } return; } //############################################################################ void LaserBoy_frame_set::explode_current_frame() { u_int i; LaserBoy_frame_set results, exploded = current_frame().explode_segments(); for(i = 0; i < frame_index; i++) results += at(i); results += exploded; for(i = frame_index + 1; i < size(); i++) results += at(i); *this = results; return; } //############################################################################ void LaserBoy_frame_set::explode_all_frames() { u_int i; LaserBoy_frame_set results, exploded; p_space->p_GUI->display_state("exploding frames"); for(i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); results += at(i).explode_segments(); } *this = results; return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::collapse_selected_frames() { if(number_of_selected_frames()) { LaserBoy_frame collapsed; int first_selected_frame_index = -1; for(size_t i = 0; i < size(); i++) { if(at(i).is_selected) { if(first_selected_frame_index == -1) first_selected_frame_index = i; collapsed += at(i); } } if(first_selected_frame_index != -1) { frame(first_selected_frame_index) = collapsed; frame(first_selected_frame_index).is_selected = false; delete_selected_frames(); frame_index = first_selected_frame_index; } } return LASERBOY_OK; } //############################################################################ void LaserBoy_frame_set::delete_every_nth_frame(unsigned short n) { LaserBoy_frame_set results; p_space->p_GUI->display_state("omitting frames"); if(n > 1 && n < size()) { for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(i % n) results += at(i); } *this = results; normalize_cursors(); } return; } //############################################################################ void LaserBoy_frame_set::keep_every_nth_frame(unsigned short n) { LaserBoy_frame_set results; p_space->p_GUI->display_state("omitting frames"); if(n > 1 && n < size()) { for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(!(i % n)) results += at(i); } *this = results; normalize_cursors(); } return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::fracture_segments() { LaserBoy_Error_Code stat = LASERBOY_OK; p_space->p_GUI->display_state("fracturing segments"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); stat |= at(i).fracture_segments(); } return stat; } //############################################################################ void LaserBoy_frame_set::omit_equivalent_vectors() { p_space->p_GUI->display_state("blanking equal vectors"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).omit_equivalent_vectors(); } return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::bond_segments() { p_space->p_GUI->display_state("bonding segments in frame"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).bond_segments(); } return LASERBOY_OK; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::reorder_segments() { LaserBoy_Error_Code stat = LASERBOY_OK; LaserBoy_vertex point_of_entry; LaserBoy_segment entry; if(p_space->maintain_first_anchor) point_of_entry = front().first_lit_anchor(); entry.push_back(point_of_entry); entry.push_back(point_of_entry); entry.back().unblank(); stat |= front().reorder_segments(entry); p_space->p_GUI->display_state("reordering segments in frame"); for(size_t i = 1; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); stat |= at(i).reorder_segments(at(i - 1)); } return stat; } //############################################################################ void LaserBoy_frame_set::randomize_segments() { p_space->p_GUI->display_state("randomizing segments in frame"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).randomize_segments(); } return; } //############################################################################ void LaserBoy_frame_set::conglomerate_lit_segments() { p_space->p_GUI->display_state("conglomerating segments in frame"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).conglomerate_lit_segments(); } return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::add_dwell() { LaserBoy_Error_Code stat = LASERBOY_OK; p_space->p_GUI->display_state("adding dwell"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); stat |= at(i).add_dwell(); } return stat; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::add_lit_span_vertices() { LaserBoy_Error_Code stat = LASERBOY_OK; p_space->p_GUI->display_state("adding lit span"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); stat |= at(i).add_lit_span_vertices(); } return stat; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::add_blank_span_vertices() { LaserBoy_Error_Code stat = LASERBOY_OK; p_space->p_GUI->display_state("adding blank span"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); stat |= at(i).add_blank_span_vertices(); } return stat; } //############################################################################ void LaserBoy_frame_set::delete_redundant_frames() { LaserBoy_frame_set reduced; p_space->p_GUI->display_state("omitting frames"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(at(i).is_unique) reduced.push_back(at(i)); } *this = reduced; normalize_cursors(); return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::optimize() { LaserBoy_Error_Code stat = LASERBOY_OK; if(size()) { size_t i; LaserBoy_vertex origin; LaserBoy_frame frame; //---------------------------------------------------------------- p_space->p_GUI->display_state("optimizing frame_set"); //---------------------------------------------------------------- front().minimize(0); // at(0). if(p_space->maintain_first_anchor) stat |= front().optimize(front().first_lit_anchor()); else stat |= front().optimize(origin); //---------------------------------------------------------------- for(i = 1; i < size(); i++) { at(i ).minimize(i); at(i - 1).add_coda(at(i ).front().as_3D_short()); stat |= at(i ).optimize(at(i - 1).back().as_3D_short()); p_space->p_GUI->display_progress(size() - i); } back().add_coda(origin); back().coda += LaserBoy_segment(back().coda.back(), origin); } // end if(size()) return stat; } //############################################################################ void LaserBoy_frame_set::sync_rgb_and_palette() { for(size_t i = 0; i < size(); i++) at(i).sync_rgb_and_palette(); return; } //############################################################################ void LaserBoy_frame_set::index_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette indexing"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).index_palette(p_space->recolor_index_multiple, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::index_segments_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette indexing"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).index_segments_palette(p_space->recolor_index_multiple, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning vectors"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).span_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_x_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning X"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).span_x_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_y_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning Y"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).span_y_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_z_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning Z"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).span_z_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_radial_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning radial"); for(size_t i = 0; i < size(); i++) { at(i).span_radial_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_axial_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning radial"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).span_axial_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_segments_palette() { static int color_offset = 0; //----------------------------------------------------------------------- u_int span = p_space->palette_picker(current_frame().palette_index).last - p_space->palette_picker(current_frame().palette_index).first + 1; //----------------------------------------------------------------------- p_space->p_GUI->display_state("palette spanning radial"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).span_segments_palette(p_space->recolor_span_factor, color_offset); color_offset += p_space->color_frame_shift; color_offset %= span; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::random_color_vectors_palette() { p_space->p_GUI->display_state("random vector palette"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).random_color_vectors_palette(p_space->recolor_index_multiple); p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::random_color_segments_palette() { p_space->p_GUI->display_state("random vector palette"); for(size_t i = 0; i < size(); i++) { at(i).palette_index = p_space->target_palette_index; at(i).random_color_segments_palette(); p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::index_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue indexing"); for(size_t i = 0; i < size(); i++) { at(i).index_hues(p_space->recolor_index_multiple, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::index_segments_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue indexing segments"); for(size_t i = 0; i < size(); i++) { at(i).index_segments_hues(p_space->recolor_index_multiple, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning"); for(size_t i = 0; i < size(); i++) { at(i).span_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_x_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning X"); for(size_t i = 0; i < size(); i++) { at(i).span_x_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_y_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning Y"); for(size_t i = 0; i < size(); i++) { at(i).span_y_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_z_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning Z"); for(size_t i = 0; i < size(); i++) { at(i).span_z_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_radial_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning radial"); for(size_t i = 0; i < size(); i++) { at(i).span_radial_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_axial_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning axial"); for(size_t i = 0; i < size(); i++) { at(i).span_axial_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::span_segments_hues() { static int hues_offset = 0; p_space->p_GUI->display_state("hue spanning segments"); for(size_t i = 0; i < size(); i++) { at(i).span_segments_hues(p_space->recolor_span_factor, hues_offset); hues_offset += p_space->color_frame_shift; hues_offset %= 1530; p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::random_color_vectors_hues() { p_space->p_GUI->display_state("random vector hues"); for(size_t i = 0; i < size(); i++) { if(current_frame().palette_index != LASERBOY_TRUE_COLOR) at(i).palette_index = current_frame().palette_index; else at(i).palette_index = p_space->target_palette_index; at(i).random_color_vectors_hues(p_space->recolor_index_multiple); p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::random_color_segments_hues() { p_space->p_GUI->display_state("random vector hues"); for(size_t i = 0; i < size(); i++) { if(current_frame().palette_index != LASERBOY_TRUE_COLOR) at(i).palette_index = current_frame().palette_index; else at(i).palette_index = p_space->target_palette_index; at(i).random_color_segments_hues(); p_space->p_GUI->display_progress(size() - i); } return; } //############################################################################ void LaserBoy_frame_set::quarter_turn(u_int plane, u_int turns) { p_space->p_GUI->display_state("turning"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).quarter_turn(plane, turns); } return; } //############################################################################ double LaserBoy_frame_set::max_distance_from_origin() const { double max_d = 0, temp; for(size_t i = 0; i < size(); i++) { temp = at(i).max_distance_from_origin(); if(temp >= max_d) max_d = temp; } return max_d; } //############################################################################ double LaserBoy_frame_set::max_distance_from_origin_xy() const { double max_d = 0, temp; for(size_t i = 0; i < size(); i++) { temp = at(i).max_distance_from_origin_xy(); if(temp >= max_d) max_d = temp; } return max_d; } //############################################################################ double LaserBoy_frame_set::min_distance_from_origin() const { double min_d = 80000, temp; for(size_t i = 0; i < size(); i++) { temp = at(i).min_distance_from_origin(); if(temp == 0.0) return 0.0; if(temp < min_d) min_d = temp; } return min_d; } //############################################################################ double LaserBoy_frame_set::min_distance_from_origin_xy() const { double min_d = 80000, temp; for(size_t i = 0; i < size(); i++) { temp = at(i).min_distance_from_origin_xy(); if(temp == 0.0) return 0.0; if(temp < min_d) min_d = temp; } return min_d; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::apply_view() { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("setting view"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).apply_view(); } return out_of_bounds; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::scale_around_origin(LaserBoy_3D_double factor) { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("scaling"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).scale_around_origin(factor); } return out_of_bounds; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::scale_around_origin() { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("scaling"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).scale_around_origin(); } return out_of_bounds; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::rotate_around_origin(LaserBoy_3D_double angle) { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("rotating"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).rotate_around_origin(angle); } return out_of_bounds; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::rotate_around_origin() { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("rotating"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).rotate_around_origin(); } return out_of_bounds; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::move(LaserBoy_3D_double offset) { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("moving"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).move(offset); } return out_of_bounds; } //############################################################################ LaserBoy_Bounds LaserBoy_frame_set::move() { LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS; p_space->p_GUI->display_state("moving"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); out_of_bounds |= at(i).move(); } return out_of_bounds; } //############################################################################ void LaserBoy_frame_set::toggle_frame_select_start() { int i; if(frame_select_start == -1) // was unset { frame_select_start = frame_index; // set if(frame_select_end != -1) { for(i = frame_select_start; i != frame_select_end; (frame_select_start <= frame_select_end) ? (i++) : (i--) ) at(i).is_selected = true; at(frame_select_end).is_selected = true; } } else // was set { if(frame_select_end != -1) // was set { for(i = frame_select_start; i != frame_select_end; (frame_select_start <= frame_select_end) ? (i++) : (i--) ) at(i).is_selected = false; at(frame_select_end).is_selected = false; } frame_select_start = -1; // unset } return; } //############################################################################ void LaserBoy_frame_set::toggle_frame_select_end() { int i; if(frame_select_end == -1) // was unset { frame_select_end = frame_index; // set if(frame_select_start != -1) { for(i = frame_select_start; i != frame_select_end; (frame_select_start <= frame_select_end) ? (i++) : (i--) ) at(i).is_selected = true; at(frame_select_end).is_selected = true; } } else // was set { if(frame_select_start != -1) // was set { for(i = frame_select_start; i != frame_select_end; (frame_select_start <= frame_select_end) ? (i++) : (i--) ) at(i).is_selected = false; at(frame_select_end).is_selected = false; } frame_select_end = -1; // unset } return; } //############################################################################ void LaserBoy_frame_set::invert_frame_selections() { for(size_t i = 0; i < size(); i++) at(i).is_selected = !at(i).is_selected; return; } //############################################################################ void LaserBoy_frame_set::delete_selected_frames() { if(number_of_selected_frames()) { LaserBoy_frame_set reduced; for(size_t i = 0; i < size(); i++) { if(!at(i).is_selected) reduced.push_back(at(i)); } if(reduced.size() == 0) reduced.push_back(LaserBoy_frame()); if( frame_select_start != -1 && frame_select_end != -1 ) { frame_index = (frame_select_start - 1); frame_select_start = -1; frame_select_end = -1; } if(frame_index > reduced.size()) frame_index = reduced.size() - 1; *this = reduced; normalize_cursors(); } return; } //############################################################################ void LaserBoy_frame_set::trim_to_selected_frames() { if(number_of_selected_frames()) { LaserBoy_frame_set reduced; reduced.reserve(size()); for(size_t i = 0; i < size(); i++) { if(at(i).is_selected) reduced.push_back(at(i)); } if( frame_select_start != -1 && frame_select_end != -1 ) { frame_select_start = -1; frame_select_end = -1; } frame_index = 0; *this = reduced; normalize_cursors(); } return; } //############################################################################ void LaserBoy_frame_set::bit_reduce_to_palette() { p_space->p_GUI->display_state("bit palette reducing"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).bit_reduce_to_palette(); } return; } //############################################################################ void LaserBoy_frame_set::best_reduce_to_palette() { p_space->p_GUI->display_state("best palette reducing"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).best_reduce_to_palette(); } return; } //############################################################################ void LaserBoy_frame_set::best_reduce_all_to_palette() { size_t i, j; vector used_palette_indices; LaserBoy_palette super_palette; //------------------------------------------------------------------------ if(frame_set_palette_index() == LASERBOY_TRUE_COLOR) { p_space->p_GUI->display_state("reducing to best palette"); for(i = 0; i < size(); i++) { if(frame_picker(i).palette_index != LASERBOY_TRUE_COLOR) { if(used_palette_indices.size()) // counted any palette indexes? { for(j = 0; j < used_palette_indices.size(); j++) if(frame_picker(i).palette_index == used_palette_indices[j]) // alredy counted it break; if(j == used_palette_indices.size()) { used_palette_indices.push_back(frame_picker(i).palette_index); // count it super_palette += p_space->palette_picker(frame_picker(i).palette_index); } } else { used_palette_indices.push_back(frame_picker(i).palette_index); // count it super_palette += p_space->palette_picker(frame_picker(i).palette_index); } } else super_palette += (frame_picker(i).as_color_table().reorder()); p_space->p_GUI->display_progress(size() - i); } //-------------------------------------------------------------------- super_palette.best_reduction(); // squeeze all that in <= 256 colors super_palette.name = GUID8char(); p_space->push_back_palette(super_palette); //-------------------------------------------------------------------- best_match_palette(p_space->number_of_palettes() - 1); //-------------------------------------------------------------------- } // end if(frame_set_palette_index() == LASERBOY_TRUE_COLOR) used_palette_indices.clear(); return; } //############################################################################ void LaserBoy_frame_set::promote_to_true_color() { p_space->p_GUI->display_state("promoting to 24-bit"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).promote_to_true_color(); } return; } //############################################################################ void LaserBoy_frame_set::best_match_palette(u_int index) { p_space->p_GUI->display_state("best matching palette"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).best_match_palette(index); } return; } //############################################################################ void LaserBoy_frame_set::best_match_target_palette() { if(!p_space->allow_lit_black) convert_black_to_blank(); p_space->p_GUI->display_state("best matching target"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).best_match_target_palette(); } return; } //############################################################################ void LaserBoy_frame_set::strip_color() { p_space->p_GUI->display_state("stripping color to white"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).strip_color(); } return; } //############################################################################ void LaserBoy_frame_set::strip_color_or() { p_space->p_GUI->display_state("stripping color by logical OR"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).strip_color_or(); } return; } //############################################################################ void LaserBoy_frame_set::strip_color_avg() { p_space->p_GUI->display_state("stripping color by averaging"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).strip_color_avg(); } return; } //############################################################################ void LaserBoy_frame_set::to_palette_by_index(u_int index) { p_space->p_GUI->display_state("converting to palette by index"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).to_palette_by_index(index); } return; } //############################################################################ void LaserBoy_frame_set::to_target_palette_by_index() { p_space->p_GUI->display_state("converting to target by index"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).to_target_palette_by_index(); } return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::color_from_bmp(const string& file) { char file_name[256]; struct LaserBoy_bmp bmp = {0}; strcpy(file_name, file.c_str()); if(bmp_from_file(&bmp, file_name)) { color_from_bmp(&bmp); bmp_free(&bmp); return LASERBOY_OK; } return LASERBOY_FILE_OPEN_FAILED; } //############################################################################ void LaserBoy_frame_set::color_from_bmp(struct LaserBoy_bmp* bmp) { p_space->p_GUI->display_state("bitmap coloring"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).color_from_bmp(bmp); } return; } //############################################################################ LaserBoy_Error_Code LaserBoy_frame_set::subtract_bmp(const string& file) { char file_name[256]; struct LaserBoy_bmp bmp = {0}; strcpy(file_name, (file).c_str()); if(bmp_from_file(&bmp, file_name)) { subtract_bmp(&bmp); bmp_free(&bmp); return LASERBOY_OK; } return LASERBOY_FILE_OPEN_FAILED; } //############################################################################ void LaserBoy_frame_set::subtract_bmp(struct LaserBoy_bmp* bmp) { p_space->p_GUI->display_state("bitmap masking"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).subtract_bmp(bmp); } return; } //############################################################################ void LaserBoy_frame_set::flip(int plane) { p_space->p_GUI->display_state("flipping frames"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).flip(plane); } return; } //############################################################################ void LaserBoy_frame_set::renumber() { size_t i; int local_palette_index = LASERBOY_ILDA_DEFAULT, added_palettes = 0, frame_id = 0; bool in_true_color = false; char number[12]; //------------------------------------------------------------------------ for(i = 0; i < size(); i++) { if(at(i).size() > 1) { if(!p_space->save_ild_fmt_4_5) { if(at(i).palette_index == LASERBOY_TRUE_COLOR) { if(!in_true_color) { frame_id++; added_palettes++; // add LASERBOY_REDUCED_332 local_palette_index = LASERBOY_REDUCED_332; in_true_color = true; } frame_id++; added_palettes++; // add true_color } else if(at(i).palette_index != local_palette_index) { frame_id++; added_palettes++; local_palette_index = at(i).palette_index; in_true_color = false; } } at(i).identity = frame_id; if(at(i).name.size() == 0 || at(i).name == "ESI.....") { sprintf(number, "%05d", frame_id); at(i).name = "ESI" + string(number); } frame_id++; } else delete_frame(i); } //------------------------------------------------------------------------ for(i = 0; i < size(); i++) at(i).total = (u_short)(size() + added_palettes); if(frame_index >= size()) frame_index = size() - 1; return; } //############################################################################ u_short LaserBoy_frame_set::max_dimension() const { if(size()) { u_short max = 0; for(size_t i = 0; i < size(); i++) if(at(i).max_dimension() >= max) max = at(i).max_dimension(); return max; } else return 0; } //############################################################################ double LaserBoy_frame_set::relative_volume() const { return (max_dimension() / 65536.0); } //############################################################################ double LaserBoy_frame_set::relative_volume_to_origin() const { double max = 0; for(size_t i = 0; i < size(); i++) if(at(i).relative_volume_to_origin() > max) max = at(i).relative_volume_to_origin(); if(max) return max; return 0.0; } //############################################################################ size_t LaserBoy_frame_set::closest_x_to_edge() const { size_t index = 0; int max = 0; for(size_t i = 0; i < size(); i++) { if(abs(at(i).min_x()) > max) { max = abs(at(i).min_x()); index = i; } if(abs(at(i).max_x()) > max) { max = abs(at(i).max_x()); index = i; } } return index; } //############################################################################ size_t LaserBoy_frame_set::closest_y_to_edge() const { size_t index = 0; int max = 0; for(size_t i = 0; i < size(); i++) { if(abs(at(i).min_y()) > max) { max = abs(at(i).min_y()); index = i; } if(abs(at(i).max_y()) > max) { max = abs(at(i).max_y()); index = i; } } return index; } //############################################################################ size_t LaserBoy_frame_set::closest_z_to_edge() const { size_t index = 0; int max = 0; for(size_t i = 0; i < size(); i++) { if(abs(at(i).min_z()) > max) { max = abs(at(i).min_z()); index = i; } if(abs(at(i).max_z()) > max) { max = abs(at(i).max_z()); index = i; } } return index; } //############################################################################ int LaserBoy_frame_set::frame_set_palette_index() { if(size()) { p_space->sync_rgb_and_palette(); int local_palette_index = at(0).palette_index; for(int i = 1; i < (int)size(); i++) if(local_palette_index != at(i).palette_index) return LASERBOY_TRUE_COLOR; return local_palette_index; } return LASERBOY_ILDA_DEFAULT; } //############################################################################ bool LaserBoy_frame_set::true_color_frames() { if(size()) { p_space->sync_rgb_and_palette(); for(int i = 0; i < (int)size(); i++) if(at(i).palette_index == LASERBOY_TRUE_COLOR) return true; } return false; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::reverse() { LaserBoy_frame_set reversed; p_space->p_GUI->display_state("reversing frame order"); for(size_t i = 1; i <= size(); i++) { p_space->p_GUI->display_progress(size() - i); reversed.push_back(at(size() - i)); } clear(); insert(begin(), reversed.begin(), reversed.end()); return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::make_current_first() { u_int i; LaserBoy_frame_set new_order; //------------------------------------------------------------------------ p_space->p_GUI->display_state("reordering frames"); for(i = frame_index; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); new_order += at(i); } //------------------------------------------------------------------------ for(i = 0; i < frame_index; i++) { p_space->p_GUI->display_progress(frame_index - i); new_order += at(i); } //------------------------------------------------------------------------ *this = new_order; frame_index = 0; //------------------------------------------------------------------------ return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::swap_frames(int i, int j) { if( (i >= (int)size()) || (i < 0) || (j >= (int)size()) || (j < 0) ) return *this; //------------------------------------------------------------------------ LaserBoy_frame frame = at(i); at(i) = at(j); at(j) = frame; //------------------------------------------------------------------------ return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::reverse_selected() { size_t i, j; LaserBoy_frame_set selected; //------------------------------------------------------------------------ p_space->p_GUI->display_state("reversing selected frame order"); for(i = 0; i < size(); i++) if(at(i).is_selected) selected += at(i); //------------------------------------------------------------------------ j = selected.size(); //------------------------------------------------------------------------ for(i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(at(i).is_selected) at(i) = selected[--j]; } //------------------------------------------------------------------------ return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::random_order() { LaserBoy_frame_set random; vector been_here(size()); //------------------------------------------------------------------------ int random_index = rand() % size(); //------------------------------------------------------------------------ for(size_t i = 0; i < size(); i++) been_here[i] = false; //------------------------------------------------------------------------ p_space->p_GUI->display_state("randomizing frame order"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); while(been_here[random_index]) { random_index = rand() % size(); } random.push_back(at(random_index)); been_here[random_index] = true; } //------------------------------------------------------------------------ clear(); insert(begin(), random.begin(), random.end()); been_here.clear(); return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::frame_reverse() { p_space->p_GUI->display_state("reversing frame vectors"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).reverse(); } return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::center_x(bool individually) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(false); rss.center_x(individually); *this = rss; return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::center_y(bool individually) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(false); rss.center_y(individually); *this = rss; return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::center_z(bool individually) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(false); rss.center_z(individually); *this = rss; return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::center(bool individually) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(false); rss.center(individually); *this = rss; return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::normalize(double s) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(true); rss.normalize(); for(size_t i = 0; i < size(); i++) { rss.at(i).remove_vertex(0); rss.at(i).remove_vertex(0); // remove added origin from every frame } *this = rss; scale_around_origin(s); return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::normalize_vectors(double s) { if(s > 0.0) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(false); rss.normalize_vectors(); *this = rss; scale_around_origin(s); } else { LaserBoy_real_segment_set rss; rss = to_real_segment_set(false); rss.center(); *this = rss; } return *this; } //############################################################################ LaserBoy_frame_set& LaserBoy_frame_set::normalize_vectors_with_origin(double s) { LaserBoy_real_segment_set rss; rss = to_real_segment_set(true); rss.normalize_vectors_with_origin(); for(size_t i = 0; i < size(); i++) { rss.at(i).remove_vertex(0); rss.at(i).remove_vertex(0); // remove added origin from every frame } *this = rss; scale_around_origin(s); return *this; } //############################################################################ LaserBoy_real_segment_set LaserBoy_frame_set::to_real_segment_set(bool add_origin) const { LaserBoy_real_segment rs; LaserBoy_real_segment_set rss; rss.reserve(size()); for(size_t i = 0; i < size(); i++) { rs = at(i).to_real_segment(add_origin); rss.push_back(rs); } rss.frame_index = frame_index; rss.frame_select_start = frame_select_start; rss.frame_select_end = frame_select_end; return rss; } //############################################################################ bool LaserBoy_frame_set::save_as_ild(const string& file, LaserBoy_ild_header_count& counter) { if(size()) { std::ofstream out(file.c_str(), ios::out | ios::binary); if(out.is_open()) { if(p_space->auto_minimize) { LaserBoy_frame_set copy(*this); copy.minimize(); copy.to_ofstream_ild(out, counter); } else to_ofstream_ild(out, counter); p_space->last_ild_file_name = file; out.close(); } else return false; return true; } return false; } //############################################################################ bool LaserBoy_frame_set::save_as_ctn(const string& file) { std::ofstream out(file.c_str(), ios::out | ios::binary); if(out.is_open()) { LaserBoy_frame_set copy(*this); copy.best_match_palette(LASERBOY_ILDA_DEFAULT); copy.renumber(); copy.sync_rgb_and_palette(); copy.to_ofstream_ctn(out); out.close(); } else return false; return true; } //############################################################################ bool LaserBoy_frame_set::save_as_txt(const string& file) { std::ofstream out(file.c_str(), ios::out); if(out.is_open()) { txt_tag(out); if(p_space->auto_minimize) { LaserBoy_frame_set copy(*this); copy.minimize(); copy.to_ofstream_txt(out); } else to_ofstream_txt(out); out.close(); } else return false; return true; } //############################################################################ void LaserBoy_frame_set::to_ofstream_ild(std::ofstream& out, LaserBoy_ild_header_count& counter) { if(size()) { u_short id_num = 0; bool in_true_color = false; int local_palette_index = LASERBOY_ILDA_DEFAULT; LaserBoy_ild_header header; header.format = LASERBOY_PALETTE; header.owner = "LaserBoy"; header.identity = id_num; //-------------------------------------------------------------------- // p_space->sync_rgb_and_palette(); //-------------------------------------------------------------------- if(p_space->save_ild_fmt_4_5) header.total = size(); else header.total = size() + number_of_ild_color_tables() + number_of_ild_palettes(); //-------------------------------------------------------------------- p_space->p_GUI->display_state("writing ild file"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i - 1); if(!p_space->save_ild_fmt_4_5) { if( (at(i).palette_index == LASERBOY_TRUE_COLOR) && (!in_true_color) // write the 332 palette as a fallback for true color. ) { header.name = p_space->palette_picker(LASERBOY_REDUCED_332).name; header.quantity = p_space->palette_picker(LASERBOY_REDUCED_332).number_of_colors(); header.identity = id_num++; header.to_ofstream_ild(out); p_space->palette_picker(LASERBOY_REDUCED_332).to_ofstream_ild(out); counter._2++; local_palette_index = LASERBOY_REDUCED_332; in_true_color = true; } else if(at(i).palette_index != local_palette_index) { header.name = p_space->palette_picker(at(i).palette_index).name; header.quantity = p_space->palette_picker(at(i).palette_index).number_of_colors(); header.identity = id_num++; if(header.quantity < 256) header.quantity += 1; header.to_ofstream_ild(out); p_space->palette_picker(at(i).palette_index).to_ofstream_ild(out); counter._2++; local_palette_index = at(i).palette_index; in_true_color = false; } } // end if(!p_space->save_ild_fmt_4_5) at(i).total = header.total; at(i).to_ofstream_ild(out, id_num, counter); } // end for(size_t i = 0; i < size(); i++) //-------------------------------------------------------------------- if(p_space->save_ild_fmt_4_5) header.format = LASERBOY_3D_FRAME_RGB; else header.format = LASERBOY_3D_FRAME; header.name = "ILDA_End"; header.owner = p_space->install_GUID; header.quantity = 0; header.identity = id_num; header.to_ofstream_ild(out); // last section header written to file counter._e++; } return; } //############################################################################ void LaserBoy_frame_set::to_ofstream_ctn(std::ofstream& out) { p_space->p_GUI->display_state("writing ctn file"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); at(i).to_ofstream_ctn(out); } return; } //############################################################################ void LaserBoy_frame_set::to_ofstream_txt(std::ofstream& out) { int local_palette_index = LASERBOY_TRUE_COLOR; p_space->p_GUI->display_state("writing text file"); for(size_t i = 0; i < size(); i++) { p_space->p_GUI->display_progress(size() - i); if(!p_space->save_txt_with_color) { if( at(i).palette_index != local_palette_index && at(i).palette_index != LASERBOY_TRUE_COLOR ) { if( p_space->save_txt_named_palettes || at(i).palette_index >= LASERBOY_BUILT_IN_PALETTES ) p_space->palette_picker(at(i).palette_index).to_ofstream_txt(out); else { out << "palette named " << p_space->palette_picker(at(i).palette_index).name << ENDL << ENDL; } local_palette_index = at(i).palette_index; } if(at(i).palette_index == LASERBOY_TRUE_COLOR) at(i).to_ofstream_txt_color_table(out); } //---------------------------------------------------------------- at(i).to_ofstream_txt(out, i); } //------------------------------------------------------------------------ return; } //############################################################################ bool LaserBoy_frame_set::save_as_wav(const string& file, bool optimized, bool timed) { if(size() > 1) { std::fstream out(file.c_str(), ios::out | ios::binary); if(out.is_open()) { to_fstream_wav(out, optimized, timed); out.close(); return true; } else return false; } else // there is only one frame return front().save_as_wav(file, optimized, timed, false); } //############################################################################ void LaserBoy_frame_set::to_fstream_wav(std::fstream& out, bool optimized, bool timed) { u_int i; LaserBoy_frame_set copy(*this); LaserBoy_wav_header header; //------------------------------------------------------------------------ if(p_space->view_angle != 0.0) for(i = 0; i < copy.size(); i++) copy[i].rotate_around_origin(); //------------------------------------------------------------------------ p_space->set_wav_out_header(header, optimized, timed); //------------------------------------------------------------------------ if(optimized) copy.optimize(); //------------------------------------------------------------------------ p_space->p_GUI->display_state("writing wav file"); header.to_fstream_wav(out); // take up the space! //------------------------------------------------------------------------ if(optimized) { bool not_last_frame; int frame_scan, total_frame_scans = 1; u_int chill_samples = (u_int)ceil( p_space->sample_rate * ( p_space->max_dwell_microsec / 500000.0 // make it twice the max_dwell_microsec ) ); LaserBoy_vertex origin; LaserBoy_segment chill; if(chill_samples < 10) chill_samples = 10; for(i = 0; i < chill_samples; i++) chill.push_back(origin); chill.to_fstream_wav(out, header, false, false); //-------------------------------------------------------------------- for(i = 0; i < copy.size(); i++) { not_last_frame = (i < (copy.size() - 1)); total_frame_scans = 1; copy.at(i).intro.to_fstream_wav(out, header, false, false); //---------------------------------------------------------------- if(timed) // in frames_per_second { total_frame_scans = (int)ceil( (p_space->sample_rate / p_space->frames_per_second) / (copy.at(i).size() + copy.at(i).bridge.size()) ); if(total_frame_scans > 1) { ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, copy.at(i).is_wagged, // end_of_frame() copy.at(i).is_wagged // unique_frame() ); for(frame_scan = 1; frame_scan < total_frame_scans; frame_scan++) { copy.at(i).bridge.to_fstream_wav(out, header, true, (!copy.at(i).is_wagged) && (frame_scan == 1) // unique_frame() ); // frame scan 1 is unique ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, copy.at(i).is_wagged && (frame_scan < total_frame_scans - 1), // end_of_frame() false // unique_frame() ); } // end for(frame_scan = 1; frame_scan < total_frame_scans; frame_scan++) copy.at(i).coda.to_fstream_wav(out, header, not_last_frame, // end_of_frame() false // unique_frame() ); } // end if(total_frame_scans > 1) else // total_frame_scans == 1 { ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, false, // end_of_frame() false // unique_frame() ); copy.at(i).coda.to_fstream_wav(out, header, not_last_frame, not_last_frame ); // only 1 frame scan is unique } } // end if(timed) else { ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, false, false ); copy.at(i).coda.to_fstream_wav(out, header, not_last_frame, not_last_frame ); // only 1 frame scan is unique } //---------------------------------------------------------------- p_space->p_GUI->display_progress(copy.size() - i); } // end for(i = 0; i < copy.size(); i++) chill.to_fstream_wav(out, header, true, (total_frame_scans == 1) && (!copy.back().is_wagged) ); } // end if(optimized) //------------------------------------------------------------------------ else if(timed) // in frames_per_second { int frame_scan, total_frame_scans; for(i = 0; i < copy.size(); i++) { total_frame_scans = (int)ceil( (p_space->sample_rate / p_space->frames_per_second) / copy.at(i).size() ); ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, true, true); for(frame_scan = 1; frame_scan < total_frame_scans; frame_scan++) { ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, true, false); p_space->p_GUI->display_progress(total_frame_scans - frame_scan); } //---------------------------------------------------------------- p_space->p_GUI->display_progress(copy.size() - i); } // end for(i = 0; i < copy.size(); i++) } // end else if(timed) //------------------------------------------------------------------------ else // not optimized or timed! for(i = 0; i < copy.size(); i++) { ((LaserBoy_segment)copy.at(i)).to_fstream_wav(out, header, true, true); p_space->p_GUI->display_progress(copy.size() - i); } //------------------------------------------------------------------------ header.to_fstream_wav(out); return; } //############################################################################ void LaserBoy_frame_set::save_as_bmp_directory(const string& dir, const string& name) const { char number[12]; #if defined __MINGW_LASERBOY__ mkdir(dir.c_str()); #else mkdir(dir.c_str(), 0777); #endif for(size_t i = 0; i < size(); i++) { sprintf(number, "%06d", (int)i); at(i).save_as_bmp(string(dir + '/' + name + '_' + number + ".bmp")); } return; } //############################################################################ void LaserBoy_frame_set::save_as_bmp_view(u_int frame_index, const string& file) const { char file_name[80]; struct LaserBoy_bmp bmp_out = {0}; p_space->p_GUI->display_state("rendering bmp file " + file); bmp_init(&bmp_out, p_space->output_bmp_size, p_space->output_bmp_size, 24); bmp_clear(&bmp_out, bmp_out.make_rgb(p_space->bg_color.r, p_space->bg_color.g, p_space->bg_color.b ) ); render_frame(frame_index, &bmp_out); sprintf(file_name, "%s", file.c_str()); bmp_flip(&bmp_out); p_space->p_GUI->display_state("writing bmp file " + file); bmp_save_as(&bmp_out, file_name); bmp_free(&bmp_out); return; } //############################################################################ void LaserBoy_frame_set::save_as_bmp_directory_view(const string& dir, const string& name) const { char number[12]; #if defined __MINGW_LASERBOY__ mkdir(dir.c_str()); #else mkdir(dir.c_str(), 0777); #endif for(size_t i = 0; i < size(); i++) { sprintf(number, "%06d", (int)i); save_as_bmp_view(i, string(dir + '/' + name + '_' + number + ".bmp")); } return; } //############################################################################ bool LaserBoy_frame_set::save_as_dxf_directory(const string& dir, const string& name) const { bool all_saved = true; char number[16]; #if defined __MINGW_LASERBOY__ mkdir((dir + name).c_str()); #else mkdir((dir + name).c_str(), 0777); #endif p_space->p_GUI->display_state("writing DXF file"); for(size_t i = 0; i < size(); i++) { sprintf(number, "%06d", (int)i); all_saved &= at(i).save_as_dxf(string(dir + name + '/' + name + '_' + number + ".dxf")); p_space->p_GUI->display_progress(size() - i); } return all_saved; } //############################################################################ ////////////////////////////////////////////////////////////////////////////// //############################################################################