int map_mesh_combine(map_type *map,int mesh_1_idx,int mesh_2_idx) { int mesh_idx; map_mesh_type *mesh,*mesh_1,*mesh_2; // create new combined mesh mesh_idx=map_mesh_add(map); if (mesh_idx==-1) return(-1); // get combined meshes // need to get after mesh add as mesh add can change mesh pointers mesh_1=&map->mesh.meshes[mesh_1_idx]; mesh_2=&map->mesh.meshes[mesh_2_idx]; // setup enough vertexes and polys for new mesh if (!map_mesh_set_vertex_count(map,mesh_idx,(mesh_1->nvertex+mesh_2->nvertex))) { map_mesh_delete(map,mesh_idx); return(-1); } if (!map_mesh_set_poly_count(map,mesh_idx,(mesh_1->npoly+mesh_2->npoly))) { map_mesh_delete(map,mesh_idx); return(-1); } // combined meshes mesh=&map->mesh.meshes[mesh_idx]; mesh->npoly=0; mesh->nvertex=0; map_mesh_combine_single_mesh(mesh,mesh_1); map_mesh_combine_single_mesh(mesh,mesh_2); // get back to correct size // ignore failures as it's just a waste of space that // will be reclaimed later map_mesh_set_vertex_count(map,mesh_idx,mesh->nvertex); map_mesh_set_poly_count(map,mesh_idx,mesh->npoly); // delete original meshes, making sure to // change delete index depending on first delete // and return mesh index minus the two // deleted meshes map_mesh_delete(map,mesh_1_idx); if (mesh_1_idx<mesh_2_idx) mesh_2_idx--; map_mesh_delete(map,mesh_2_idx); return(mesh_idx-2); }
void piece_delete(void) { int n,i,k,nsel_count, type,main_idx,sub_idx; unsigned char *mesh_mask; map_undo_push(); // sort segment so higher indexes are deleted first select_sort(); // selections have multiple polygons in them // so keep a mesh list mesh_mask=(unsigned char*)malloc(map.mesh.nmesh); if (mesh_mask==NULL) return; bzero(mesh_mask,map.mesh.nmesh); // delete selection nsel_count=select_count(); for (n=0;n!=nsel_count;n++) { select_get(n,&type,&main_idx,&sub_idx); switch (type) { case item_map_mesh: if (state.map.select_mode==select_mode_polygon) { map_mesh_delete_poly(&map,main_idx,sub_idx); select_delete_move_index(item_map_mesh,main_idx,sub_idx); break; } if (state.map.select_mode==select_mode_mesh) { if (mesh_mask[main_idx]==0x0) map_mesh_delete(&map,main_idx); mesh_mask[main_idx]=0x1; break; } break; case item_map_liquid: map_liquid_delete(&map,main_idx); break; case item_map_spot: for (i=main_idx;i<map.nspot;i++) { map.spots[i]=map.spots[i+1]; } map.nspot--; break; case item_map_scenery: for (i=main_idx;i<map.nscenery;i++) { map.sceneries[i]=map.sceneries[i+1]; } map.nscenery--; break; case item_map_node: for (i=0;i!=map.nnode;i++) { // clear all linkage if (i==main_idx) continue; for (k=0;k!=max_node_link;k++) { if (map.nodes[i].link[k]==main_idx) map.nodes[i].link[k]=-1; if (map.nodes[i].link[k]>main_idx) map.nodes[i].link[k]--; } } for (i=main_idx;i<map.nnode;i++) { map.nodes[i]=map.nodes[i+1]; } map.nnode--; break; case item_map_light: for (i=main_idx;i<map.nlight;i++) { map.lights[i]=map.lights[i+1]; } map.nlight--; break; case item_map_sound: for (i=main_idx;i<map.nsound;i++) { map.sounds[i]=map.sounds[i+1]; } map.nsound--; break; case item_map_particle: for (i=main_idx;i<map.nparticle;i++) { map.particles[i]=map.particles[i+1]; } map.nparticle--; break; } } free(mesh_mask); select_clear(); map_palette_reset(); main_wind_draw(); }
bool map_convert_segment_section_to_mesh(map_type *map,int seg_cnt,segment_type *seg_list,int rn,int primitive_uid,int seg_type,d3pnt *vlist,int vlist_sz) { int n,nvertex,npoly,mesh_idx; segment_type *seg; map_mesh_type *map_mesh; // clear vertex list bzero(vlist,vlist_sz); // count the vertexes and polys nvertex=npoly=0; for (n=0;n!=seg_cnt;n++) { seg=&seg_list[n]; if (seg->rn!=rn) continue; if (seg->primitive_uid[0]!=primitive_uid) continue; if ((seg_type!=-1) && (seg->type!=seg_type)) continue; switch (seg->type) { case sg_wall: nvertex=map_convert_segment_to_mesh_add_poly_vlist(nvertex,vlist,seg->data.wall.ptsz,seg->data.wall.x,seg->data.wall.y,seg->data.wall.z); npoly++; break; case sg_floor: case sg_ceiling: nvertex=map_convert_segment_to_mesh_add_poly_vlist(nvertex,vlist,seg->data.fc.ptsz,seg->data.fc.x,seg->data.fc.y,seg->data.fc.z); npoly++; break; case sg_ambient_wall: nvertex=map_convert_segment_to_mesh_add_poly_vlist(nvertex,vlist,seg->data.ambient_wall.ptsz,seg->data.ambient_wall.x,seg->data.ambient_wall.y,seg->data.ambient_wall.z); npoly++; break; case sg_ambient_fc: nvertex=map_convert_segment_to_mesh_add_poly_vlist(nvertex,vlist,seg->data.ambient_fc.ptsz,seg->data.ambient_fc.x,seg->data.ambient_fc.y,seg->data.ambient_fc.z); npoly++; break; } } if ((nvertex==0) || (npoly==0)) return(TRUE); // create new mesh mesh_idx=map_mesh_add(map); if (mesh_idx==-1) return(FALSE); if (!map_mesh_set_vertex_count(map,mesh_idx,nvertex)) { map_mesh_delete(map,mesh_idx); return(FALSE); } if (!map_mesh_set_poly_count(map,mesh_idx,npoly)) { map_mesh_delete(map,mesh_idx); return(FALSE); } map_mesh=&map->mesh.meshes[mesh_idx]; // move over vertexes map_mesh->nvertex=nvertex; memmove(map_mesh->vertexes,vlist,(sizeof(d3pnt)*nvertex)); // add polys map_mesh->npoly=0; for (n=0;n!=seg_cnt;n++) { seg=&seg_list[n]; if (seg->rn!=rn) continue; if (seg->primitive_uid[0]!=primitive_uid) continue; if ((seg_type!=-1) && (seg->type!=seg_type)) continue; switch (seg->type) { case sg_wall: map_convert_segment_to_mesh_add_mesh_poly(map_mesh,seg->data.wall.ptsz,seg->data.wall.x,seg->data.wall.y,seg->data.wall.z,seg->draw.gx,seg->draw.gy,seg); break; case sg_floor: case sg_ceiling: map_convert_segment_to_mesh_add_mesh_poly(map_mesh,seg->data.fc.ptsz,seg->data.fc.x,seg->data.fc.y,seg->data.fc.z,seg->draw.gx,seg->draw.gy,seg); break; case sg_ambient_wall: map_convert_segment_to_mesh_add_mesh_poly(map_mesh,seg->data.ambient_wall.ptsz,seg->data.ambient_wall.x,seg->data.ambient_wall.y,seg->data.ambient_wall.z,seg->draw.gx,seg->draw.gy,seg); break; case sg_ambient_fc: map_convert_segment_to_mesh_add_mesh_poly(map_mesh,seg->data.ambient_fc.ptsz,seg->data.ambient_fc.x,seg->data.ambient_fc.y,seg->data.ambient_fc.z,seg->draw.gx,seg->draw.gy,seg); break; } // groups are sorted together into meshes // so tranfer any groups to mesh map_mesh->group_idx=seg->group_idx; } return(TRUE); }