Пример #1
0
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);
}
Пример #2
0
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();
}
Пример #3
0
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);
}