Grain is a domain specific language (DSL) to program GPU-accelerated particle systems. This is an academic project for CS2104R (Programming language concepts).

It consist of 2 parts:

Please refer to the project report for more details such as motivations and syntax.

My role and contributions

This is an individual assignment and I am the only developer of this project. My contributions include:

Technologies and tools used


The following piece of code creates a point emitter:

@param vec2 emission_point
@param float min_speed
@param float max_speed
@param float min_angle
@param float max_angle
@attribute vec2 position
@attribute vec2 velocity
@require aging

position = emission_point;
float speed = random_range(min_speed, max_speed);
float angle = random_range(min_angle, max_angle);
velocity = vec2(cos(angle), sin(angle)) * speed;

Combined with a particle system that reacts to gravity, it creates the following effect: geyser

The following code creates an object which deflects particles:

@require linear_motion
@param vec2 center
@param float radius

vec2 normal = position - center;
bool inCircle = length(normal) < radius;
bool goingIn = dot(normal, velocity) < 0.0;
bool bounce = inCircle && goingIn;
vec2 newV = reflect(velocity, normalize(normal));
velocity = (bounce) ? newV / 3 : velocity;
life = select(bounce, life / 2, life);

Here’s a screenshot of it in action: rain

Source code

Available at: