Files
gtav-src/script/dev_ng/shared/include/public/scripted_los_checks.sch
T
2025-09-29 00:52:08 +02:00

68 lines
2.3 KiB
XML
Executable File

// This functions allow you to define a plane in the world and then perform a LOS check between two coords,
// checking if the line of sight intersects the defined plane. Booyakasha!
// Note: Doesn't check collision with any map objects.
//example of use: Trevor 3
//Help text needs to be shown when you approach certain peds but a simple distance check wasn't sufficient.
//Many trailers could block the player's view, so the player could be close enough to trigger the help but not actually see the ped in question.
//using locates wasn't an option as the areas to be defined would become too complex and fiddly to set up.
USING "rgeneral_include.sch"
FUNC BOOL POINT_IN_TRI(vector vPointOnPlane, vector vCorner1,vector vCorner2,vector vCorner3)
vector v0 = vCorner3 - vCorner1
vector v1 = vCorner2 - vCorner1
vector v2 = vPointOnPlane - vCorner1
float dot00 = DOT_PRODUCT(v0, v0)
float dot01 = DOT_PRODUCT(v0, v1)
float dot02 = DOT_PRODUCT(v0, v2)
float dot11 = DOT_PRODUCT(v1, v1)
float dot12 = DOT_PRODUCT(v1, v2)
float invDenom = 1 / (dot00 * dot11 - dot01 * dot01)
float u = (dot11 * dot02 - dot01 * dot12) * invDenom
float v = (dot00 * dot12 - dot01 * dot02) * invDenom
IF (u >= 0) AND (v >= 0) AND (u + v < 1)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_LINE_INTERSECT_QUAD(vector p1, vector p2, vector vCorner1,vector vCorner2,vector vCorner3,vector vCorner4)
vector vPointOnPlane
vector normal = CROSS_PRODUCT(vCorner2 - vCorner1, vCorner3 - vCorner1)
IF NOT IS_VECTOR_ZERO(normal)
normal = NORMALISE_VECTOR(normal)
IF GET_LINE_PLANE_INTERSECT(vPointOnPlane, p1, p2, normal, vCorner1)
IF GET_DISTANCE_BETWEEN_COORDS(p1,vPointOnPlane) < GET_DISTANCE_BETWEEN_COORDS(p1,p2)
IF POINT_IN_TRI(vPointOnPlane,vCorner1,vCorner2,vCorner3)
RETURN TRUE
ENDIF
ENDIF
ENDIF
normal = CROSS_PRODUCT(vCorner3 - vCorner1, vCorner4 - vCorner1)
normal = NORMALISE_VECTOR(normal)
IF NOT IS_VECTOR_ZERO(normal)
IF GET_LINE_PLANE_INTERSECT(vPointOnPlane, p1, p2, normal, vCorner1)
IF GET_DISTANCE_BETWEEN_COORDS(p1,vPointOnPlane) < GET_DISTANCE_BETWEEN_COORDS(p1,p2)
IF POINT_IN_TRI(vPointOnPlane,vCorner1,vCorner4,vCorner3)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIf
return false
ENDFUNC