-- Geometric primitives for raymarching require "Vector" local V = Vector local function make_sphere(centre, radius, texture) local norm = V.norm return function(p) return {dist = V.norm(p-centre) - radius, texture = texture} end end local function make_plane(centre, normal, texture) return function(p) return {dist = normal*(p-centre), texture = texture} end end local function make_pipe(centre, radius, axis, texture) return function(p) return {dist = V.norm(V.cross(p-centre, axis)) - radius, texture = texture} end end Primitives = { make_sphere = make_sphere, make_plane = make_plane, make_pipe = make_pipe } return Primitives