[Bf-committers] what's wrong with my edgecollapse program

xiang liang xlvector at gmail.com
Sat Mar 25 02:54:19 CET 2006


I use EditMesh structure write a edge collapse function, but I am not
very familiar with this structure. the algorithm is very simple, can
someone help me.

int XL_collapseEdges(EditEdge *eed)
{
	extern float doublimit;
	EditEdge *ee;
	EditFace *ef;
	int i;
	float avgCount[3];
	if(eed==NULL) return 0;
	avgCount[0] = (eed->v1->co[0] + eed->v2->co[0])/2.0;
	avgCount[1] = (eed->v1->co[1] + eed->v2->co[1])/2.0;
	avgCount[2] = (eed->v1->co[2] + eed->v2->co[2])/2.0;
	
	VECCOPY(eed->v1->co,avgCount);
	for(ee=G.editMesh->edges.first;ee;ee=ee->next)
	{
		if(ee == eed) continue;
		if(ee->v1 == eed->v2){
			ee->v1 = eed->v1;
		}
		if(ee->v2 == eed->v2){
			ee->v2 = eed->v1;
		}
	}
	for(ef=G.editMesh->faces.first;ef;ef=ef->next)
	{
		if(ef->v1 == eed->v2){
			ef->v1 = eed->v1;
		}
		if(ef->v2 == eed->v2){
			ef->v2 = eed->v1;
		}
		if(ef->v3 == eed->v2){
			ef->v3 = eed->v1;
		}
		if(ef->e1 == eed || ef->e2 == eed || ef->e3 == eed){
			if(ef==G.editMesh->faces.first){
				printf("first face\n");
				G.editMesh->faces.first = ef->next;
			}
			else{
				ef->prev->next = ef->next;
			}
			//MEM_freeN(ef);
		}
	}
	VECCOPY(eed->v2->co,avgCount);
	if(eed->v2 == G.editMesh->verts.first){
		printf("first vertex\n");
		G.editMesh->verts.first = eed->v2->next;
	}
	else{
		eed->v2->prev->next = eed->v2->next;
	}
	if(eed == G.editMesh->edges.first){
		printf("first edge\n");
		G.editMesh->edges.first = eed->next;
	}
	else{
		eed->prev->next = eed->next;
	}
	return 2;
}


More information about the Bf-committers mailing list