// -------------- Create all sloppy joints within CurrentGroup ------------------ int CreateSloppyAdjacentJointsGroup() { int adj_side; int done_been_a_change = 0; range_for(const auto &gs, GroupList[current_group].segments) { auto segp = vsegptridx(gs); for (int sidenum=0; sidenum < MAX_SIDES_PER_SEGMENT; sidenum++) if (!IS_CHILD(segp->children[sidenum])) { segptridx_t adj_sp = segment_none; if (med_find_closest_threshold_segment_side(segp, sidenum, adj_sp, &adj_side, 5*F1_0)) { if (adj_sp->group == segp->group) { if (segp->children[sidenum] != adj_sp) if (!med_form_joint(segp, sidenum, adj_sp,adj_side)) done_been_a_change = 1; } } } } if (done_been_a_change) { Update_flags |= UF_WORLD_CHANGED; mine_changed = 1; autosave_mine(mine_filename); diagnostic_message("Sloppy Joint segment formed."); undo_status[Autosave_count] = "Sloppy Joint segment undone."; warn_if_concave_segments(); } return 1; }
void delete_curve() { range_for (auto &i, partial_const_range(CurveSegs, CurveNumSegs)) { if (i->segnum != segment_none) med_delete_segment(vsegptridx(i)); } Markedsegp = OriginalMarkedSeg; Markedside = OriginalMarkedSide; Cursegp = OriginalSeg; Curside = OriginalSide; med_create_new_segment_from_cursegp(); CurveNumSegs = 0; //editor_status(""); //warn_if_concave_segments(); }
// ----------------------------------------------------------------------------- // saves to an already-open file static int save_mine_data(PHYSFS_File * SaveFile) { int header_offset, editor_offset, vertex_offset, segment_offset, texture_offset, walls_offset, triggers_offset; //, links_offset; int newseg_verts_offset; int newsegment_offset; med_compress_mine(); warn_if_concave_segments(); for (int i=0;i<NumTextures;i++) current_tmap_list[i] = TmapInfo[i].filename; //=================== Calculate offsets into file ================== header_offset = PHYSFS_tell(SaveFile) + sizeof(mine_fileinfo); editor_offset = header_offset + sizeof(mine_header); texture_offset = editor_offset + sizeof(mine_editor); vertex_offset = texture_offset + (13*NumTextures); segment_offset = vertex_offset + (sizeof(vms_vector)*Num_vertices); newsegment_offset = segment_offset + (sizeof(segment)*Num_segments); newseg_verts_offset = newsegment_offset + sizeof(segment); walls_offset = newseg_verts_offset + (sizeof(vms_vector)*8); triggers_offset = walls_offset + (sizeof(wall)*Num_walls); // doors_offset = triggers_offset + (sizeof(trigger)*Num_triggers); //===================== SAVE FILE INFO ======================== mine_fileinfo.fileinfo_signature= 0x2884; mine_fileinfo.fileinfo_version = MINE_VERSION; mine_fileinfo.fileinfo_sizeof = sizeof(mine_fileinfo); mine_fileinfo.header_offset = header_offset; mine_fileinfo.header_size = sizeof(mine_header); mine_fileinfo.editor_offset = editor_offset; mine_fileinfo.editor_size = sizeof(mine_editor); mine_fileinfo.vertex_offset = vertex_offset; mine_fileinfo.vertex_howmany = Num_vertices; mine_fileinfo.vertex_sizeof = sizeof(vms_vector); mine_fileinfo.segment_offset = segment_offset; mine_fileinfo.segment_howmany = Num_segments; mine_fileinfo.segment_sizeof = sizeof(segment); mine_fileinfo.newseg_verts_offset = newseg_verts_offset; mine_fileinfo.newseg_verts_howmany = 8; mine_fileinfo.newseg_verts_sizeof = sizeof(vms_vector); mine_fileinfo.texture_offset = texture_offset; mine_fileinfo.texture_howmany = NumTextures; mine_fileinfo.texture_sizeof = 13; // num characters in a name mine_fileinfo.walls_offset = walls_offset; mine_fileinfo.walls_howmany = Num_walls; mine_fileinfo.walls_sizeof = sizeof(wall); mine_fileinfo.triggers_offset = triggers_offset; mine_fileinfo.triggers_howmany = Num_triggers; mine_fileinfo.triggers_sizeof = sizeof(trigger); // Write the fileinfo PHYSFS_write( SaveFile, &mine_fileinfo, sizeof(mine_fileinfo), 1 ); //===================== SAVE HEADER INFO ======================== mine_header.num_vertices = Num_vertices; mine_header.num_segments = Num_segments; // Write the editor info if (header_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); PHYSFS_write( SaveFile, &mine_header, sizeof(mine_header), 1 ); //===================== SAVE EDITOR INFO ========================== mine_editor.current_seg = Cursegp; mine_editor.newsegment_offset = newsegment_offset; mine_editor.newsegment_size = sizeof(segment); // Next 3 vars added 10/07 by JAS mine_editor.Curside = Curside; if (Markedsegp) mine_editor.Markedsegp = Markedsegp; else mine_editor.Markedsegp = -1; mine_editor.Markedside = Markedside; for (int i=0;i<10;i++) mine_editor.Groupsegp[i] = vsegptridx(Groupsegp[i]); for (int i=0;i<10;i++) mine_editor.Groupside[i] = Groupside[i]; if (editor_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); PHYSFS_write( SaveFile, &mine_editor, sizeof(mine_editor), 1 ); //===================== SAVE TEXTURE INFO ========================== if (texture_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); range_for (auto &i, partial_const_range(current_tmap_list, NumTextures)) PHYSFS_write(SaveFile, i.data(), i.size(), 1); //===================== SAVE VERTEX INFO ========================== if (vertex_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); PHYSFS_write( SaveFile, Vertices, sizeof(vms_vector), Num_vertices ); //===================== SAVE SEGMENT INFO ========================= if (segment_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); PHYSFS_write( SaveFile, &Segments.front(), sizeof(segment), Num_segments ); //===================== SAVE NEWSEGMENT INFO ====================== if (newsegment_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); PHYSFS_write( SaveFile, &New_segment, sizeof(segment), 1 ); if (newseg_verts_offset != PHYSFS_tell(SaveFile)) Error( "OFFSETS WRONG IN MINE.C!" ); PHYSFS_write( SaveFile, &Vertices[New_segment.verts[0]], sizeof(vms_vector), 8 ); //==================== CLOSE THE FILE ============================= return 0; }