/* Sponge.inc by Piotr Rashidow piotrrashidow@hotmail.com */ #version unofficial MegaPov 0.5; #ifndef(Debug) #declare Debug=false; #end #declare spc1=" " #declare spc2=" " #ifndef(Render_X_Wall_Only) #declare Render_X_Wall_Only=false; #end #ifndef(Hollow) #declare Hollow=false; #end #ifndef(Dust) #declare Dust=true; #end #ifndef(tc) #declare tc=0; #end //triangle counter #declare RW=Render_X_Wall_Only; #if(!RW) #declare ZA=3; #declare ZB=5; #declare ZC=9; #else #declare ZA=1; #declare ZB=1; #declare ZC=1; #end #declare c1 = camera {location <-3,12,-7> look_at <4.5,3,4.5>} #declare c2 = camera {location <1.5,3.2,3.2> angle 90 look_at <4.5,4.5,6> } #declare c3 = camera {location <3,4.5,-0.5> look_at 4.5 } #declare c4 = camera {location <0,9.5,9.5> look_at <4.5,6.1,4.5> } #declare X_Wall_Cam = camera {orthographic location <4.5,4.5,-10> right <9,0,0> up <0,9,0> look_at 4.5} #declare light_group1 = union { light_source { <-9,4.5,-4.5>*9 rgb 1 } light_source { <-9.5,4.55,-4.55>*9.1 rgb <.25,.28,.42> shadowless } } #declare test_light = union { light_source { <4.5,4.5,18> rgb <1,0,0> shadowless } light_source { <4.5,4.5,-9> rgb <1,0,0> shadowless } light_source { <18,4.5,4.5> rgb <0,1,0> shadowless } light_source { <-9,4.5,4.5> rgb <0,1,0> shadowless } light_source { <4.5,18,4.5> rgb <0,0,1> shadowless } light_source { <4.5,-9,4.5> rgb <0,0,1> shadowless } } #declare center_light = object { light_source { 4.5 rgb 0.7 } } #declare l1_s = array[3][3] { {1,1,1}, {1,0,1}, {1,1,1} } #declare l2_s = array[3][3] { {1,0,1}, {0,0,0}, {1,0,1} } #declare l1 = array[9][9] { {1,1,1,1,1,1,1,1,1}, {1,0,1,1,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1}, {1,1,1,0,0,0,1,1,1}, {1,0,1,0,0,0,1,0,1}, {1,1,1,0,0,0,1,1,1}, {1,1,1,1,1,1,1,1,1}, {1,0,1,1,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1} } #declare l2 = array[9][9] { {1,0,1,1,0,1,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,1,0,1,1,0,1}, {1,0,1,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,0,1,0,1}, {1,0,1,1,0,1,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,1,0,1,1,0,1} } #declare l4 = array[9][9] { {1,1,1,0,0,0,1,1,1}, {1,0,1,0,0,0,1,0,1}, {1,1,1,0,0,0,1,1,1}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {1,1,1,0,0,0,1,1,1}, {1,0,1,0,0,0,1,0,1}, {1,1,1,0,0,0,1,1,1} } #declare l5 = array[9][9] { {1,0,1,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,0,1,0,1} } #declare dst = array[9][9] { {9,1,9,0,1,0,9,1,9}, {1,0,1,1,0,1,1,0,1}, {9,1,9,0,1,0,9,1,9}, {0,1,0,0,0,0,0,1,0}, {1,0,1,0,0,0,1,0,1}, {0,1,0,0,0,0,0,1,0}, {9,1,9,0,1,0,9,1,9}, {1,0,1,1,0,1,1,0,1}, {9,1,9,0,1,0,9,1,9} } #declare dst2= array[9][9] { {1,0,1,1,0,1,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,1,0,1,1,0,1}, {1,0,1,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,0,1,0,1}, {1,0,1,1,0,1,1,0,1}, {0,0,0,0,0,0,0,0,0}, {1,0,1,1,0,1,1,0,1} } #macro BOX(X,Y,Z,X_LEN,Y_LEN,Z_LEN,BT,LR,BF) /* x_len __________ /| /| / | / | y_len /__|______/ | | |______|__| | / | / | / | /z_len |/ |/ x,y,z_______| */ #local x_l=X+X_LEN; #local y_l=Y+Y_LEN; #local z_l=Z+Z_LEN; #if(BT) triangle {} triangle {} triangle {} triangle {} #declare tc=tc+4; #end #if(LR) triangle {} triangle {} triangle {} triangle {} #declare tc=tc+4; #end #if(BF) triangle {} triangle {} triangle {} triangle {} #declare tc=tc+4; #end #end #macro ROTATE(v1,v2,v3,vrot,tr,tr_v,DN) ((vrotate(v1,vrot)+tr)*(1/DN))+tr_v ((vrotate(v2,vrot)+tr)*(1/DN))+tr_v ((vrotate(v3,vrot)+tr)*(1/DN))+tr_v #end #declare vr=array[6] {<0,0,0>,<0,0,0>,<0,0,90>,<0,90,90>,<-90,0,0>,<-90,0,0>} #declare tr=array[6] {<0,0,0>,<0,9,0>,<0,0,0>,<9,0,9>,<0,0,0>,<0,0,9>} #macro HOLLOW_SPONGE(vect,D) #local i=0; #while(i<6) triangle {ROTATE(<0,0,0>,<9,0,0>,<9,0,1>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,0>,<0,0,1>,<9,0,1>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,2>,<9,0,2>,<9,0,3>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,2>,<0,0,3>,<9,0,3>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,6>,<9,0,6>,<9,0,7>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,6>,<0,0,7>,<9,0,7>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,8>,<9,0,8>,<9,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,8>,<0,0,9>,<9,0,9>,vr[i],tr[i],vect,D)} // triangle {ROTATE(<0,0,0>,<0,0,9>,<1,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<0,0,0>,<1,0,0>,<1,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<2,0,0>,<2,0,9>,<3,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<2,0,0>,<3,0,0>,<3,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<6,0,0>,<6,0,9>,<7,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<6,0,0>,<7,0,0>,<7,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<8,0,0>,<8,0,9>,<9,0,9>,vr[i],tr[i],vect,D)} triangle {ROTATE(<8,0,0>,<9,0,0>,<9,0,9>,vr[i],tr[i],vect,D)} // triangle {ROTATE(<1,0,3>,<2,0,3>,<2,0,4>,vr[i],tr[i],vect,D)} triangle {ROTATE(<1,0,3>,<1,0,4>,<2,0,4>,vr[i],tr[i],vect,D)} triangle {ROTATE(<1,0,5>,<2,0,5>,<2,0,6>,vr[i],tr[i],vect,D)} triangle {ROTATE(<1,0,5>,<1,0,6>,<2,0,6>,vr[i],tr[i],vect,D)} // triangle {ROTATE(<7,0,3>,<8,0,3>,<8,0,4>,vr[i],tr[i],vect,D)} triangle {ROTATE(<7,0,3>,<7,0,4>,<8,0,4>,vr[i],tr[i],vect,D)} triangle {ROTATE(<7,0,5>,<8,0,5>,<8,0,6>,vr[i],tr[i],vect,D)} triangle {ROTATE(<7,0,5>,<7,0,6>,<8,0,6>,vr[i],tr[i],vect,D)} // triangle {ROTATE(<3,0,1>,<3,0,2>,<4,0,2>,vr[i],tr[i],vect,D)} triangle {ROTATE(<3,0,1>,<4,0,1>,<4,0,2>,vr[i],tr[i],vect,D)} triangle {ROTATE(<5,0,1>,<5,0,2>,<6,0,2>,vr[i],tr[i],vect,D)} triangle {ROTATE(<5,0,1>,<6,0,1>,<6,0,2>,vr[i],tr[i],vect,D)} // triangle {ROTATE(<3,0,7>,<3,0,8>,<4,0,8>,vr[i],tr[i],vect,D)} triangle {ROTATE(<3,0,7>,<4,0,7>,<4,0,8>,vr[i],tr[i],vect,D)} triangle {ROTATE(<5,0,7>,<5,0,8>,<6,0,8>,vr[i],tr[i],vect,D)} triangle {ROTATE(<5,0,7>,<6,0,7>,<6,0,8>,vr[i],tr[i],vect,D)} #declare tc=tc+48; // #local i=i+1; #end #end /* Usage: mesh { SPONGE2( translate X, translate Y, translate Z, Denominator // Used for // calculating the // width, height and depth // of each box. ) } */ #macro SPONGE2(X,Y,Z,D) #if(Hollow) HOLLOW_SPONGE(,D) #else #local points=array[4] {0,2/D,6/D,8/D} #local F1=1/D; #local F3=3/D; #local F5=5/D; #local F7=7/D; #local F9=9/D; #if(Dust) #local i=0; #while (i<4) #local j=0; #while (j<4) BOX(X,points[i]+Y,points[j]+Z,F9,F1,F1,1,0,1) BOX(points[i]+X,Y,points[j]+Z,F1,F9,F1,0,1,1) BOX(points[j]+X,points[i]+Y,Z,F1,F1,F9,1,1,0) #local j=j+1; #end #local i=i+1; #end #end #local i=0; #while (i<4) #local co1=array[4] {F1,F7,F1,F7} #local co2=array[4] {F3,F3,F5,F5} #local p_x=points[i]+X; #local p_y=points[i]+Y; #local p_z=points[i]+Z; #local j=0; #while(j<4) BOX(co1[j]+X,p_y,co2[j]+Z,F1,F1,F1,1,0,1) BOX(co1[j]+X,co2[j]+Y,p_z,F1,F1,F1,1,0,1) BOX(p_x,co1[j]+Y,co2[j]+Z,F1,F1,F1,0,1,1) BOX(co2[j]+X,co1[j]+Y,p_z,F1,F1,F1,0,1,1) BOX(p_x,co2[j]+Y,co1[j]+Z,F1,F1,F1,1,1,0) BOX(co2[j]+X,p_y,co1[j]+Z,F1,F1,F1,1,1,0) #local j=j+1; #end #local i=i+1; #end #end #end #if(RW) #declare LIM3=1; #else #declare LIM3=2; #end #macro SPONGE3(Xt,Yt,Zt,DN) #local DN3=DN*3; #local X=0; #while (X<2) #local Y=0; #while (Y<2) #local Z=0; #while (Z4) #local err_str=concat("Recursion level ",str(Lvl,1,0)," would result in ",str(pow(20,Lvl),1,0)," objects.\n" ) #debug err_str #error "Remove this error to continue." #end //#if(Lvl>0) #declare MengerSponge = union { #local X=0; #while(X<3) #local Y=0; #while(Y<2) #local Z=0; #while(Z} #if(Y=0) object {base_obj translate } #end #end #local Z=Z+1; #end #local Y=Y+1; #end #local X=X+1; #end scale 1/3 } //#end #undef base_obj #if(Lvl>1) Build_Sponge(object { MengerSponge },Lvl-1) #else object { MengerSponge } #end #if(Debug) #if(Lvl=1) #debug concat("\n",spc1,"Done\n") #end #end #end #macro Build_Sponge2(base_object) #if(Debug) #debug concat(spc1,"Build_Sponge2()\n") #end #local Y=0; #while (Y<5) #local X=0; #while (X<5) #local Z=0; #while (Z} #if(X!=4) object {base_object translate } #end #if(!RW) #if(Z!=4) object {base_object translate < X, Y,Z8>} #end #if(X!=4 & Z!=4) object {base_object translate } #end #end #if(Y!=4) object {base_object translate < X,Y8, Z>} #if(X!=4) object {base_object translate } #end #if(!RW) #if(Z!=4) object {base_object translate < X,Y8,Z8>} #end #if(X!=4 & Z!=4) object {base_object translate } #end #end #end #end #local Z=Z+1; #end #local X=X+1; #end #local Y=Y+1; #end #if(Debug) #debug concat(spc1,"Done\n") #end #end #macro Build_Sponge2_Color(base_object) //Same as above but colors the sponge #if(Debug) #debug concat(spc1,"Build_Sponge2_Color()\n") #end #local X=0; #while (X<9) #local Y=0; #while (Y<5) #local Z=0; #while (Z pigment {rgb /8} } #if(Y!=4) object {base_object translate pigment {rgb /8} } #end #end #local Z=Z+1; #end #local Y=Y+1; #end #local X=X+1; #end #if(Debug) #debug concat(spc1,"Done\n") #end #end