\usepackage{ifthen}

\def\size{3}
\def\frontScale{0.75}
\def\leftScale{1.0}
\def\rightScale{1.0}
\def\frontCos{0.61}
\def\leftCos{0.94}
\def\rightCos{0.94}
\def\frontSin{0.44}
\def\leftSin{0.34}
\def\rightSin{0.34}
\def\angle{0}

\newcommand\computeFront[2]
{
  \edef\frontScale{#2}
  \pgfmathparse{cos(#1)*\frontScale}
  \edef\frontCos{\pgfmathresult}
  \pgfmathparse{sin(#1)*\frontScale}
  \edef\frontSin{\pgfmathresult}
}

\newcommand\computeLeft[2]
{
  \edef\leftScale{#2}
  \pgfmathparse{cos(#1)*\leftScale}
  \edef\leftCos{\pgfmathresult}
  \pgfmathparse{sin(#1)*\leftScale}
  \edef\leftSin{\pgfmathresult}  
}

\newcommand\computeRight[2]
{
  \edef\rightScale{#2}
  \pgfmathparse{cos(#1)*\rightScale}
  \edef\rightCos{\pgfmathresult}
  \pgfmathparse{sin(#1)*\rightScale}
  \edef\rightSin{\pgfmathresult}  
}

\newcommand\frontshapes[5]
% #1, #2 - współrzędne prawego dolnego wierzchołka
% #3 - kształty i kolory ścian, w kolejności: prawa, przednia, górna
% #4 - współczynnik skalowania obramowania
% #5 - współczynnik skalowania kształtu
{
  \setcounter{nr}{0}
  \draw (0,0) circle(0);
  \foreach \i/\j in #3
  {
    \addtocounter{nr}{1}
    \pgftransformreset
    \ifthenelse{\value{nr} = 1}{\pgftransformcm{\frontCos*\size}{\frontSin*\size}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 2}{\pgftransformcm{-1*\size}{0}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 3}{\pgftransformcm{\frontCos*\size}{\frontSin*\size}{-1*\size}{0}{\pgfpoint{#1cm}{#2cm + #4*\size cm}}}{}
    \ifthenelse{\value{nr} = 2}{\face{\i}{\j}{-1}{#4}{#5}}{\face{\i}{\j}{1}{#4}{#5}}
  }
}

\newcommand\unroundedfrontshapes[5]
% #1, #2 - współrzędne prawego dolnego wierzchołka
% #3 - kształty i kolory ścian, w kolejności: prawa, przednia, górna
% #4 - współczynnik skalowania obramowania
% #5 - współczynnik skalowania kształtu
{
  \setcounter{nr}{0}
  \draw (0,0) circle(0);
  \foreach \i/\j in #3
  {
    \addtocounter{nr}{1}
    \pgftransformreset
    \ifthenelse{\value{nr} = 1}{\pgftransformcm{\frontCos*\size}{\frontSin*\size}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 2}{\pgftransformcm{-1*\size}{0}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 3}{\pgftransformcm{\frontCos*\size}{\frontSin*\size}{-1*\size}{0}{\pgfpoint{#1cm}{#2cm + #4*\size cm}}}{}
    \ifthenelse{\value{nr} = 2}{\unroundedface{\i}{\j}{-1}{#4}{#5}}{\unroundedface{\i}{\j}{1}{#4}{#5}}
  }
}

\newcommand\shapes[5]
% #1, #2 - współrzędne najniższego punktu
% #3 - kształty i kolory ścianach, w kolejności: prawa, lewa, górna
% #4 - współczynnik skalowania obramowania
% #5 - współczynnik skalowania kształtu
{
  \setcounter{nr}{0}
  \draw (0,0) circle(0);
  \foreach \i/\j in #3
  {
    \addtocounter{nr}{1}
    \pgftransformreset
    \ifthenelse{\value{nr} = 1}{\pgftransformcm{\rightCos*\size}{\rightSin*\size}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 2}{\pgftransformcm{-\leftCos*\size}{\leftSin*\size}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 3}{\pgftransformcm{\rightCos*\size}{\rightSin*\size}{-\leftCos*\size}{\leftSin*\size}{\pgfpoint{#1cm}{#2cm + #4*\size cm}}}{}
    \ifthenelse{\value{nr} = 2}{\face{\i}{\j}{-1}{#4}{#5}}{\face{\i}{\j}{1}{#4}{#5}}
  }
}

\newcommand\unroundedshapes[5]
% #1, #2 - współrzędne najniższego punktu
% #3 - kształty i kolory ścianach, w kolejności: prawa, lewa, górna
% #4 - współczynnik skalowania obramowania
% #5 - współczynnik skalowania kształtu
{
  \setcounter{nr}{0}
  \draw (0,0) circle(0);
  \foreach \i/\j in #3
  {
    \addtocounter{nr}{1}
    \pgftransformreset
    \ifthenelse{\value{nr} = 1}{\pgftransformcm{\rightCos*\size}{\rightSin*\size}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 2}{\pgftransformcm{-\leftCos*\size}{\leftSin*\size}{0}{\size}{\pgfpoint{#1cm}{#2cm}}}{}
    \ifthenelse{\value{nr} = 3}{\pgftransformcm{\rightCos*\size}{\rightSin*\size}{-\leftCos*\size}{\leftSin*\size}{\pgfpoint{#1cm}{#2cm + #4*\size cm}}}{}
    \ifthenelse{\value{nr} = 2}{\unroundedface{\i}{\j}{-1}{#4}{#5}}{\unroundedface{\i}{\j}{1}{#4}{#5}}
  }
}

\newcommand\translate[3]
{
  \pgftransformcm{#3}{0}{0}{1}{\pgfpoint{#1cm}{#2cm}}
}

\newcommand\scale[1]
{
  \pgftransformcm{#1}{0}{0}{#1}{\pgfpoint{0}{0}}
}

\newcommand\unroundedface[5]
% #1 - kształt
% #2 - kolor tła
% #3 - 1 lub -1, jeśli -1 to rysowane jest lustrzane odbicie
% #4 - wsp. skalowania ramki
% #5 - wsp. skalowania kształtu
{
  \draw (0,0) circle(0);
  \scale{#4}	
  \fill[fill = #2] rectangle(1, 1);
  \draw rectangle(1, 1);
  \translate{0.5}{0.5}{#3}
  \scale{1/#4}
  \scale{#5}
  \pgftext[rotate = \angle]{#1}
}

\newcommand\face[5]
% #1 - kształt
% #2 - kolor tła
% #3 - 1 lub -1, jeśli -1 to rysowane jest lustrzane odbicie
% #4 - wsp. skalowania ramki
% #5 - wsp. skalowania kształtu
{	
  \draw (0,0) circle(0);
  \scale{#4}	 
  \fill[fill = #2, rounded corners] rectangle(1, 1);
  \draw[rounded corners] rectangle(1, 1);
  \translate{0.5}{0.5}{#3}
  \scale{1/#4}
  \scale{#5}
  \pgftext[rotate = \angle]{#1}
}


