All pastes #486685 Raw Edit

Stuff

public text v1 · immutable
·published 2007-05-14 00:46 UTC
rendered paste body
/**
 *			BME_inset_poly
 *
 *	Face Inset Tool:
 *	
 *	Insets a single face and returns a pointer to the face at the 
 *	center of the newly created region
 *
 *	Returns -
 *	A BME_Poly pointer.
 */

BME_Poly *BME_inset_poly(BME_Mesh *bm,BME_Poly *f){
	
	BME_Vert *v, *killvert;
	BME_Edge *killedge;
	BME_Loop *l,*nextloop, *newloop, *killoop;
	
	int done,len,i;
	float cent[3]; //center of original face
	
	/*inset each edge in the polygon.*/
	len = f->len;
	for(i=0,l=f->loopbase; i < len; i++){
		nextloop = l->next;
		BME_SFME(bm,f,l->v,l->next->v,NULL);
		l = nextloop;
	}
	/*for each new edge, call SEMV twice on it*/
	for(i=0,l=f->loopbase; i < len; i++, l=l->next){ 
		l->tflag1 = 1; //going to store info that this loops edge still needs split
		l->tflag2 = l->v->tflag1 = l->v->tflag2 = 0; 
	}
	/*Split each edge in the face twice*/
	len = f->len;
	for(i=0,l=f->loopbase; i < len; i++){
		if(l->tflag1){
			l->tflag1 = 0;
			v = BME_SEMV(bm, l->next->v, l->e, NULL);
			l->e->tflag2 = 1; //mark for kill with JFKE
			v->tflag2 = 1; //mark for kill with JEKV
			v->tflag1 = 1;
			v = BME_SEMV(bm, l->next->v, l->e, NULL);
			v->tflag1 = 1;
			l= l->next->next->next;//skip over the loops we have created
		}
	}
	/*now link these new points of up via SFME*/
	len = f->len;
	for(i=0,l=f->loopbase; i < len; i++){
		if(l->v->tflag1){
			l->v->tflag1 = l->next->next->v->tflag1 = 0;
			nextloop = l->next->next->next;
			killoop = l->next;
			killvert = l->v;
			BME_SFME(bm,f,l->v,l->next->next->v,&newloop);
			killedge = newloop->e;
			i+=2; //increment counter since we have removed some edges from the face during split.
			l = nextloop;
			/*while we are here, we can kill killoop with JFKE*/
			BME_JFKE(bm,killoop->f,killoop->radial.next->data,killoop->e);
			/*and for good measure, get rid of */
			BME_JEKV(bm,killedge,killvert); 
		}
	}
	return NULL;
}