| 498 | void CPHSkeleton::SetNotNeedSave() { m_flags.set(CSE_PHSkeleton::flNotSave, TRUE); } |
| 499 | |
| 500 | void CPHSkeleton::SyncNetState() |
| 501 | { |
| 502 | auto obj = PPhysicsShellHolder(); |
| 503 | if (!obj) |
| 504 | return; |
| 505 | auto se_obj = obj->alife_object(); |
| 506 | if (!se_obj) |
| 507 | return; |
| 508 | |
| 509 | m_flags.set(CSE_PHSkeleton::flSavedData, TRUE); |
| 510 | if (obj->PPhysicsShell() && obj->PPhysicsShell()->isActive()) |
| 511 | m_flags.set(CSE_PHSkeleton::flActive, obj->PPhysicsShell()->isEnabled()); |
| 512 | |
| 513 | auto po = smart_cast<CSE_PHSkeleton*>(se_obj); |
| 514 | ASSERT_FMT(po, "[%s]: %s is not CSE_PHSkeleton", __FUNCTION__, obj->Name_script()); |
| 515 | po->_flags.assign(m_flags.get()); |
| 516 | |
| 517 | auto& saved_bones = po->saved_bones; |
| 518 | const u16 bones_number = obj->PHGetSyncItemsNumber(); |
| 519 | const auto K = smart_cast<IKinematics*>(obj->Visual()); |
| 520 | if (K) |
| 521 | { |
| 522 | saved_bones.bones_mask = K->LL_GetBonesVisible(); |
| 523 | saved_bones.root_bone = K->LL_GetBoneRoot(); |
| 524 | } |
| 525 | else |
| 526 | { |
| 527 | saved_bones.bones_mask.set(u64(-1), u64(-1)); |
| 528 | saved_bones.root_bone = 0; |
| 529 | } |
| 530 | |
| 531 | Fvector min, max; |
| 532 | min.set(F_MAX, F_MAX, F_MAX); |
| 533 | max.set(-F_MAX, -F_MAX, -F_MAX); |
| 534 | saved_bones.bones.clear(); |
| 535 | |
| 536 | for (u16 i = 0; i < bones_number; i++) |
| 537 | { |
| 538 | SPHNetState state; |
| 539 | obj->PHGetSyncItem(i)->get_State(state); |
| 540 | Fvector& p = state.position; |
| 541 | if (p.x < min.x) |
| 542 | min.x = p.x; |
| 543 | if (p.y < min.y) |
| 544 | min.y = p.y; |
| 545 | if (p.z < min.z) |
| 546 | min.z = p.z; |
| 547 | if (p.x > max.x) |
| 548 | max.x = p.x; |
| 549 | if (p.y > max.y) |
| 550 | max.y = p.y; |
| 551 | if (p.z > max.z) |
| 552 | max.z = p.z; |
| 553 | saved_bones.bones.push_back(state); |
| 554 | } |
| 555 | |
| 556 | min.sub(2.f * EPS_L); |
| 557 | max.add(2.f * EPS_L); |
nothing calls this directly
no test coverage detected