// molded prism // Vers: 3.6 // Auth: Leroy Whetstone Email lrwii@joplin.com //--------- changes ----------------- #declare PRISM="ABQube2.prm" //(str)Brick3np.prm ABQube2.prm Star3.prm prism #declare Center=yes; //(yes/no) center prisms base at 0 #declare Div=.01; //(float)<1 divide (rough triangle side) #declare Ave= 3; //(int) >=0 Average map [Round factor] #declare Lim=.5; //(float) 0+Mn.y*y; #declare Thing=object {Thing translate -Mc} #declare Mx=max_extent(Thing); #declare Mn=min_extent(Thing); #end #declare Mx=Mx+Div; #declare Mn=Mn-Div; #debug "\n ____ Bonding Box ____\n" #debug concat("Max= <",vstr(3,Mx,",",4,4),">\n") #debug concat("Min= <",vstr(3,Mn,",",4,4),">\n\n") /*/center Thing #declare Mc=(Mx+Mn)/2; #declare Mx=Mx-Mc; #declare Mx=Mn-Mc; */ #declare Xl=int((Mx.x-Mn.x)/Div)+1; #declare Zl=int((Mx.z-Mn.z)/Div)+1; #debug " ____ Todle Points Array ____\n" #debug concat(" Tab [",str(Xl,1,0),"][",str(Zl,1,0)"]\n\n") #declare Tab=array[Xl][Zl]; #declare Norm = <0, 0, 0>; #declare Cnt = 0; #while (Cnt < Zl) //#debug concat("Cnt =",str(Cnt,3,3),"\n") #declare Cnt2 = 0; #while (Cnt2 < Xl) #declare Start = ; #declare Pos = trace (Thing,Start,-y,Norm ); #if (vlength(Norm)!=0) //(Norm.x != 0 | Norm.y != 0 | Norm.z != 0) #declare Tab[Cnt2][Cnt]=1;//Pos.y; #else #declare Tab[Cnt2][Cnt]=Lim; #end #declare Cnt2 = Cnt2+1; #end #declare Cnt = Cnt+1; #end //-------Average--------------- #if(Ave)#debug " ____ Averaging ____\n" #end #declare Ac = abs(Ave); #while (Ac>0) #debug concat(" Average ",str(Ac,3,0),"\n") #declare Cnt = 0; #while (Cnt < Zl) #declare Cnt2 = 0; #while (Cnt2 < Xl) #if(Tab[Cnt2][Cnt]>Lim) #declare k = 0; #declare kc = 0; #declare i = -Ac; #while (i < Ac+1) #declare j = -Ac; #while (j < Ac+1) #if((Cnt2+i>=0)&(Cnt+j>=0)&(Cnt2+iLim) sphere{,.01 pigment{rgb }} // #else // sphere{,.01 // pigment{Blue}} #end #declare Cnt2 = Cnt2+1; #end #declare Cnt = Cnt+1; #end */ //=============== Triangles ==================== #declare Tpnt=Xl*Zl; #declare Ttri=2*(Xl-1)*(Zl-1); #declare Pnts=array[Tpnt]; #declare Pc=array[Tpnt]; #declare Tris=array[Ttri]; //-------points--------- // fix Tab #debug "\n Fixing Mesh Points & Triangles\n" #declare Norm = <0, 0, 0>; #declare Cnt = 0; #while (Cnt < Zl) //#debug concat("Cnt =",str(Cnt,3,3),"\n") #declare Cnt2 = 0; #while (Cnt2 < Xl) #declare Start = ; #declare Pos = trace (Thing,Start,-y,Norm ); #if (vlength(Norm)!=0) //(Norm.x != 0 | Norm.y != 0 | Norm.z != 0) #declare Tab[Cnt2][Cnt]=Tab[Cnt2][Cnt]*Pos.y; #else #declare Tab[Cnt2][Cnt]=0; #end #declare Cnt2 = Cnt2+1; #end #declare Cnt = Cnt+1; #end //#debug "ReMaking Points\n" #declare Rx = .5/(Xl-1)*(Mx.x-Mn.x); #declare Rz = .5/(Zl-1)*(Mx.z-Mn.z); #declare JS=seed(Jseed); #declare k = 0; #declare Cnt = 0; #while (Cnt < Zl) #declare Cnt2 = 0; #while (Cnt2 < Xl) #declare Pnts[k]=; #if(Jitter) #declare Pnts[k]=; #end #declare k=k+1; #declare Cnt2 = Cnt2+1; #end #declare Cnt = Cnt+1; #end //---- triangles Base----------- #declare N=0; #declare Cnt=0; #while (Cnt< Zl-1) #declare L1=Xl*Cnt; #declare L2=Xl*(Cnt+1); #declare Cnt1=0; #while (Cnt1< Xl-1) #declare Tris[N]=; #declare N=N+1; #declare Tris[N]= ; #declare N=N+1; #declare Cnt1=Cnt1+1; #end #declare Cnt=Cnt+1; #end // cut unwanted triangles #declare N=Ttri; #declare Cnt=0; #while (Cnt; #declare N=N-1; #end #end #end #declare Cnt=Cnt+1; #end //#debug concat("N = ",str(N,0,0),"\n") #declare NTris=N; /*/tri test union{ #declare Cnt = 0; #while (Cnt < Ttri) //#debug concat("Cnt =",str(Cnt,3,3),"\n") //#debug concat("Tris[Cnt]= <",vstr(3,Tris[Cnt],",",3,3),">\n") #if (vlength(Tris[Cnt])!=0) triangle{Pnts[Tris[Cnt].x],Pnts[Tris[Cnt].y],Pnts[Tris[Cnt].z]} #end #declare Cnt = Cnt+1; #end pigment{Red} } */ //-------- clean up points-------------- #declare Cnt=0;// fill pc array with zero #while (Cnt0) #declare Pc[Tris[Cnt].x]=1; #declare Pc[Tris[Cnt].y]=1; #declare Pc[Tris[Cnt].z]=1; #end #declare Cnt=Cnt+1; #end #declare Cnt=0;// put true point value in pc #declare Cnt2=0; #while (Cnt0) #declare Pc[Cnt]=Cnt2; #declare Pnts[Cnt2]=Pnts[Cnt];// fix Pnt array //#debug concat("Cnt,Cnt2 ",str(Cnt,0,0),",",str(Cnt2,0,0),"\n") #declare Cnt2=Cnt2+1; #end #declare Cnt=Cnt+1; #end #declare PHit=Cnt2;// number of points in triangles #debug concat("\n Points Kept = ",str(PHit,0,0),"\n") #declare THit=0; #declare Cnt=0; // fix triangels point values #while (Cnt0) #declare Tris[Cnt]=; #declare THit=THit+1; #end #declare Cnt=Cnt+1; #end #debug concat("Trangles Kept = ",str(THit,0,0),"\n\n") // Calc normals #if(Smooth) #declare Nar=array[PHit]; #declare Cnt=0; #while (Cnt; #declare Cnt=Cnt+1; #end #declare Cnt=0; #while (Cnt< Ttri) #if(vlength(Tris[Cnt])>0) #declare Nbase=Tris[Cnt]; //#debug concat(" Tri < " vstr(3,Nbase,",",3,3)," >\n") #declare Face=vcross(Pnts[Nbase.x]-Pnts[Nbase.z],Pnts[Nbase.x]-Pnts[Nbase.y]); //#debug concat(" Face= < " vstr(3,Face,",",3,3)," >\n") #declare Nar[Nbase.x]=Nar[Nbase.x]+Face; #declare Nar[Nbase.y]=Nar[Nbase.y]+Face; #declare Nar[Nbase.z]=Nar[Nbase.z]+Face; #end #declare Cnt = Cnt+1; #end // clean up normals #declare Cnt = 0; #while (Cnt < PHit) #if(vlength(Nar[Cnt])!=0)// (Nar[Cnt].x+Nar[Cnt].y+Nar[Cnt].z)!=0) #declare Nar[Cnt]=vnormalize(Nar[Cnt]); #else #debug concat("Normal vexctor ZERO at point " str(Cnt,3,3),"\n") #declare Nar[Cnt]=<0,1,0>; #end //#debug concat(" Cnt= < " str(Cnt,3,3),"\n") #declare Cnt = Cnt+1; #end #end //------- make and show mesh2---------- #declare Prism= mesh2{ vertex_vectors{PHit //TPnts, #declare Cnt=0; #while (Cnt< PHit) Pnts[Cnt] #declare Cnt=Cnt+1; #end } #if(Smooth) normal_vectors { PHit, #declare Cnt=0; #while(Cnt0) //#debug concat("Cnt2,Tri[Cnt] ="str(Cnt2,0,0),",",str(Cnt,0,0)," <",vstr(3,Tri[Cnt],",",0,0)">\n") //#debug concat("Cnt,Cnt2 ="str(Cnt,0,0),",",str(Cnt2,0,0)"\n") Tris[Cnt] #declare Cnt2=Cnt2+1; #end #declare Cnt=Cnt+1; #end } } //save mesh #if(strlen(Save)) #debug concat("\nSaving: ",Save,"\n\n") #fopen MyFile Save write #write (MyFile "#declare Thing = mesh2{\n vertex_vectors{",str(PHit,0,0),",\n") // points #declare Cnt=0; #declare Cnt2=0; #while(Cnt,") #else #write (MyFile "<",vstr(3,Pnts[Cnt],",",0,9),">") #end #if (Cnt2=5) #declare Cnt2=0; #write (MyFile "\n") #end #declare Cnt2=Cnt2+1; #declare Cnt=Cnt+1; #end #write (MyFile "}\n") // normals #if(Smooth) #write (MyFile " normal_vectors{",str(PHit,0,0),",\n") #declare Cnt=0; #declare Cnt2=1; #while (Cnt< PHit) #if (Cnt1!=NTris-1) #write (MyFile "<",vstr(3,Nar[Cnt],",",0,9),">,") #else #write (MyFile "<",vstr(3,Nar[Cnt],",",0,9),">") #end #if (Cnt2=5) #declare Cnt2=0; #write (MyFile "\n") #end #declare Cnt2=Cnt2+1; #declare Cnt=Cnt+1; #end #write (MyFile "}\n") #end // faces #write (MyFile " face_indices{",str(NTris,0,0),",\n") #declare Cnt=0; #declare Cnt2=0; #declare Cnt3=0; #while (Cnt< Ttri) #if(vlength(Tris[Cnt])>0) #if (Cnt3!=NTris-1) #write (MyFile "<",vstr(3,Tris[Cnt],",",0,0),">,") #else #write (MyFile "<",vstr(3,Tris[Cnt],",",0,0),">") #end #if (Cnt2=5) #declare Cnt2=0; #write (MyFile "\n") #end #declare Cnt2=Cnt2+1; #declare Cnt3=Cnt3+1; #end #declare Cnt=Cnt+1; #end #write (MyFile "}}\n") #end //=========== SHOW ==================== #include "colors.inc" global_settings {max_trace_level 20} camera{ location <3,5,3> look_at <0,0,0> right x*image_width/image_height } light_source{<5,30,0> color White} light_source{<0,0,-10> color White} light_source{<0,0,10> color White} background{White} // sphere{0,.1 pigment{White}} // sphere{x,.1 pigment{White}} // sphere{z,.1 pigment{White}} object{Prism pigment{Gold} scale<1,.2,1>}