import graph3;

size(200);

real c=(1+sqrt(5))/2;

triple[] z={(c,1,0),(-c,1,0),(-c,-1,0),(c,-1,0)};
triple[] x={(0,c,1),(0,-c,1),(0,-c,-1),(0,c,-1)};
triple[] y={(1,0,c),(1,0,-c),(-1,0,-c),(-1,0,c)};

triple[][] Q=
 {
  {(c,1,0),(1,0,-c),(0,c,-1),(0,c,1),(1,0,c),(c,-1,0)},
  {(-c,1,0),(0,c,1),(0,c,-1),(-1,0,-c),(-c,-1,0),(-1,0,c)},
  {(-c,-1,0),(-c,1,0),(-1,0,-c),(0,-c,-1),(0,-c,1),(-1,0,c)},
  {(c,-1,0),(c,1,0),(1,0,c),(0,-c,1),(0,-c,-1),(1,0,-c)},
  {(0,c,1),(0,c,-1),(-c,1,0),(-1,0,c),(1,0,c),(c,1,0)},
  {(0,-c,1),(0,-c,-1),(-c,-1,0),(-1,0,c),(1,0,c),(c,-1,0)},
  {(0,-c,-1),(0,-c,1),(c,-1,0),(1,0,-c),(-1,0,-c),(-c,-1,0)},
  {(0,c,-1),(0,c,1),(c,1,0),(1,0,-c),(-1,0,-c),(-c,1,0)},
  {(1,0,c),(-1,0,c),(0,-c,1),(c,-1,0),(c,1,0),(0,c,1)},
  {(1,0,-c),(-1,0,-c),(0,-c,-1),(c,-1,0),(c,1,0),(0,c,-1)},
  {(-1,0,-c),(1,0,-c),(0,c,-1),(-c,1,0),(-c,-1,0),(0,-c,-1)},
  {(-1,0,c),(1,0,c),(0,c,1),(-c,1,0),(-c,-1,0),(0,-c,1)}
 };

real R=abs(interp(Q[0][0],Q[0][1],1/3));

triple[][] P;
for(int i=0; i < Q.length; ++i) {
 P[i]=new triple[] ;
 for(int j=0; j < Q[i].length; ++j) {
   P[i][j]=Q[i][j]/R;
 }
}

for(int i=0; i < P.length; ++i) {
 for(int j=1; j < P[i].length; ++j) {
   triple C=P[i][0];
   triple A=P[i][j];
   triple B=P[i][j % 5+1];
   triple[] sixout=new
     triple[] {interp(C,A,1/3),interp(C,A,2/3),interp(A,B,1/3),interp(A,B,2/3),
               interp(B,C,1/3),interp(B,C,2/3)};
   triple M=(sum(sixout))/6;
   triple[] sixin=sequence(new triple(int k) {
       return interp(sixout[k],M,0.1);
     },6);
   draw(surface(reverse(operator--(...sixout)--cycle)^^
                operator--(...sixin)--cycle,planar=true),magenta);
 }
}

for(int i=0; i < P.length; ++i) {
 triple[] fiveout=sequence(new triple(int k) {
     return interp(P[i][0],P[i][k+1],1/3);
   },5);
 triple M=(sum(fiveout))/5;
 triple[] fivein=sequence(new triple(int k) {
     return interp(fiveout[k],M,0.1);
   },5);
 draw(surface(reverse(operator--(...fiveout)--cycle)^^
              operator--(...fivein)--cycle,planar=true),cyan);
}