Exemplo n.º 1
0
static void outpoly() {
	int i;
	int vab,vca;
#ifdef DBG
	printf("  outpoly, npoly = %d \n", npoly);
#endif
	/* check to make sure poly faces away from origin: if not, flip it */
	check_facing();	

	if (subdiv_sides) {
		DPoint midp;
		int nxti = 0;
		for (i=npoly-1; i>=0; i--) {
			pol[2*i] = pol[i];
			MidPoint(&midp,&verts[pol[i]],&verts[pol[nxti]]);
			pol[2*i+1] = reg_vert(&midp);
			nxti = 2*i;
			}
		npoly *= 2;
		}

	if (center_verts||star_axis[curax]||state.scale_axis[curax]!=1.0) {
		DPoint sum;
		int nc,nxt;
		sum.x = sum.y = sum.z = 0.0;
		for (i=0; i<npoly; i++) {
			sum.x += verts[pol[i]].x;
			sum.y += verts[pol[i]].y;
			sum.z += verts[pol[i]].z;
			}
		sum.x /= (float)npoly;
		sum.y /= (float)npoly;
		sum.z /= (float)npoly;

		if (state.scale_axis[curax]!=1.0) {
			ScaleVect(&sum,state.scale_axis[curax]);
			nc = reg_vert(&sum);
			for (i=0; i<npoly; i++) {
				nxt = (i==npoly-1)?0:i+1;
				outface(nc,pol[i],pol[nxt],1,1,1);
				}
			}
		else {
			nc = reg_vert(&sum);
			for (i=0; i<npoly; i++) {
				nxt = (i==npoly-1)?0:i+1;
				outface(nc,pol[i],pol[nxt],0,1,0);
				}
			}
		}
	else  {
		for (i=1; i<npoly-1; i++) {
			vab = vca = 0;
			if (i==1) vab = 1;
			if	(i==npoly-2) vca = 1;
#ifdef DBG2
			printf("         face (%d,%d,%d) vis = (%d %d %d) \n",
				pol[0],pol[i],pol[i+1],vab,1,vca);
#endif
			outface(pol[0],pol[i],pol[i+1],vab,1,vca);
#ifdef DBG2
			{
			double l = dist(pol[i],pol[i+1]);
			printf(" side length = %.6f \n",l);
			}
#endif

		
			}
		}
	}
	void check_facing_at(enum Orientation o, int x, int y) {
		check_facing(o);
		check_at(x, y);
	}