GE Lua Documentation

Press F to search!

surfaceNormal

Definition


-- @/lua/ge/map.lua:502

local function surfaceNormal(p, r)
  --   p3
  --     \
  --      \ r
  --       \     r
  --        p - - - - p1     | - > y
  --       /                 v
  --      / r                x
  --     /
  --   p2

  r = r or 2
  local hr = 1.2 * r -- calculation is guaranteed to be accurate up to ~ 50 deg (argtan(1.2)) inclination

  local p1 = vec3(p.x, p.y + r, p.z + hr)
  local p2 = vec3(p.x + 0.8660254037844386 * r, p.y - 0.5 * r, p1.z) -- sin(60) => 0.8660254037844386, cos(60) => 0.5
  local p3 = p2:copy()
  p3.x = p.x - 0.8660254037844386 * r

  p1.z = be:getSurfaceHeightBelow(p1)
  p2.z = be:getSurfaceHeightBelow(p2)
  p3.z = be:getSurfaceHeightBelow(p3)

  -- store the result in p3
  if min(p1.z, p2.z, p3.z) + hr < p.z then
    p3:set(0, 0, 1)
  else
    p2:setSub(p3)
    p1:setSub(p3)
    p3:set(p2.y * p1.z - p2.z * p1.y, p2.z * p1.x - p2.x * p1.z, p2.x * p1.y - p2.y * p1.x) -- p2 x p1
    p3:normalize()
  end

  return p3
end

Callers

@/lua/ge/map.lua

    n.normal = surfaceNormal(nPos, radius * 0.5)
  end
      normal = vec3(),
      biNormal = surfaceNormal(p, r * 0.5),
      edgeVec = vec3(),
            normal = vec3(),
            biNormal = surfaceNormal(posOrig, radius * 0.5),
            edgeVec = vec3(),
@/lua/ge/extensions/editor/toolUtilities/geom.lua
      spline.normals[ctr] = spline.normals[ctr] or vec3(0, 0, 1)
      spline.normals[ctr]:set(map.surfaceNormal(nodePos, 1.0))
@/lua/ge/extensions/editor/slotTrafficEditor.lua
  nid = nid or getNewNodeName("manual", "")
  mapNodes[nid] = {pos = vec3(pos), radius = radius, normal = map.surfaceNormal(pos, radius * 0.5), links = {}}
  updateQt = true
          local radius = n.radius
          n.normal = map.surfaceNormal(nPos, radius * 0.5)
          qtNodes:preLoad(nid, quadtree.pointBBox(nPos.x, nPos.y, radius))
@/lua/ge/extensions/editor/scriptAIEditor.lua
        nodes[1].dir:set(dirVec)
        nodes[1].up:set(map.surfaceNormal(pos, 1))
        break
@/lua/ge/extensions/gameplay/police.lua
  tempFwd:set(vecY:rotated(rot)) -- expected to be parallel to the road
  tempUp:set(map.surfaceNormal(pos, 1))
  tempRight:setCross(tempFwd, tempUp)
@/lua/ge/extensions/scenario/raceMarkers/crawlMarker.lua
        end
        local surfaceNormal = map.surfaceNormal(leftPos, 1)
        if surfaceNormal then
        end
        local surfaceNormal = map.surfaceNormal(rightPos, 1)
        if surfaceNormal then
@/lua/ge/extensions/gameplay/traffic.lua
    local pos, dir = gameplay_traffic_trafficUtils.finalizeSpawnPoint(spawnData.pos, spawnData.dir, spawnData.n1, spawnData.n2, placeData)
    local normal = map.surfaceNormal(pos, 1)
    local rot = quatFromDir(vecY:rotated(quatFromDir(dir, normal)), normal)
    local newPos, newRot = gameplay_traffic_trafficUtils.finalizeSpawnPoint(spawnData.pos, spawnData.dir, spawnData.n1, spawnData.n2, {legalDirection = true})
    newRot = quatFromDir(newRot, map.surfaceNormal(newPos))
    respawnVehicle(id, newPos, newRot)
@/lua/ge/extensions/editor/objectToSplineEditor.lua
          pos.z = be:getSurfaceHeightBelow(pos + vecUp)
          dirVecUp:set(map.surfaceNormal(pos, 1))
        end
@/lua/ge/extensions/editor/aiViz.lua
          local radius = n.radius
          n.normal = n.normal or map.surfaceNormal(nPos, radius * 0.5)
          qtNodes:preLoad(nid, quadtree.pointBBox(nPos.x, nPos.y, radius))
@/lua/ge/extensions/gameplay/crawl/boundary.lua
      else
        terrainNormal = map.surfaceNormal(pos, 1) or vec3(0, 0, 1)
      end
@/lua/ge/extensions/editor/trafficManager.lua
  -- get the road surface normal at this position
  local normal = map.surfaceNormal(spawnPos, radius)
  -- lateral direction vector to the surface made by normal and p2p1DirVec
@/lua/ge/extensions/gameplay/traffic/vehicle.lua

    roadPos:setCross(tempDirVec, map.surfaceNormal(tempPos))
    roadPos:setScaled(radius)