Customer case
Griffin games
A bolder and more playful brand identity for a tech-focused gaming company
A new graphics engine
Griffin builds games where the world reacts to the player. We built them a data art engine to match, so the brand visuals come from the same systems that drive their games.
Pixel based rendering
Coarse pixel grids that echo the studio’s early game jam roots
Character creation
A generative character set used across the site, socials and merch
Core got what we were after right away. The brand feels like one of our own games, and the engine they built is now part of our actual toolchain.
Lua developer APIs
The engine ships with a small Lua API, so Griffin’s own developers can script new brand visuals the same way they script gameplay.
World generation
A draw call renders each particle from live simulation data. Speed maps to color, age to size.
function World.draw(world)canvas.clear("#0a0a0f")for _, e in ipairs(world.entities) dolocal alpha = math.min(e.age / 2.0, 1.0)local speed = math.sqrt(e.vx^2 + e.vy^2)local hue = remap(speed, 0, 2, 200, 320)local radius = remap(e.age, 0, 10, 1, 3)canvas.circle(e.x, e.y, radius, {color = hsl(hue, 0.8, 0.6),alpha = alpha * 0.6,})end
Motion scripting
A full scene in a dozen lines. Spawn a particle field, hand it to the engine, and the update loop does the rest.
-- data art world: flying field particleslocal world = World.new(800, 600)for i = 1, 1200 doWorld.spawn(world,math.random(0, 800),math.random(0, 600),"flow")end-- engine calls these each framefunction love.update(dt) World.update(world, dt) endfunction love.draw() World.draw(world) end