#declare CURVED_LIMIT = 0.25; #macro vangle(na, nb, nc) #local la=vlength(na); #local lb=vlength(nb); #local lc=vlength(nc); #local cab=vdot(na, nb)/(la*lb); #local cac=vdot(na, nc)/(la*lc); #local cbc=vdot(nb, nc)/(lb*lc); max(max(acos(cab),acos(cac)),acos(cbc)) #end #macro curved_triangle(va, na, vb, nb, vc, nc) #local nab=vnormalize((na+nb)/2); #local nac=vnormalize((na+nc)/2); #local nbc=vnormalize((nb+nc)/2); #local vab=((vb-nb)+(va-na))/2+nab*(vlength(na)+vlength(nb))/2; #local vac=((vc-nc)+(va-na))/2+nac*(vlength(nc)+vlength(na))/2; #local vbc=((vc-nc)+(vb-nb))/2+nbc*(vlength(nc)+vlength(nb))/2; #local a=vangle(nab,nac,nbc); #if (a < CURVED_LIMIT) smooth_triangle{vac,nac,vab,nab,va,na} smooth_triangle{vbc,nbc,vb,nb,vab,nab} smooth_triangle{vac,nac,vbc,nbc,vab,nab} smooth_triangle{vc,nc,vbc,nbc,vac,nac} #else curved_triangle(va,na,vab,nab,vac,nac) curved_triangle(vab,nab,vb,nb,vbc,nbc) curved_triangle(vab,nab,vbc,nbc,vac,nac) curved_triangle(vac,nac,vbc,nbc,vc,nc) #end #end