MCPcopy Create free account
hub / github.com/OGSR/OGSR-Engine / IsInArea

Method IsInArea

ogsr_engine/xrGame/CarDoors.cpp:390–447  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

388 return (dif1.dotproduct(tdir) > dif.dotproduct(tdir) && abs(c_to_d.dotproduct(tdir)) < dif1.dotproduct(tdir));
389}
390bool CCar::SDoor::IsInArea(const Fvector& pos, const Fvector& dir)
391{
392 if (!joint)
393 {
394 if (!IsFront(pos, dir))
395 return false;
396
397 IKinematics* K = PKinematics(pcar->Visual());
398 // CBoneInstance bi=K->LL_GetBoneInstance(bone_id);
399 // CBoneData& bd=K->LL_GetData(bone_id);
400 K->LL_GetBindTransform(bones_bind_forms);
401 // Fobb bb=bd.obb;
402 Fvector tdir;
403 tdir.set(pcar->XFORM().i);
404 if (tdir.dotproduct(dir) < 0.f)
405 tdir.invert();
406 Fmatrix pf;
407 pf.mul(pcar->XFORM(), bones_bind_forms[bone_id]);
408 Fvector dif, dif1;
409 dif.sub(pf.c, pos);
410 pcar->Center(dif1);
411 Fvector c_to_d;
412 c_to_d.sub(pf.c, dif1);
413 dif1.sub(pos);
414 return 2.f * abs(c_to_d.dotproduct(pcar->XFORM().i)) > abs(dif1.dotproduct(pcar->XFORM().i));
415 }
416 Fmatrix closed_door_form, door_form;
417 Fvector closed_door_dir, door_dir, anchor_to_pos, door_axis;
418 joint->GetAxisDirDynamic(0, door_axis);
419 joint->PSecond_element()->InterpolateGlobalTransform(&door_form);
420
421 closed_door_form.mul(pcar->XFORM(), closed_door_form_in_object);
422 closed_door_form.transform_dir(closed_door_dir, door_dir_in_door);
423 // closed_door_form_in_object.transform_dir(closed_door_dir,door_dir_in_door);
424 // pcar->XFORM().transform_dir(closed_door_dir);
425
426 door_form.transform_dir(door_dir, door_dir_in_door);
427 door_dir.normalize();
428 closed_door_dir.normalize();
429 float cprg = door_dir.dotproduct(door_form.c);
430 float loe, hie;
431 joint->PSecond_element()->get_Extensions(door_dir, cprg, loe, hie);
432 float signum = (hie > -loe) ? 1.f : -1.f;
433
434 Fvector closed_door_norm, door_norm;
435 closed_door_norm.crossproduct(door_axis, closed_door_dir);
436 door_norm.crossproduct(door_axis, door_dir);
437 anchor_to_pos.sub(pos, closed_door_form.c);
438 float a, b, c;
439 a = anchor_to_pos.dotproduct(closed_door_dir) * signum;
440 b = anchor_to_pos.dotproduct(door_dir) * signum;
441 c = anchor_to_pos.dotproduct(closed_door_norm) * anchor_to_pos.dotproduct(door_norm);
442 if (a < (signum > 0.f ? hie : -loe) && a > 0.f && b < (signum > 0.f ? hie : -loe) && b > 0.f &&
443 anchor_to_pos.dotproduct(closed_door_norm) * anchor_to_pos.dotproduct(door_norm) < 0.f)
444 return true;
445 else
446 return false;
447}

Callers

nothing calls this directly

Calls 15

PKinematicsFunction · 0.85
VisualMethod · 0.80
LL_GetBindTransformMethod · 0.80
GetAxisDirDynamicMethod · 0.80
PSecond_elementMethod · 0.80
setMethod · 0.45
dotproductMethod · 0.45
invertMethod · 0.45
mulMethod · 0.45
subMethod · 0.45
CenterMethod · 0.45

Tested by

no test coverage detected