bool func_43(Vector3 vParam0, Vector3 vParam1, int iParam2, float fParam3) { auto uVar0; char* sVar165; char* sVar166; if (iLocal_84 < iLocal_85) { if (!func_23()) { if (vdist2(vParam3, vParam0) < fParam7 * fParam7) { if (GAMEPLAY::GET_GAME_TIMER() - iLocal_83 > iParam6 + GAMEPLAY::GET_RANDOM_INT_IN_RANGE(false, 2000)) { uVar0 = 16; func_47(&uVar0, 3, iLocal_82, "MAUDE", 0, 1); sVar165 = func_46(); sVar166 = func_21(); func_44(&uVar0, sVar165, sVar166, 7, 0, 0); iLocal_83 = GAMEPLAY::GET_GAME_TIMER(); iLocal_84++; return true; } } } else { iLocal_83 = GAMEPLAY::GET_GAME_TIMER(); } } return false; }
static bool circumCircle(const float* p1, const float* p2, const float* p3, float* c, float& r) { static const float EPS = 1e-6f; // Calculate the circle relative to p1, to avoid some precision issues. const float v1[3] = {0,0,0}; float v2[3], v3[3]; rcVsub(v2, p2,p1); rcVsub(v3, p3,p1); const float cp = vcross2(v1, v2, v3); if (fabsf(cp) > EPS) { const float v1Sq = vdot2(v1,v1); const float v2Sq = vdot2(v2,v2); const float v3Sq = vdot2(v3,v3); c[0] = (v1Sq*(v2[2]-v3[2]) + v2Sq*(v3[2]-v1[2]) + v3Sq*(v1[2]-v2[2])) / (2*cp); c[1] = 0; c[2] = (v1Sq*(v3[0]-v2[0]) + v2Sq*(v1[0]-v3[0]) + v3Sq*(v2[0]-v1[0])) / (2*cp); r = vdist2(c, v1); rcVadd(c, c, p1); return true; } rcVcopy(c, p1); r = 0; return false; }
void func_12(Vector3 vParam0, Vector3 vParam1) { if (func_51(iLocal_82)) { if (!is_ambient_speech_playing(iLocal_82)) { if (vdist2(vParam3, vParam0) < 35f * 35f) { func_13(&iLocal_82, "GENERIC_FRIGHTENED_HIGH", "MAUDE", 3); } } } }
static bool circumCircle(const float* p1, const float* p2, const float* p3, float* c, float& r) { static const float EPS = 1e-6f; const float cp = vcross2(p1, p2, p3); if (fabsf(cp) > EPS) { const float p1Sq = vdot2(p1,p1); const float p2Sq = vdot2(p2,p2); const float p3Sq = vdot2(p3,p3); c[0] = (p1Sq*(p2[2]-p3[2]) + p2Sq*(p3[2]-p1[2]) + p3Sq*(p1[2]-p2[2])) / (2*cp); c[2] = (p1Sq*(p3[0]-p2[0]) + p2Sq*(p1[0]-p3[0]) + p3Sq*(p2[0]-p1[0])) / (2*cp); r = vdist2(c, p1); return true; } c[0] = p1[0]; c[2] = p1[2]; r = 0; return false; }
static bool circumCircle(const dtCoordinates& p1, const dtCoordinates& p2, const dtCoordinates& p3, dtCoordinates& c, float& r) { static const float EPS = 1e-6f; const float cp = vcross2(p1, p2, p3); if (fabsf(cp) > EPS) { const float p1Sq = vdot2(p1,p1); const float p2Sq = vdot2(p2,p2); const float p3Sq = vdot2(p3,p3); c.SetX( (p1Sq*(p2.Z()-p3.Z()) + p2Sq*(p3.Z()-p1.Z()) + p3Sq*(p1.Z()-p2.Z())) / (2*cp) ); c.SetZ( (p1Sq*(p3.X()-p2.X()) + p2Sq*(p1.X()-p3.X()) + p3Sq*(p2.X()-p1.X())) / (2*cp) ); r = vdist2(c, p1); return true; } c.SetX( p1.X() ); c.SetZ( p1.Z() ); r = 0; return false; }
static void triangulateHull(const int nverts, const float* verts, const int nhull, const int* hull, rcIntArray& tris) { int start = 0, left = 1, right = nhull-1; // Start from an ear with shortest perimeter. // This tends to favor well formed triangles as starting point. float dmin = 0; for (int i = 0; i < nhull; i++) { int pi = prev(i, nhull); int ni = next(i, nhull); const float* pv = &verts[hull[pi]*3]; const float* cv = &verts[hull[i]*3]; const float* nv = &verts[hull[ni]*3]; const float d = vdist2(pv,cv) + vdist2(cv,nv) + vdist2(nv,pv); if (d < dmin) { start = i; left = ni; right = pi; dmin = d; } } // Add first triangle tris.push(hull[start]); tris.push(hull[left]); tris.push(hull[right]); tris.push(0); // Triangulate the polygon by moving left or right, // depending on which triangle has shorter perimeter. // This heuristic was chose emprically, since it seems // handle tesselated straight edges well. while (next(left, nhull) != right) { // Check to see if se should advance left or right. int nleft = next(left, nhull); int nright = prev(right, nhull); const float* cvleft = &verts[hull[left]*3]; const float* nvleft = &verts[hull[nleft]*3]; const float* cvright = &verts[hull[right]*3]; const float* nvright = &verts[hull[nright]*3]; const float dleft = vdist2(cvleft, nvleft) + vdist2(nvleft, cvright); const float dright = vdist2(cvright, nvright) + vdist2(cvleft, nvright); if (dleft < dright) { tris.push(hull[left]); tris.push(hull[nleft]); tris.push(hull[right]); tris.push(0); left = nleft; } else { tris.push(hull[left]); tris.push(hull[nright]); tris.push(hull[right]); tris.push(0); right = nright; } } }
static void completeFacet(rcContext* ctx, const float* pts, int npts, int* edges, int& nedges, const int maxEdges, int& nfaces, int e) { static const float EPS = 1e-5f; int* edge = &edges[e*4]; // Cache s and t. int s,t; if (edge[2] == UNDEF) { s = edge[0]; t = edge[1]; } else if (edge[3] == UNDEF) { s = edge[1]; t = edge[0]; } else { // Edge already completed. return; } // Find best point on left of edge. int pt = npts; float c[3] = {0,0,0}; float r = -1; for (int u = 0; u < npts; ++u) { if (u == s || u == t) continue; if (vcross2(&pts[s*3], &pts[t*3], &pts[u*3]) > EPS) { if (r < 0) { // The circle is not updated yet, do it now. pt = u; circumCircle(&pts[s*3], &pts[t*3], &pts[u*3], c, r); continue; } const float d = vdist2(c, &pts[u*3]); const float tol = 0.001f; if (d > r*(1+tol)) { // Outside current circumcircle, skip. continue; } else if (d < r*(1-tol)) { // Inside safe circumcircle, update circle. pt = u; circumCircle(&pts[s*3], &pts[t*3], &pts[u*3], c, r); } else { // Inside epsilon circum circle, do extra tests to make sure the edge is valid. // s-u and t-u cannot overlap with s-pt nor t-pt if they exists. if (overlapEdges(pts, edges, nedges, s,u)) continue; if (overlapEdges(pts, edges, nedges, t,u)) continue; // Edge is valid. pt = u; circumCircle(&pts[s*3], &pts[t*3], &pts[u*3], c, r); } } } // Add new triangle or update edge info if s-t is on hull. if (pt < npts) { // Update face information of edge being completed. updateLeftFace(&edges[e*4], s, t, nfaces); // Add new edge or update face info of old edge. e = findEdge(edges, nedges, pt, s); if (e == UNDEF) addEdge(ctx, edges, nedges, maxEdges, pt, s, nfaces, UNDEF); else updateLeftFace(&edges[e*4], pt, s, nfaces); // Add new edge or update face info of old edge. e = findEdge(edges, nedges, t, pt); if (e == UNDEF) addEdge(ctx, edges, nedges, maxEdges, t, pt, nfaces, UNDEF); else updateLeftFace(&edges[e*4], t, pt, nfaces); nfaces++; } else { updateLeftFace(&edges[e*4], s, t, HULL); } }
void main() { Vector3 vVar0; Vector3 vVar3; iLocal_2 = 1; iLocal_3 = 134; iLocal_4 = 134; iLocal_5 = 1; iLocal_6 = 1; iLocal_7 = 1; iLocal_8 = 134; iLocal_9 = 1; iLocal_10 = 12; iLocal_11 = 12; fLocal_14 = 0.001f; iLocal_17 = -1; sLocal_18 = "NULL"; fLocal_21 = 0f; fLocal_25 = -0.0375f; fLocal_26 = 0.17f; fLocal_30 = 80f; fLocal_31 = 140f; fLocal_32 = 180f; iLocal_35 = 3; iLocal_85 = -1; iLocal_86 = -1; if (PLAYER::HAS_FORCE_CLEANUP_OCCURRED(19)) { func_55(); } if (!func_52()) { func_55(); } if (!func_51(iLocal_82)) { func_55(); } else { func_50(); iLocal_83 = GAMEPLAY::GET_GAME_TIMER(); iLocal_85 = func_49(); iLocal_84 = 0; func_48(1, &uLocal_88); } while (true) { if (!PED::IS_PED_INJURED(PLAYER::PLAYER_PED_ID())) { if (!func_51(iLocal_82)) { func_55(); } vVar0 = {ENTITY::GET_ENTITY_COORDS(PLAYER::PLAYER_PED_ID(), 1)}; vVar3 = {ENTITY::GET_ENTITY_COORDS(iLocal_82, 1)}; if (vdist2(vVar0, vVar3) >= 100f * 100f) { func_55(); } switch (iLocal_87) { case 0: func_43(vVar3, vVar0, 18000, 1101004800); if (func_25(&iLocal_82, 0)) { func_24(); func_16(0); func_12(vVar3, vVar0); request_anim_dict(func_11()); iLocal_87 = 1; } break; case 1: if (func_5(&iLocal_82, &iLocal_79, &iLocal_86)) { iLocal_87 = 2; } break; case 2: if (!func_4(iLocal_82, 1805844857) && !is_ped_fleeing(iLocal_82)) { if (!is_entity_playing_anim(iLocal_82, func_11(), func_3(), 3)) { func_1(); } } else { func_55(); } break; } } wait(0); } }
void func_7() { Vector3 vVar0; switch (iLocal_83) { case 0: if (!ENTITY::DOES_ENTITY_EXIST(iLocal_54)) { iLocal_54 = create_vehicle(joaat("jet"), -65.3177f, 15.4603f, 703.106f, 0, 1, true); set_entity_lod_dist(iLocal_54, 1000); set_vehicle_engine_on(iLocal_54, true, 1, 0); _0x279D50DE5652D935(iLocal_54, 0); iLocal_60 = PED::CREATE_PED_inside_vehicle(iLocal_54, 4, iLocal_84, -1, 1, true); set_blocking_of_non_temporary_events(iLocal_60, true); iLocal_83 = 1; } break; case 1: if (ENTITY::DOES_ENTITY_EXIST(iLocal_54) && !ENTITY::IS_ENTITY_DEAD(iLocal_54, 0)) { if (has_vehicle_recording_been_loaded(101, "EastWestFlight")) { if (!is_playback_going_on_for_vehicle(iLocal_54)) { start_playback_recorded_vehicle_with_flags(iLocal_54, 101, "EastWestFlight", 2, 5, 786603); iLocal_83 = 2; } } } break; case 2: if (!ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID(), 0)) { vVar0 = {ENTITY::GET_ENTITY_COORDS(PLAYER::PLAYER_PED_ID(), 1)}; } if (ENTITY::DOES_ENTITY_EXIST(iLocal_54) && !ENTITY::IS_ENTITY_DEAD(iLocal_54, 0)) { if (!is_playback_going_on_for_vehicle(iLocal_54)) { if ((ENTITY::IS_ENTITY_OCCLUDED(iLocal_54) && !CAM::IS_SPHERE_VISIBLE(-1602.086f, -2674.039f, 12.9444f, 50f)) && vdist2(vVar0, ENTITY::GET_ENTITY_COORDS(iLocal_54, 1)) > 62500f) { iLocal_83 = 1; } } } break; } }