Check out my personal projects below
- Show all
- Functional Programming6
- Programming Languages3
- Ray tracing3
Show all projects. Click tags to list them by topics.
This is an eavl/apply style lisp interpreter my friends and I mob-programmed as a course project.
CUDA Flocking (2020)
This project is a CUDA implementation of Boid, an artificial life program that simulates fishes or birds' flocking behaviors. The project first build a naive brute-force implementation, and then gradually optimize with grid accelerating data-structure, better data locality, and usage of CUDA shared memory. The simulation is visualized by OpenGL.
View my 2021 talk on this project for details on the boid algorithm and my code.
Minimal Visual Pedagogical Interpreter (2020)
The MVP (minimal visual pedagogical) interpreter is a substitution-based interpreter on a toy language. My goal is to demonstrate small-step operational semantics of programming languages visually for students new to this concept. The project supports single stepping forward/backward for the program execution and visualizes the AST at each step.
Ocamlpt is a path tracer live-coded in Youtube stream. The path tracer is based on Peter Shirley's fantastic book series "Ray Tracing in a Weekend." Some challenges I met include the poor support for graphics programming in the OCaml ecosystem and the inability of operator overloading in OCaml.
beyond::core contains a bunch of utilities that are associated with graphics. It serves as a supplementary of the C++ standard library and is shared in a lot of my graphics projects. The library implements an ECS, a math library built for 3d graphics, a thread pool, and some customized containers.
OpenGL Grass Renderer (2019)
This project is my implementation of the paper Responsive Real-Time Grass Rendering for General 3D Scenes. It uses a combination of compute and tessellation shaders to implement grass simulation and rendering. Grass blades are represented by Bezier curves, and the tessellation shaders dynamically create the grass geometry from the Bezier curves. The compute shader performs Euler's method to simulate the physics of grass blades and then use various culling techniques to reduces the grass blades to draw each frame.
beyond::functions is a C++17 implementation of various type erased callable types
unique_function (small-buffer optimized like
std::function but is const correct and move-only, see p0228)
fixed_function (always stack-allocated with a fix maximum capacity).
This library is the stand-along version of the same components in the beyond::core library.
glm-grid is a 2 dimensional immutable grid library for the Elm Programming Language.
Embedded ML (2018)
Embedded ML is a static-typed embedded scripting language written in C++. The Embedded ML language is inspired by languages from the ML family. This project includes a compiler and a bytecode stack-machine runtime. The compiler first parses the source code by a hand-rolled a recursive-descent pratt parser and then pipes the result AST (abstract syntax tree) into type checker and code generator. Afterward, the runtime executes the bytecode generated by the code generator.
Path Tracer (2018)
A Monte-Carlo Method based path tracing program for my own learning purpose. It is loosely based on Peter Shirley's Ray Tracing in One Weekend mini book and its sequels.
Reversi Elm (2018-2019)
Reversi-Elm is a browser-based clone of the classic board game Reversi in the Elm Programming Language. It supports both human vs. human games, human vs. computer games, and computer vs. computer games. The AI agent is built based on the minimax algorithm with alpha-beta pruning. It also uses a simple evaluation function which bases on piece count, location of pieces, and mobility (number of legal moves).
Ray Tracer (2016)
This is a toy ray tracer for the Edx's Computer Graphics Course. It is my first large scale personal coding project. It parses an ad-hoc scene description text format and then performs recursive ray-tracing. The ray tracer handles ray-sphere and ray-triangle intersection but is slow on large scenes because it does not implement any acceleration structures.
Personal website (2016-2022)
This website is a static site that initially built with Jekyll. In 2017, I migrated it to the current stack of Typescript, React, and GatsbyJs. It supports both English and Chinese language.