Customer case

Griffin games

A bolder and more playful brand identity for a tech-focused gaming company

The new identity in motion. Every frame is generated live from game data, so the artwork never repeats itself.

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.

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.
Mika SaloCreative director at Griffin Games

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) do
local 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 particles
local world = World.new(800, 600)
for i = 1, 1200 do
World.spawn(world,
math.random(0, 800),
math.random(0, 600),
"flow"
)
end
-- engine calls these each frame
function love.update(dt) World.update(world, dt) end
function love.draw() World.draw(world) end