#macro Triangle( OO,  NN, MM, AX, AY, BX, BY, CX, CY, UVMIN, UVRANGE )
#local P1= uv_vertex( OO, AX/NN, AY/MM);
#local P2= uv_vertex( OO, BX/NN, BY/MM);
#local P3= uv_vertex( OO, CX/NN, CY/MM);
#if ( (vlength(P1-P2)>0)
& (vlength(P1-P3)>0)
& (vlength(P2-P3)>0) )
#local U1= UVMIN.u + AX/NN*UVRANGE.u;
#local V1= UVMIN.v + AY/MM*UVRANGE.v;
#local U2= UVMIN.u + BX/NN*UVRANGE.u;
#local V2= UVMIN.v + BY/MM*UVRANGE.v;
#local U3= UVMIN.u + CX/NN*UVRANGE.u;
#local V3= UVMIN.v + CY/MM*UVRANGE.v;
triangle{ P1, P2, P3 uv_vectors <U1,V1>,<U2,V2>,<U3,V3> }
#end
#end

#macro PreviousTriangle( OO, NN, MM, UU, VV, PP, UVMIN, UVRANGE )
#if(VV<MM)
#if((UU-1)>=0)
Triangle( OO, NN, MM, UU, VV, UU, VV+1, UU-1, VV+PP, UVMIN, UVRANGE)
#end
#end
#end

#macro NextTriangle( OO, NN, MM, UU, VV, PP, UVMIN, UVRANGE )
#if(VV<MM)
#if (UU< NN)
Triangle( OO, NN, MM, UU, VV, UU+1, VV+PP, UU, VV+1, UVMIN, UVRANGE)
#end
#end
#end

#macro Triangles(OO, UU,VV, NN, MM, UVMIN, UVRANGE) 
#local Parity = bitwise_and(1, bitwise_xor(UU, VV));
PreviousTriangle( OO, NN, MM, UU, VV, Parity, UVMIN, UVRANGE )
NextTriangle( OO, NN, MM, UU, VV, Parity, UVMIN, UVRANGE )
#end

#macro UVMeshable( OO, NN, MM )
#local STEPU=NN;
#local STEPV=MM;
#local UVMIN = uv_min(OO);
#local UVRANGE = uv_max(OO)-UVMIN;
#for(AA,0,STEPU,1)
#for(BB,0,STEPV,1)
Triangles( OO, AA, BB, STEPU, STEPV, UVMIN, UVRANGE)
#end
#end

#end