Created by

A render from the collection




Sale details

Published 7/6/2023

Enforcement is a play on constraints. It treats pixels on the screen as particles in a system. Constraining them to certain types of movement, whether that would reflect physics or something more abstract.



There are 6 different "modes" of movement that I've programmed into the shader. Each with it's own distinctive feel.

1- Liquid; This movement mode treats the particles almost as fluid and lets them spread along the canvas in a movement resembling one as liquid.

2-Centrifugal; Almost like being inside a wind-tunnel of sorts, this movement mode takes the particles and blows them across this circular field of wind.

3-Divisional; Taking the canvas and dividing it into sections, that's what this mode is good at. It makes sure the particles get moved away from the center of the cells in the grid, which makes for a super rigid structure.

Occasionally, this mode includes a final "ringed" pass, which rotates sections of the canvas in the shape of rings around with increasing angles. These rings can be centred or rotating around the y-axis.

4-Spacetime; This movement mode makes me feel like I'm in a place between space and time. Tearing up the pure matter it's made up of into pieces.

5-Spectrographic; Always reminding me of spectrographs (hence the naming), this movement mode takes the canvas and does a similar thing as mode 3, but adds rotation and noise in the mix, making it feel like a graph of sorts.

6-Turbulence; Similar to mode 2, this movement mode takes the particles and makes them blow around a circular field of wind, yet this time distorting spacetime in such a way that the particles seem to be enveloped into a storm, resulting in a chaotic yet controlled environment.



Scroll - zoom in and out by scrolling down and up the page, get pixel peeping! It's my proudest achievement in this collection :)

Spacebar - save the output in full resolution.


URL parameters:

By adding a ? with either of these parameters after it, you can up the resolution and rendering time for the piece:

  • amnt=(value between 100 and 1000 works best, 100 is default)
  • res=(resolution width in pixels, default is 2000)

for example:


Disclaimer: the outputs can vary slightly between devices, this is because it runs almost exclusively on the GPU, which is not as accurate on some devices. I've decided on this option because of the power the GPU brings. The differences are often times not noticeable on similar resolutions.

The same device will always result in the same output.


Made by WootScoot with p5.js and webgl. June - 2023.