| 388 | return (dif1.dotproduct(tdir) > dif.dotproduct(tdir) && abs(c_to_d.dotproduct(tdir)) < dif1.dotproduct(tdir)); |
| 389 | } |
| 390 | bool 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 | } |
nothing calls this directly
no test coverage detected