linePointFromXnorm
Definition
-- @/lua/common/mathlib.lua:687
function linePointFromXnorm(p0, p1, xnorm)
return newLuaVec3xyz(p0.x + (p1.x-p0.x) * xnorm, p0.y + (p1.y-p0.y) * xnorm, p0.z + (p1.z-p0.z) * xnorm)
end
Callers
@/lua/ge/extensions/core/trafficSignals.lua
local xnorm = pos:xnormOnLine(p1, p2)
local nPos = linePointFromXnorm(p1, p2, xnorm)
local radius = lerp(mapNodes[n1].radius, mapNodes[n2].radius, xnorm)
@/lua/ge/extensions/core/multiSpawn.lua
pos = linePointFromXnorm(p1, p2, xnorm) + baseRot:z0():normalized():cross(vecUp) * (radius * side)
else
p1, p2 = mapNodes[path[1]].pos, mapNodes[path[2]].pos
origin = linePointFromXnorm(p1, p2, clamp(pos:xnormOnLine(p1, p2), 0, 1))
dist = origin:distance(p1)
@/lua/ge/extensions/editor/trafficManager.lua
-- calculate tentative spawn position as the road center line position closest to pos
local spawnPos = linePointFromXnorm(p1, p2, xnorm)
local oobb = veh:getSpawnWorldOOBB()
sessionData.home.p1 = linePointFromXnorm(oobb:getPoint(0), oobb:getPoint(3), 0.5)
sessionData.home.p2 = linePointFromXnorm(oobb:getPoint(4), oobb:getPoint(7), 0.5)
sessionData.home.p1 = linePointFromXnorm(oobb:getPoint(0), oobb:getPoint(3), 0.5)
sessionData.home.p2 = linePointFromXnorm(oobb:getPoint(4), oobb:getPoint(7), 0.5)
end
@/lua/vehicle/ai.lua
local p1Radius = plan[i+1].radiusOrig
if ego.pos:squaredDistance(linePointFromXnorm(p1Pos, plan[i+2].pos, nextXnorm)) <
square(ego.width + lerp(p1Radius, plan[i+2].radiusOrig, min(1, nextXnorm))) then
local targetSeg = max(1, plan.planCount-1)
local prevPos = linePointFromXnorm(plan[1].pos, plan[2].pos, plan.egoXnormOnSeg) -- ego.pos
local xnorm = clamp(targetPos:xnormOnLine(prevPos, pos), 0, 1)
local lp_n1n2 = linePointFromXnorm(prevPos, pos, xnorm * 0.5 + 0.25)
if xnorm <= 0.5 then
if i >= 3 then
targetPos = linePointFromXnorm(linePointFromXnorm(plan[i-2].pos, prevPos, xnorm * 0.5 + 0.75), lp_n1n2, xnorm + 0.5)
end
if i >= 3 then
targetPos = linePointFromXnorm(linePointFromXnorm(plan[i-2].pos, prevPos, xnorm * 0.5 + 0.75), lp_n1n2, xnorm + 0.5)
end
if i <= plan.planCount - 2 then
targetPos = linePointFromXnorm(lp_n1n2, linePointFromXnorm(pos, plan[i+1].pos, xnorm * 0.5 - 0.25), xnorm - 0.5)
end
if i <= plan.planCount - 2 then
targetPos = linePointFromXnorm(lp_n1n2, linePointFromXnorm(pos, plan[i+1].pos, xnorm * 0.5 - 0.25), xnorm - 0.5)
end
--dump('b2', 'e1Xnorm = ', e1Xnorm, 'e2Xnorm = ', e2Xnorm)
local p1 = linePointFromXnorm(e1P1, e1P2, e1Xnorm)
local p2 = linePointFromXnorm(e2P1, e2P2, e2Xnorm)
local p1 = linePointFromXnorm(e1P1, e1P2, e1Xnorm)
local p2 = linePointFromXnorm(e2P1, e2P2, e2Xnorm)
p1:setAdd(p2); p1:setScaled(0.5)
local segLen = e1P2:distance(e1P1)
return linePointFromXnorm(e1P1, e1P2, max(e1Xnorm, 1 - e1R2/segLen))
local segLen = e2P1:distance(e2P2)
return linePointFromXnorm(e2P1, e2P2, min(e2Xnorm, e2R1/segLen))
--dump('b6')
local p1 = linePointFromXnorm(e1P1, e1P2, e1Xnorm)
local p2 = linePointFromXnorm(e2P1, e2P2, e2Xnorm)
local p1 = linePointFromXnorm(e1P1, e1P2, e1Xnorm)
local p2 = linePointFromXnorm(e2P1, e2P2, e2Xnorm)
p1:setAdd(p2); p1:setScaled(0.5)
local p1, p2 = plan[1].pos, plan[2].pos
local dispVec = ego.pos - linePointFromXnorm(p1, p2, ego.pos:xnormOnLine(p1, p2))
dispVec:setScaled(min(1, 2 * dt))
local _, t2 = closestLinePoints(newNode.posOrig, newNode.posOrig + newNode.normal, plan[i].posOrig + plan[i].radiusOrig * edgeNormal, plan[i+1].posOrig + plan[i+1].radiusOrig * edgeNormal)
local limPos = linePointFromXnorm(plan[i].posOrig + plan[i].radiusOrig * edgeNormal, plan[i+1].posOrig + plan[i+1].radiusOrig * edgeNormal, max(0, min(1, t2)))
local roadHalfWidth = newNode.posOrig:distance(limPos)
if xnorm >= 0 and xnorm <= 1 and sqDist <= square(2 * rad) then
posOrig = linePointFromXnorm(pos2, pos1, xnorm)
normal:setCross(biNormal, pos1 - pos2); normal:normalize()
local rad = lerp(rad2, rad1, xnorm)
posOrig = linePointFromXnorm(pos2, pos1, xnorm)
normal:setCross(biNormal, pos1 - pos2); normal:normalize()
local midPos = ego.pos - lenVec * 0.5
--local planPos = linePointFromXnorm(plan[1].pos, plan[2].pos, plan.egoXnormOnSeg or 0)
--midPos = linePointFromXnorm(planPos, planPos - lenVec, midPos:xnormOnLine(planPos, planPos - lenVec)) -- offset as next plan node
--local planPos = linePointFromXnorm(plan[1].pos, plan[2].pos, plan.egoXnormOnSeg or 0)
--midPos = linePointFromXnorm(planPos, planPos - lenVec, midPos:xnormOnLine(planPos, planPos - lenVec)) -- offset as next plan node
local dispLeft, dispRight = 0, 0
if xnorm1 > 0 and xnorm1 < 1 and xnorm2 > 0 and xnorm2 < 1 then -- v-vehicle is on our left side
dispLeft = max(dispLeft, linePointFromXnorm(posF, posR, xnorm1):squaredDistance(posR))
elseif xnorm3 > 0 and xnorm3 < 1 and xnorm4 > 0 and xnorm4 < 1 then -- v-vehicle is on our right side
elseif xnorm3 > 0 and xnorm3 < 1 and xnorm4 > 0 and xnorm4 < 1 then -- v-vehicle is on our right side
dispRight = max(dispRight, linePointFromXnorm(posF, posL, xnorm3):squaredDistance(posL))
end
local p1, p2 = plan[1].pos, plan[2].pos
local dispVec = ego.pos - linePointFromXnorm(p1, p2, ego.pos:xnormOnLine(p1, p2)); dispVec:setScaled(0.5 * dt)
for _, data in ipairs(traffic[i]) do
local plPosOnPlan = linePointFromXnorm(n.pos, plan[i+1].pos, data[2])
debugDrawer:drawSphere(0.25, plPosOnPlan, color(0,255,0,100))
@/lua/ge/extensions/flowgraph/nodes/util/linePointFromXnorm.lua
posB:setFromTable(self.pinIn.posB.value)
self.pinOut.pos.value = linePointFromXnorm(posA, posB, self.pinIn.xnorm.value or 0.5):toTable()
end
@/lua/ge/extensions/flowgraph/nodes/vehicle/touchingStatic.lua
self.points.F.pos:set(linePointFromXnorm(self.points.FL.pos, self.points.FR.pos, 0.5))
self.points.R.pos:set(linePointFromXnorm(self.points.FR.pos, self.points.BR.pos, 0.5))
self.points.F.pos:set(linePointFromXnorm(self.points.FL.pos, self.points.FR.pos, 0.5))
self.points.R.pos:set(linePointFromXnorm(self.points.FR.pos, self.points.BR.pos, 0.5))
self.points.B.pos:set(linePointFromXnorm(self.points.BR.pos, self.points.BL.pos, 0.5))
self.points.R.pos:set(linePointFromXnorm(self.points.FR.pos, self.points.BR.pos, 0.5))
self.points.B.pos:set(linePointFromXnorm(self.points.BR.pos, self.points.BL.pos, 0.5))
self.points.L.pos:set(linePointFromXnorm(self.points.BL.pos, self.points.FL.pos, 0.5))
self.points.B.pos:set(linePointFromXnorm(self.points.BR.pos, self.points.BL.pos, 0.5))
self.points.L.pos:set(linePointFromXnorm(self.points.BL.pos, self.points.FL.pos, 0.5))
self.center:set(linePointFromXnorm(self.points.F.pos, self.points.B.pos, 0.5))
@/lua/ge/extensions/editor/vehicleEditor/staticEditor/vePartTree.lua
if xnorm2 >= 0 and xnorm2 <= 1 then
--local minSqPointDis = linePointFromXnorm(rayStartPos, rayEndPos, xnorm1):squaredDistance(linePointFromXnorm(beamPos1, beamPos2, clamp(xnorm2, 0, 1)))
tempLinePoint1:setLerp(rayStartPos, rayEndPos, xnorm1)
if xnorm2 >= 0 and xnorm2 <= 1 then
--local minSqPointDis = linePointFromXnorm(rayStartPos, rayEndPos, xnorm1):squaredDistance(linePointFromXnorm(beamPos1, beamPos2, clamp(xnorm2, 0, 1)))
tempLinePoint1:setLerp(rayStartPos, rayEndPos, xnorm1)
@/lua/ge/extensions/editor/objectToSplineEditor.lua
while innerDist <= dist do
local pos = linePointFromXnorm(pos1, pos2, innerDist / dist)
local dirSide = params.flipX and 1 or -1
@/lua/ge/extensions/flowgraph/nodes/vehicle/ai/goToEndLine.lua
end
local frontPos = linePointFromXnorm(vec3(veh:getCornerPosition(0)), vec3(veh:getCornerPosition(1)), 0.5)
local endLinePosition = self.pinIn.endLinePosition.value
@/lua/ge/map.lua
local l2Prad = lerp(l2n1rad, l2n2rad, l2Xnorm)
local tempVec = (linePointFromXnorm(l2n1pos, l2n2pos, l1n1pos:xnormOnLine(l2n1pos, l2n2pos)) - l1n1pos):normalized() * (l2Prad + l1n1rad)
if l1n1pos:squaredDistanceToLine(l2n1pos, l2n2pos) < tempVec:z0():squaredLength() then -- square(l2Prad + l1n1rad) -- Why z0?
for i = 1, #splitData do
positions[i] = linePointFromXnorm(map.nodes[n1].links[n2].inPos, map.nodes[n1].links[n2].outPos, splitData[i][1])
radii[i] = lerp(map.nodes[n1].links[n2].inRadius, map.nodes[n1].links[n2].outRadius, splitData[i][1])
if l1xn > 0 and l1xn < 1 and l2xn > 0 and l2xn < 1 then
local t1 = linePointFromXnorm(l1n1pos, l1n2pos, l1xn)
local t2 = linePointFromXnorm(l2n1pos, l2n2pos, l2xn)
local t1 = linePointFromXnorm(l1n1pos, l1n2pos, l1xn)
local t2 = linePointFromXnorm(l2n1pos, l2n2pos, l2xn)
local l1Prad = lerp(l1n1rad, l1n2rad, l1xn)
for j = 1, #splitData do
positions[j] = linePointFromXnorm(map.nodes[n1].links[n2].inPos, map.nodes[n1].links[n2].outPos, splitData[j][1])
radii[j] = lerp(map.nodes[n1].links[n2].inRadius, map.nodes[n1].links[n2].outRadius, splitData[j][1])
if xnorm > 0 and xnorm < 1 then
local linePoint = linePointFromXnorm(l1n1pos, l1n2pos, xnorm)
local l1n1rad = edges[edgeId][3].inRadius
for j = 1, #splitData do
positions[j] = linePointFromXnorm(map.nodes[n1].links[n2].inPos, map.nodes[n1].links[n2].outPos, splitData[j][1])
radii[j] = lerp(map.nodes[n1].links[n2].inRadius, map.nodes[n1].links[n2].outRadius, splitData[j][1])
-- local halfWidth = trajectory[i-1].halfWidth + (trajectory[i+1].halfWidth - trajectory[i-1].halfWidth) * xnorm
-- local p = linePointFromXnorm(trajectory[i-1].posOrig, trajectory[i+1].posOrig, xnorm)
-- local dispFromCenter = s.dispLimFromCenterAbs or (s.dispLimFromCenterRel and s.dispLimFromCenterRel * halfWidth) or math.huge
@/lua/ge/extensions/flowgraph/nodes/vehicle/ai/arrive.lua
end
local frontPos = linePointFromXnorm(vec3(veh:getCornerPosition(0)), vec3(veh:getCornerPosition(1)), 0.5)
local dist = (frontPos - node.pos):length()
@/lua/ge/extensions/gameplay/race/race.lua
-- if vehicle is before the start node or after the finish node, leave the xnorm unclamped
local roadPos = linePointFromXnorm(n1.pos, n2.pos, xnorm)
local rad = lerp(mapNodes[n1.wp] and mapNodes[n1.wp].radius or 10, mapNodes[n2.wp] and mapNodes[n2.wp].radius or 10, xnorm)
@/lua/ge/extensions/gameplay/sites/parkingSpot.lua
for i, pointId in ipairs(pointIds) do
if self:containsPoint(linePointFromXnorm(bbCenter, bbPoints[pointId], precision)) then
res[i] = true
tempPos2:set(bbPoints[nextId])
if self:containsPoint(linePointFromXnorm(tempPos1, tempPos2, clamp(self.pos:xnormOnLine(tempPos1, tempPos2), 0, 1))) then
hasVehicles = true
@/lua/ge/extensions/gameplay/traffic/trafficUtils.lua
p2:set(mapNodes[n2].pos)
spawnData.pos:set(linePointFromXnorm(p1, p2, clamp(spawnData.pos:xnormOnLine(p1, p2), 0, 1)))
p2:set(mapNodes[n2].pos)
spawnData.pos:set(linePointFromXnorm(p1, p2, clamp(spawnData.pos:xnormOnLine(p1, p2), 0, 1)))
@/lua/ge/extensions/gameplay/route/route.lua
local xnorm = clamp(stepDist / (length + 1e-30), 0, 1)
return {n1 = v1.wp, n2 = v2.wp, idx = i, pos = linePointFromXnorm(v1.pos, v2.pos, xnorm), xnorm = xnorm}
end
@/lua/ge/extensions/gameplay/route/raceRoute.lua
local xnorm = clamp(stepDist / (length + 1e-30), 0, 1)
return {n1 = v1.wp, n2 = v2.wp, idx = i, pos = linePointFromXnorm(v1.pos, v2.pos, xnorm), xnorm = xnorm}
end
@/lua/vehicle/scriptai.lua
local s1t = script[1].t
local sp = linePointFromXnorm(vec3(script[1]), vec3(script[2]), (timeOffset - s1t) / (script[2].t - s1t))
script[1] = {x = sp.x, y = sp.y, z = sp.z, t = timeOffset}
local p1, p2 = vec3(script[1]), vec3(script[2])
local prevPos = linePointFromXnorm(p1, p2, clamp(aiPos:xnormOnLine(p1, p2), 0, 1))
local curPos = vec3()
if prevDirPoint then
posline = linePointFromXnorm(prevDirPoint, p1, pos:xnormOnLine(prevDirPoint, p1))
else
else
posline = linePointFromXnorm(p0, p1, pos:xnormOnLine(p0, p1))
end
posError = aiPos:distance(linePointFromXnorm(p1, p2, aiXnormOnSeg)) * sign(deviation)
local s1t = script[1].t
local sp = linePointFromXnorm(vec3(script[1]), vec3(script[2]), (timeOffset - s1t) / (script[2].t - s1t))
script[1] = {x = sp.x, y = sp.y, z = sp.z, t = timeOffset}
@/lua/ge/extensions/gameplay/sites/zone.lua
if camPos:squaredDistance(v.pos) < drawSqDist or camPos:squaredDistance(self.vertices[v.next].pos) < drawSqDist
or camPos:squaredDistance(linePointFromXnorm(v.pos, self.vertices[v.next].pos, 0.5)) < drawSqDist then
isVisible = true