Files
ox_lib/imports/raycast/client.lua

56 lines
1.9 KiB
Lua
Raw Normal View History

---------------------------------------
--- Source: https://github.com/citizenfx/lua/blob/luaglm-dev/cfx/libs/scripts/examples/scripting_gta.lua
--- Credits to gottfriedleibniz
local glm = require 'glm'
local glm_rad = glm.rad
local glm_quatEuler = glm.quatEulerAngleZYX
local glm_rayPicking = glm.rayPicking
local glm_up = glm.up()
local glm_forward = glm.forward()
local GetFinalRenderedCamCoord = GetFinalRenderedCamCoord
local GetFinalRenderedCamRot = GetFinalRenderedCamRot
local function screenPositionToCameraRay(fov, ratio)
local rot = glm_rad(GetFinalRenderedCamRot(2))
local q = glm_quatEuler(rot.z, rot.y, rot.x)
return GetFinalRenderedCamCoord(), glm_rayPicking(
q * glm_forward,
q * glm_up,
glm_rad(fov or GetFinalRenderedCamFov()),
ratio or GetAspectRatio(true),
0.10000, -- GetFinalRenderedCamNearClip(),
10000.0, -- GetFinalRenderedCamFarClip(),
0, 0
)
end
---------------------------------------
local StartShapeTestLosProbe = StartShapeTestLosProbe
local GetShapeTestResultIncludingMaterial = GetShapeTestResultIncludingMaterial
local raycast = {}
---@param fov number? GetFinalRenderedCamFov
---@param ratio number? GetAspectRatio
---@param flag number? Defaults to 1|2|8|16 (see: https://docs.fivem.net/natives/?_0x377906D8A31E5586)
---@return vector3 endCoords
---@return number entityHit
---@return vector3 surfaceNormal
---@return number materialHash
function raycast.cam(fov, ratio, flag)
local rayPos, rayDir = screenPositionToCameraRay(fov, ratio)
local destination = rayPos + 10 * rayDir
local handle = StartShapeTestLosProbe(rayPos.x, rayPos.y, rayPos.z, destination.x, destination.y, destination.z,
flag or 1 | 2 | 8 | 16, cache.ped, 4)
while true do
Wait(0)
local retval, _, endCoords, surfaceNormal, materialHash, entityHit = GetShapeTestResultIncludingMaterial(handle)
if retval ~= 1 then
return entityHit, endCoords, surfaceNormal, materialHash
end
end
end
return raycast