\section{Personal Projects}

\projectHeading{Real-time Shadow Simulator}{https://git.mmbradley.ca/MichaelBradley/perlin-shadows}{C++, OpenGL}
\begin{bullets}
    \item Built an OpenGL renderer in C++ that could cast real-time shadows on over 130M vertices
    \item Designed a multithreaded Perlin noise generator optimized to generate tiles in parallel
    \item Created lighting solution that scaled as needed so the renderer was limited only by VRAM
    \item Optimized matrix and vector operations with the GLM library
\end{bullets}

\projectHeading{N-Body Gravity Simulation}{https://git.mmbradley.ca/MichaelBradley/nbody}{Python}
\begin{bullets}
    \item Implemented time-stepped gravity simulations over N bodies with visualization in 2 or 3 dimensions
    \item Generalized physics functions to function in an arbitrary number of dimensions
    \item Optimized physics using NumPy to perform vector calculations in parallel
\end{bullets}

\projectHeading{Electronic Holiday Card Distribution}{https://github.com/MichaelMBradley/holidaycards2022}{JavaScript, HTML, CSS}
\begin{bullets}
    \item Created a website from scratch (deployed using GitHub Pages) to distribute holiday cards to friends and family
    \item Used JavaScript APIs to encrypt the messages to ensure they were only read by the intended recipient
    \item Integrated the \href{https://p5js.org}{\underline{p5.js}} graphics library to generate unique assets and animated backgrounds
    \item Implemented a limited set of markdown functionality using regular expression replacement
\end{bullets}

\projectHeading{Personal Website}{https://git.mmbradley.ca/MichaelBradley/website}{TypeScript, CSS, React, Vite}
\begin{bullets}
    \item Designed personal homepage to be responsive to device size, resizing as necessary using pure CSS
    \item Made website accessible by respecting user's preference for reduced motion and a dark mode toggle without JS
    \item Set up Vite and React to develop with HMR, but then deploy to a single HTML file with embedded CSS and no JS
\end{bullets}
