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

Method GetExitPosition

ogsr_engine/xrGame/CarDoors.cpp:459–525  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

457}
458
459void CCar::SDoor::GetExitPosition(Fvector& pos)
460{
461 if (!joint)
462 {
463 IKinematics* K = PKinematics(pcar->Visual());
464 // CBoneInstance bi=K->LL_GetBoneInstance(bone_id);
465 CBoneData& bd = K->LL_GetData(bone_id);
466 K->LL_GetBindTransform(bones_bind_forms);
467 Fobb bb; //=bd.obb;
468
469 Fmatrix pf;
470 pf.mul(pcar->XFORM(), bones_bind_forms[bone_id]);
471 bb.transform(bd.obb, pf);
472 bb.xform_get(pf);
473 pos.set(pf.c);
474 Fvector add, add1;
475 MAX_OF(abs(pf.i.y), add.set(pf.i); add.mul(bb.m_halfsize.x * fsignum(pf.i.y)), abs(pf.j.y), add.set(pf.j);
476 add.mul(bb.m_halfsize.y * fsignum(pf.j.y)), abs(pf.k.y), add.set(pf.k); add.mul(bb.m_halfsize.z * fsignum(pf.k.y)));
477 pos.sub(add);
478
479 MIN_OF(bb.m_halfsize.x, add1.set(pf.i); add1.mul(bb.m_halfsize.x), bb.m_halfsize.y, add1.set(pf.j); add1.mul(bb.m_halfsize.y), bb.m_halfsize.z, add1.set(pf.k);
480 add1.mul(bb.m_halfsize.z))
481 Fvector dir_from_car;
482 dir_from_car.sub(pf.c, pcar->Position());
483 dir_from_car.y = 0.f;
484 if (add1.dotproduct(dir_from_car) < 0.f)
485 add1.invert();
486 add1.mul(3.f);
487 pos.add(add1);
488 return;
489 }
490 float lo_ext, hi_ext;
491 Fvector door_axis, door_pos, door_dir, closed_door_dir, add;
492 joint->GetAxisDirDynamic(0, door_axis);
493 joint->GetAnchorDynamic(door_pos);
494
495 Fmatrix door_form, root_form;
496 root_form.mul(pcar->m_root_transform, pcar->XFORM());
497 joint->PSecond_element()->InterpolateGlobalTransform(&door_form);
498 door_form.transform_dir(door_dir, door_dir_in_door);
499
500 closed_door_form_in_object.transform_dir(closed_door_dir, door_dir_in_door);
501 pcar->XFORM().transform_dir(closed_door_dir);
502
503 pos.set(door_pos);
504 door_axis.normalize();
505 float center_prg = door_axis.dotproduct(door_pos);
506 joint->PSecond_element()->get_Extensions(door_axis, center_prg, lo_ext, hi_ext);
507 add.set(door_axis);
508 if (door_axis.dotproduct(root_form.j) > 0.f)
509 add.mul(lo_ext);
510 else
511 add.mul(hi_ext);
512 pos.add(add);
513
514 door_dir.normalize();
515 center_prg = door_pos.dotproduct(door_dir);
516 joint->PSecond_element()->get_Extensions(door_dir, center_prg, lo_ext, hi_ext);

Callers 2

ExitMethod · 0.80
CarExplodeMethod · 0.80

Calls 15

PKinematicsFunction · 0.85
fsignumFunction · 0.85
VisualMethod · 0.80
LL_GetBindTransformMethod · 0.80
xform_getMethod · 0.80
PositionMethod · 0.80
GetAxisDirDynamicMethod · 0.80
GetAnchorDynamicMethod · 0.80
PSecond_elementMethod · 0.80
mulMethod · 0.45
transformMethod · 0.45
setMethod · 0.45

Tested by

no test coverage detected