#macro ScalarRange(Seed) (rand(Seed)-rand(Seed)) #end #macro VectorRange(Seed) (-) #end #macro RoundedMid(Array,K,Ia,Ja,Ib,Jb,Ir,Jr) #local Array[K][Ir][Jr]=vnormalize(Array[K][Ia][Ja]+Array[K][Ib][Jb])*((vlength(Array[K][Ia][Ja])+vlength(Array[K][Ib][Jb]))/2+ScalarRange(S)*tR); #end #macro RoughMid(Array,K,Ia,Ja,Ib,Jb,Ir,Jr) #local Array[K][Ir][Jr]=(Array[K][Ia][Ja]+Array[K][Ib][Jb]))/2+VectorRange(S)*tR); #end // If the user forgot to specify, use defaults #ifndef (Smooth) #local Smooth=true; #end #ifndef (Seed) #local Seed=0; #end #local S=seed(Seed); #ifndef (Splits) #local Splits=1; #end #ifndef (Size) #local Size=10; #end /* #ifndef (Start) #local Start=1; #end */ #ifndef (Rough) #local Rough=.2; #end #ifndef (Rounding) #local Rounding=1; #end #ifndef (Omega) #local Omega=.5; #end #local SC=1; // a commonly used value #local SM=1; // just as commonly used #local I=0; #while (I*Size*(ScalarRange(S)*Rough+1); //0 #local P[1][0][0]=P[0][0][0]; #local P[2][0][0]=P[0][0][0]; #local P[3][0][0]=P[0][0][0]; #local P[4][0][0]=P[0][0][0]; #local P[2][1][1]=<-qA, qB,0>*Size*(ScalarRange(S)*Rough+1); //1 #local P[3][0][2]=P[2][1][1]; #local P[4][1][0]=< qA,-qB,0>*Size*(ScalarRange(S)*Rough+1); //2 #local P[0][0][1]=P[4][1][0]; #local P[0][1][2]=<-qA,-qB,0>*Size*(ScalarRange(S)*Rough+1); //3 #local P[1][1][2]=P[0][1][2]; #local P[2][1][2]=P[0][1][2]; #local P[3][1][2]=P[0][1][2]; #local P[4][1][2]=P[0][1][2]; #local P[1][1][0]=<0, qA, qB>*Size*(ScalarRange(S)*Rough+1); //4 #local P[2][0][1]=P[1][1][0]; #local P[0][1][1]=<0,-qA, qB>*Size*(ScalarRange(S)*Rough+1); //5 #local P[1][0][2]=P[0][1][1]; #local P[2][1][0]=<0, qA,-qB>*Size*(ScalarRange(S)*Rough+1); //6 #local P[3][0][1]=P[2][1][0]; #local P[4][1][1]=<0,-qA,-qB>*Size*(ScalarRange(S)*Rough+1); //7 #local P[0][0][2]=P[4][1][1]; #local P[0][1][0]=< qB,0, qA>*Size*(ScalarRange(S)*Rough+1); //8 #local P[1][0][1]=P[0][1][0]; #local P[3][1][0]=< qB,0,-qA>*Size*(ScalarRange(S)*Rough+1); //9 #local P[4][0][1]=P[3][1][0]; #local P[1][1][1]=<-qB,0, qA>*Size*(ScalarRange(S)*Rough+1); //10 #local P[2][0][2]=P[1][1][1]; #local P[3][1][1]=<-qB,0,-qA>*Size*(ScalarRange(S)*Rough+1); //11 #local P[4][0][2]=P[3][1][1]; //The icosahedron is now as complete as we need it to be //for the fractal divisions, which commence now. //init the tR value for the level about to happen #local tR=Rough*Size; #local Depth=0; #while (Depth-1) #local J=SC*2; #while (J>-1) #local K=0; #while (K<5) #local P[K][I][J]=P[K][I/2][J/2]; #local K=K+1; #end #local J=J-2; #end #local I=I-2; #end // logic to calculate each new mid point #local I=0; #while (I; #local K=K+1; #end #local J=J+1; #end #local I=I+1; #end //Now we calculate the surface normals for each triangle #local I=0; #while (I