void CPHSkeleton::UnsplitSingle(CPHSkeleton* SO) { //Msg("%o,received has %d,",this,m_unsplited_shels.size()); if (0==m_unsplited_shels.size()) return; //. hack CPhysicsShellHolder* obj = PPhysicsShellHolder(); CPhysicsShellHolder* O =SO->PPhysicsShellHolder(); VERIFY2(m_unsplited_shels.size(),"NO_SHELLS !!"); VERIFY2(!O->m_pPhysicsShell,"this has shell already!!!"); CPhysicsShell* newPhysicsShell=m_unsplited_shels.front().first; O->m_pPhysicsShell=newPhysicsShell; VERIFY(_valid(newPhysicsShell->mXFORM)); IKinematics *newKinematics=smart_cast<IKinematics*>(O->Visual()); IKinematics *pKinematics =smart_cast<IKinematics*>(obj->Visual()); Flags64 mask0,mask1; u16 split_bone=m_unsplited_shels.front().second; mask1.assign(pKinematics->LL_GetBonesVisible());//source bones mask pKinematics->LL_SetBoneVisible(split_bone,FALSE,TRUE); pKinematics->CalculateBones_Invalidate (); pKinematics->CalculateBones (TRUE); mask0.assign(pKinematics->LL_GetBonesVisible());//first part mask VERIFY2(mask0.flags,"mask0 -Zero"); mask0.invert(); mask1.and(mask0.flags);//second part mask newKinematics->LL_SetBoneRoot (split_bone); VERIFY2(mask1.flags,"mask1 -Zero"); newKinematics->LL_SetBonesVisible (mask1.flags); newKinematics->CalculateBones_Invalidate (); newKinematics->CalculateBones (TRUE); newPhysicsShell->set_Kinematics(newKinematics); VERIFY(_valid(newPhysicsShell->mXFORM)); newPhysicsShell->ResetCallbacks(split_bone,mask1); VERIFY(_valid(newPhysicsShell->mXFORM)); newPhysicsShell->ObjectInRoot().identity(); if(!newPhysicsShell->isEnabled())O->processing_deactivate(); newPhysicsShell->set_PhysicsRefObject(O); m_unsplited_shels.erase(m_unsplited_shels.begin()); O->setVisible(TRUE); O->setEnabled(TRUE); SO->CopySpawnInit (); CopySpawnInit (); VERIFY3(CheckObjectSize(pKinematics),*(O->cNameVisual()),"Object unsplit whith no size"); VERIFY3(CheckObjectSize(newKinematics),*(O->cNameVisual()),"Object unsplit whith no size"); }
void CPHDestroyable::PhysicallyRemoveSelf() { CPhysicsShellHolder *obj =PPhysicsShellHolder() ; CActor *A =smart_cast<CActor*>(obj) ; if(A) { A->character_physics_support()->SetRemoved(); } else { //obj->PPhysicsShell()->PureStep(); obj->PPhysicsShell()->Disable(); obj->PPhysicsShell()->DisableCollision(); } obj->setVisible(FALSE); obj->setEnabled(FALSE); }