| 457 | } |
| 458 | |
| 459 | void 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); |
no test coverage detected