building

DEF myCylinder (r,h::IsReal;n::IsInt) = CYLINDER:<r,h>:n;
DEF acolor1 = RGBCOLOR:<0.2,0.6,1>;
DEF acolor2 = RGBCOLOR:<0.8,0.6,0.6>;
DEF ringhieracolor=BASEMATERIAL:<ACOLOR1,ACOLOR1,0.2,BLACK,0.2,0.6>;
def colonnacolor=BASEMATERIAL:<RED,RED,0.4,BLACK,0.4,0.0>;
def stepcolor=BASEMATERIAL:<RGBCOLOR:<1,0.85,0.85>,BLACK,0.2,BLACK,0.2,0.0>;
def steptexture=FULLTEXTURE:<'img/concrete.jpg',TRUE,TRUE,<0,0>,0,<1,1>,<0,0>>;
def colonnatexture=FULLTEXTURE:<'img/marble.jpg',TRUE,TRUE,<0,0>,0,<1,1>,<0,0>>;
def ringhieratexture=FULLTEXTURE:<'img/glass.jpg',TRUE,TRUE,<0,0>,0,<1,1>,<0,0>>;
DEF REPEAT(n::IsInt)=STRUCT~##:n;
DEF RAMPA_1(nsteps::IsInt;Height,Radius,HRing::IsReal)=struct:<fstep_1,fringhiera_1,steptrans,but_1>
WHERE
but_1=STRUCT:(##:(-:<nsteps,1>):<step_1,ringhiera_1,steptrans>),
steptrans=T:3:alz~R:<1,2>:(PI/nsteps),
step_1=texture:<material:<step,stepcolor>,steptexture>,
step=@2:(MKPOL:< < <0,0,0> ,<Radius,0,-:(alz)> , <Radius,0,alz> , <0,0,alz> , <x,y,alz>,<x,y,0> > , <<1,2,3,4,5,6>>, <<1>>>),
fstep_1=texture:<material:<fstep,stepcolor>,steptexture>,
fstep=@2:(MKPOL:< < <0,0,0> ,<Radius,0,0> , <Radius,0,alz> , <0,0,alz> , <x,y,alz>,<x,y,0> > , <<1,2,3,4,5,6>>, <<1>>>),
alz=(Height/(-:<nsteps,1>)),
ringhiera_1=texture:<material:<ringhiera,RINGHIERACOLOR>,ringhieratexture>,
ringhiera=(MKPOL:< < <Radius,0,-:alz>,<Radius,0,HRing>,<x,y,alz+HRing>,<x,y,0> > , <<1,2,3,4>>,<<1>>>),
fringhiera_1=texture:<material:<fringhiera,RINGHIERACOLOR>,ringhieratexture>,
fringhiera=(MKPOL:< < <Radius,0,0>,<Radius,0,alz+HRing>,<x,y,alz+HRing>,<x,y,0> > , <<1,2,3,4>>,<<1>>>),
y=Radius*(SIN:(PI/nsteps)),
x=Radius*(COS:(PI/nsteps))
END;
DEF RAMPA_2(nsteps::IsInt;Height,Radius,InRadius,HRing::IsReal)=struct:<rampa1,ID,colonna>
WHERE
rampa1=rampa_1:<nsteps,Height,Radius,HRing>,
colonna=texture:<material:<
@2:(myCYLINDER:<InRadius,Height+(Height/nsteps),nsteps>),
colonnacolor>,colonnatexture>
end;
DEF PIANEROTTOLO(nsteps::IsInt;Height,Radius,HRing::IsReal)=
TPL:(struct:<STRUCT:<ringiera_1,TRR,ringiera_1>,plane_1>)
WHERE
plane_1=texture:<material:<plane,stepcolor>,steptexture>,
plane=(Cuboid:<Radius*2,Radius,alz>),
ringiera_1=texture:<material:<ringiera,RINGHIERACOLOR>,ringhieratexture>,
ringiera=(MKPOL:< < <0,0,0>,<0,Radius,0>,<0,Radius,HRing+alz>,<0,0,HRing+alz> >,< <1,2,3,4> >,< <1> > >),
TPL=T:2:(-:Radius)~T:1:(-:Radius),
TRR=T:1:(2*Radius),
alz=(Height/nsteps)
END;
DEF SCALA_F(piani::isint)(nsteps::IsInt;Height,Radius,InRadius,HRing::IsReal)=
struct:<scal,T:3:(piani*Height),last>
where
last=struct:<ringiera_1,colonna,T:3:Height~TPL,plane_1>,
scal=REPEAT:piani:<rampa,T:3:Height,pianerott>,
rampa=RAMPA_2:<nsteps,Height,Radius,InRadius,HRing>,
pianerott=PIANEROTTOLO:<nsteps,Height,Radius,HRing>,
colonna=texture:<material:<
@2:(myCYLINDER:<InRadius,Height+(Height/nsteps),nsteps>),
colonnacolor>,colonnatexture>,
TPL=T:2:(-:Radius)~T:1:(-:Radius),
plane_1=texture:<material:<plane,stepcolor>,steptexture>,
plane=(Cuboid:<Radius*2,Radius,alz>),
ringiera_1=texture:<material:<(R:<1,2>:(-:(PI/2)):ringiera),RINGHIERACOLOR>,ringhieratexture>,
ringiera=(MKPOL:< < <0,0,0>,<0,Radius,0>,<0,Radius,HRing+alz>,<0,0,HRing+alz> >,< <1,2,3,4> >,< <1> > >),
alz=(Height/nsteps)
end;
DEF SCALA(piani::isint)(nsteps::IsInt;Height,Radius,InRadius,HRing::IsReal)=
struct:<scal,T:3:(piani*Height),ringiera_1>
where
scal=REPEAT:piani:<rampa,T:3:Height,pianerott>,
rampa=RAMPA_2:<nsteps,Height,Radius,InRadius,HRing>,
pianerott=PIANEROTTOLO:<nsteps,Height,Radius,HRing>,
ringiera_1=texture:<material:<(R:<1,2>:(-:(PI/2)):ringiera),RINGHIERACOLOR>,ringhieratexture>,
ringiera=(MKPOL:< < <0,0,0>,<0,Radius,0>,<0,Radius,HRing+alz>,<0,0,HRing+alz> >,< <1,2,3,4> >,< <1> > >),
alz=(Height/nsteps)
end;
def ascala=(SCALA:2:<12,6,4,1,3>);
def ascala_f=(SCALA_F:2:<12,6,4,1,6>);
def arampa=(RAMPA_2:<12,6,4,1,3>);
%struct:<scal,T:3:(piani*Height),last>%
DEF GLASSCOLOR=BASEMATERIAL:<ACOLOR1,ACOLOR1,0.2,BLACK,0.2,0.6>;
DEF GLASSTEXTURE=FULLTEXTURE:<'img/glass.jpg',TRUE,TRUE,<0,0>,0,<1,1>,<0,0>>;
def side(N_Piani,N_fin::IsInt;Height,Width,Section::IsReal)=
struct:<vside,T:3:(Section/6),hside>
WHERE
hside=(struct:(##:n_piani:<hside_row,T:2:(2*HUN)>)),
hside_row=struct:<hside_row_l,T:1:(Width/2-WUN),hside_row_r>,
hside_row_r=struct:(cat:<<hside_c_el,T:1:(2*WUN)>,(##:(-:<n_fin,1>):<hside_el,T:1:(2*WUN)>)>),
hside_row_l=struct:(cat:<(##:(-:<n_fin,1>):<hside_el,T:1:(2*WUN)>),
<hside_c_el>>),
hside_c_el=struct:<window,T:2:HUN,window>,
hside_el=struct:<balc,T:2:HUN,window>,
balc=texture:<material:<sub_el,stepcolor>,steptexture>,
window=texture:<material:<sub_el,GLASSCOLOR>,GLASSTEXTURE>,
sub_el=MKPOL:(UKPOL:(quote:<-:WUN,WUN>*quote:<HUN,-:HUN>*quote:<Section/2>)),
vbarcolor=BASEMATERIAL:<RGBCOLOR:<1,0.85,0.7>,BLACK,0.2,BLACK,0.2,0.0>,
vside=struct:<vside_1,T:1:(WUN+width/2),vside_1>,
vside_1=struct:(##:n_fin:<vside_el,T:1:(2*WUN)>),
vside_el=texture:<material:<vside_el_1,vbarcolor>,vbartexture>,
vside_el_1=MKPOL:(UKPOL:(cuboid:<WUN,Height,Section>)),
vbartexture=FULLTEXTURE:<'img/marble_t.jpg',TRUE,TRUE,<0,0>,0,<1/(n_piani*2),1/4>,<0,0>>,
WUN=(Width/(N_fin*4)),
HUN=(Height/(N_Piani*2))
END;
def side_and_stairs(N_Piani,N_fin::IsInt;Height,Width::IsReal)=
struct:<the_side,STT,the_stair>
WHERE
the_side=side:<N_Piani,N_fin,Height,Width,(Height/(N_Piani*12))>,
the_stair=scala_f:(-:<N_Piani,1>):<12,(Height/N_Piani),(WIdth/(N_fin*4)),(WIdth/(N_fin*16)),(Height/(N_Piani*2))>,
STT=T:3:(WIdth/(N_fin*4))~T:1:((width/2))~
R:<2,3>:(-:(PI/2))~R:<1,2>:PI
END;
def roofcolor=BASEMATERIAL:<ACOLOR2,BLACK,0.2,BLACK,0.2,0.0>;
def rooftexture=FULLTEXTURE:<'img/terra.jpg',TRUE,TRUE,<0,0>,0,<1/16,1/16>,<0,0>>;
def floorcolor=BASEMATERIAL:<ACOLOR2,BLACK,0.2,BLACK,0.2,0.0>;
def floortexture=FULLTEXTURE:<'img/parque.jpg',TRUE,TRUE,<0,0>,0,<1/16,1/16>,<0,0>>;
def basementcolor=BASEMATERIAL:<RGBCOLOR:<0.8,0.8,1>,BLACK,0.2,BLACK,0.2,0.0>;
def basementtexture=FULLTEXTURE:<'img/3-point-tile.jpg',TRUE,TRUE,<0,0>,0,<1/8,1/8>,<0,0>>;
def edificio(N_Piani,N_fin,N_Lati::IsInt;Height,Width::IsReal)=
%ASSIGNSPOTLIGHT:<ASSIGNSPOTLIGHT:<%
struct:(##:N_Lati:<Sector,TSCT>)%,%
%top_light>,%
%bottom_light>%
WHERE
%top_light=<<<0.9,0.9,0.7>>,<<-:basx,Height*3,-:basy>,<2*basx,-:1,2*basy>,<>,<Height*5>,<2*PI/3>,<PI/2>>>,%
%bottom_light=<<<0.7,0.7,0.8>>,<<basx,-:Height*2,basy>,<0,1,0>,<>,<100>,<Height*4>,<2*PI/2>>>,%
Sector=struct:<the_side,top_a,floor_a,basement_a>,
the_side=(side:<N_Piani,N_fin,Height,Width,Section>),
basement_a=texture:<material:<basement,basementcolor>,
basementtexture>,
basement=mkpol:<<<-:basx,0,basy>,<Width+basx,0,basy>,
<0,0,0>,<Width,0,0>,
<-:basx,-:section,basy>,<Width+basx,-:section,basy>,
<0,-:section,0>,<Width,-:section,0>>,
<<1,2,3,4,5,6,7,8>>,<<1>>>,
basy=(Width/N_fin)*cos:(alfa/2),
basx=(Width/N_fin)*sin:(alfa/2),
floor_a=texture:<material:<floor,floorcolor>,floortexture>,
floor=mkpol:<<<0,0,0>,<Width,0,0>,<(Width/2),0,-:Radius>,
<0,section,0>,<Width,section,0>,<(Width/2),section,-:Radius>>,
<<1,2,3,4,5,6>>,<<1>>>,
top_a=texture:<material:<top,roofcolor>,rooftexture>,
top=T:2:Height:top_1,
top_1=mkpol:<<<0,0,0>,<Width,0,0>,<(Width/2),(Height/N_Piani),-:Radius>,
<0,0,section>,<Width,0,section>,<(Width/2),(Height/N_Piani)+Section,-:Radius>>,
<<1,2,3,4,5,6>>,<<1>>>,
Section=(Height/(N_Piani*12)),
Radius=(Width/2)*((cos:(alfa/2))/(sin:(alfa/2))),
TSCT=T:1:Width~R:<1,3>:((2*PI)/N_Lati),
alfa=((2*PI)/N_Lati)
END;
def edificio_and_stairs(N_Piani,N_fin,N_Lati::IsInt;Height,Width::IsReal)=
% ASSIGNSPOTLIGHT:<ASSIGNSPOTLIGHT:<%
struct:(##:N_Lati:<Sector,TSCT>)%,%
% top_light>,%
% bottom_light>%
WHERE
% top_light=<<<0.9,0.9,0.7>>,<<-:basx,Height*3,-:basy>,<2*basx,-:1,2*basy>,<>,<Height*5>,<2*PI/3>,<PI/2>>>,%
% bottom_light=<<<0.7,0.7,0.8>>,<<basx,-:Height*2,basy>,<0,1,0>,<>,<100>,<Height*4>,<2*PI/2>>>,%
Sector=struct:<the_side,top_a,floor_a,basement_a>,
the_side=(side_and_stairs:<N_Piani,N_fin,Height,Width>),
basement_a=texture:<material:<basement,basementcolor>,
basementtexture>,
basement=mkpol:<<<-:basx,0,basy>,<Width+basx,0,basy>,
<0,0,0>,<Width,0,0>,
<-:basx,-:section,basy>,<Width+basx,-:section,basy>,
<0,-:section,0>,<Width,-:section,0>>,
<<1,2,3,4,5,6,7,8>>,<<1>>>,
basy=(Width/N_fin)*cos:(alfa/2),
basx=(Width/N_fin)*sin:(alfa/2),
floor_a=texture:<material:<floor,floorcolor>,floortexture>,
floor=mkpol:<<<0,0,0>,<Width,0,0>,<(Width/2),0,-:Radius>,
<0,section,0>,<Width,section,0>,<(Width/2),section,-:Radius>>,
<<1,2,3,4,5,6>>,<<1>>>,
top_a=texture:<material:<top,roofcolor>,rooftexture>,
top=T:2:Height:top_1,
top_1=mkpol:<<<0,0,0>,<Width,0,0>,<(Width/2),(Height/N_Piani),-:Radius>,
<0,0,section>,<Width,0,section>,<(Width/2),(Height/N_Piani)+Section,-:Radius>>,
<<1,2,3,4,5,6>>,<<1>>>,
Section=(Height/(N_Piani*12)),
Radius=(Width/2)*((cos:(PI/N_Lati))/(sin:(PI/N_lati))),
TSCT=T:1:Width~R:<1,3>:(-:(2*PI)/N_Lati),
alfa=((2*PI)/N_Lati)
END;
def a_side_and_stairs=side_and_stairs:<2,3,2,6>;
def a_side=side:<2,3,2,6,0.1>;
def a_edificio=edificio:<2,3,6,2,6>;
def a_edificio_and_stairs=edificio_and_stairs:<2,3,6,2,6>;
DEF RAMPA_2=STRUCT~[RAMPA_1~[S1,S2,S3,S5],material~[myCYLINDER~[S4,S2,S1],K:colonnacolor]];
DEF RAMPA_2=STRUCT~[myCYLINDER~[S4,S2,S1],RAMPA_1~[S1,S2,S3,S5]];
DEF SCALA(piani::isint)=REPEAT:piani~[RAMPA_2~[S1,S2,S3,S4,S5],T:3~S2,PIANEROTTOLO~[S1,S2,S3,S5],K:ID];
def vbarcolor=BASEMATERIAL:<RGBCOLOR:<1,0.7,0.7>,BLACK,0.2,BLACK,0.2,0.0>;
def out=a_edificio_and_stairs;