\documentclass{standalone} \usepackage{tikz} \usetikzlibrary{shadows, arrows} \renewcommand{\familydefault}{\sfdefault} \definecolor{lightBlue}{RGB}{46, 172, 228} \definecolor{darkBlue}{RGB}{30, 65, 81} \tikzset{ shade border north to south/.style args={#1 to #2}{ postaction={draw, very thick, path fading=south, #1}, postaction={draw, very thick, path fading=north, #2} } } \begin{document} \begin{tikzpicture}[ class/.style={ rounded corners, rectangle, draw, align=center, top color=lightBlue, bottom color=darkBlue, text=white, drop shadow, shade, shade border north to south=lightBlue!97!black to darkBlue!97!black, text width=2.5cm, anchor=mid } ] \node[class] (Sim) at (0,0) {Simulation}; % Time Step \node[class] (Time) at (-9, -1.5) {TimeStep}; % Pressure Solvers \foreach \x/\y in {WCSPH/0, PCISPH/1, PBF/2, IISPH/3, DFSPH/4, PF/5} { \node[class] (\x) at (-10, -3 - \y*0.6) {\x}; \draw[ultra thick] (-8, -2.4 - \y*0.6) -- (-8, -3 - \y*0.6); \draw[ultra thick] (-8, -3 -\y*0.6) -- (\x); } % Fluid Models \node[class] (Fluid) at (-3, -1.5) {FluidModel}; % Non Pressure Force Base Class \node[class] (NonPressure) at (-5, -3) {NonPressure ForceBase}; %Non Pressure Forces Implementation \foreach \x/\y in {DragBase/-4.5, ElasticityBase/-5.175, ViscosityBase/-6.875, VorticityBase/-7.55} { \node[class] (\x) at (-6, \y) {\x}; \draw[ultra thick] (\x) -- (-4, \y); } \node[class] (SurfaceTension Base) at (-6, -5.85) {SurfaceTension Base}; \draw[ultra thick] (SurfaceTension Base) -- (-4, -6); % Emitters \node[class] (Emitter) at (-1, -3) {EmitterSystem}; % Emitter Implementation \node[class] (Emit) at (-1, -4.5) {Emitter}; % Boundaries \node[class] (Boundary) at (3, -1.5) {BoundaryModel}; % Boundary classes \node[class] (Static) at (4, -3) {StaticRigidBody}; \node[class] (Dynamic) at (4, -3.675) {PBDRigidBody}; % AnimationFieldSystem \node[class] (AnimField) at (9, -1.5) {AnimationField System}; % Animation Fields \node[class] (Anim) at (9, -3.5) {AnimationField}; % Lines \draw[ultra thick] (Sim) -- node[right] {$1$} (0, -.75); \draw[ultra thick] (0, -.75) -- (-9, -.75) -- node[right] {$1$} (Time); \draw[ultra thick] (-3, -.75) -- node[right] {$1..^*$} (Fluid); \draw[ultra thick] (0, -.75) -- (3, -.75) -- node[right] {$0..^*$} (Boundary); \draw[ultra thick] (3, -.75) -- (9, -.75) -- node[right] {$1$} (AnimField); \draw[{triangle 90}-, ultra thick] (-8,-1.775) -- (-8, -3); \draw[ultra thick] (Fluid) -- node[right] {$1$} (-3, -2.25); \draw[ultra thick] (-3, -2.25) -- (-5, -2.25); \draw[ultra thick] (-5, -2.22) -- node[right] {$5$} (NonPressure); \draw[ultra thick] (-3, -2.25) -- (-1, -2.25); \draw[ultra thick] (-1, -2.22) -- node[right] {$1$} (Emitter); \draw[{triangle 90}-, ultra thick] (-4, -3.625) -- (-4, -7.55); \draw[ultra thick] (Emitter) -- node[right, yshift=-.75em] {$0..^*$} (Emit); \draw[ultra thick] (2, -1.775) -- node[right, yshift=1em] {$1$} (2, -3) -- (2, -3.675); \draw[ultra thick] (2, -3) -- node[above] {$0..1$} (Static); \draw[ultra thick] (2, -3.675) -- node[above] {$0..1$} (Dynamic); \draw[ultra thick] (AnimField) -- node[right, yshift=-.75em] {$0..^*$} (Anim); \end{tikzpicture} \end{document}