GE Lua Documentation

Press F to search!

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