local vec3 = require "vec3" local streetutil = require "streetutil" local laneutil = { } local function subtract(a, b) return { a[1] - b[1], a[2] - b[2], a[3] - b[3] } end local function scale(a, b) return { a[1] * b, a[2] * b, a[3] * b } end function laneutil.makeLanes(input) local result = { } for i = 1, #input do local entry = input[i] local p0 = entry[1] local p1 = entry[2] local t0 = entry[3] local t1 = entry[4] local width = entry[5] p0 = vec3.new(p0[1], p0[2], p0[3]) p1 = vec3.new(p1[1], p1[2], p1[3]) t0 = vec3.normalize(vec3.new(t0[1], t0[2], t0[3])) t1 = vec3.normalize(vec3.new(t1[1], t1[2], t1[3])) local length = vec3.distance(p0, p1) local angle = vec3.angleUnit(t0, t1) local scale = streetutil.calcScale(length, angle) t0 = vec3.mul(scale, t0) t1 = vec3.mul(scale, t1) table.insert(result, { { p0.x, p0.y, p0.z }, { t0.x, t0.y, t0.z }, width } ) table.insert(result, { { p1.x, p1.y, p1.z }, { t1.x, t1.y, t1.z }, width } ) end return result end function laneutil.createLanes(data, transportModes, speed, width, linkable) assert(data.curves ~= nil) local result = { nodes = {} } if speed then result.speedLimit = speed end if linkable then result.linkable = linkable end result.transportModes = transportModes local w = 0 if width then w = width end for k, v in pairs(data.curves) do local nodes = result.nodes for i=1, #v do local points = v[i] if #points == 2 then local tangent = subtract(points[2], points[1]) nodes[#nodes + 1] = { points[1], tangent, w } nodes[#nodes + 1] = { points[2], tangent, w } elseif #points == 3 then local tangent1 = scale(subtract(points[2], points[1]), 2.0) local tangent2 = scale(subtract(points[3], points[2]), 2.0) nodes[#nodes + 1] = { points[1], tangent1, w } nodes[#nodes + 1] = { points[3], tangent2, w } elseif #points == 4 then local tangent1 = scale(subtract(points[2], points[1]), 3.0) local tangent2 = scale(subtract(points[4], points[3]), 3.0) nodes[#nodes + 1] = { points[1], tangent1, w } nodes[#nodes + 1] = { points[4], tangent2, w } else assert(false) end end end return result end return laneutil