void CHangingLamp::CreateBody(CSE_ALifeObjectHangingLamp *lamp) { if (!Visual()) return; if (m_pPhysicsShell) return; CKinematics* pKinematics= smart_cast<CKinematics*> (Visual()); m_pPhysicsShell = P_create_Shell(); bone_map .clear(); LPCSTR fixed_bones=*lamp->fixed_bones; if(fixed_bones){ int count = _GetItemCount(fixed_bones); for (int i=0 ;i<count; ++i){ string64 fixed_bone ; _GetItem (fixed_bones,i,fixed_bone) ; u16 fixed_bone_id=pKinematics->LL_BoneID(fixed_bone) ; R_ASSERT2(BI_NONE!=fixed_bone_id,"wrong fixed bone") ; bone_map.insert(mk_pair(fixed_bone_id,physicsBone())) ; } }else{ bone_map.insert(mk_pair(pKinematics->LL_GetBoneRoot(),physicsBone())) ; } m_pPhysicsShell->build_FromKinematics(pKinematics,&bone_map); m_pPhysicsShell->set_PhysicsRefObject(this); m_pPhysicsShell->mXFORM.set(XFORM()); m_pPhysicsShell->Activate(true);//, //m_pPhysicsShell->SmoothElementsInertia(0.3f); m_pPhysicsShell->SetAirResistance();//0.0014f,1.5f ///////////////////////////////////////////////////////////////////////////// BONE_P_PAIR_IT i=bone_map.begin(),e=bone_map.end(); for(;i!=e;i++){ CPhysicsElement* fixed_element=i->second.element; ///R_ASSERT2(fixed_element,"fixed bone has no physics"); if(fixed_element)fixed_element->Fix(); } m_pPhysicsShell->mXFORM.set(XFORM()); m_pPhysicsShell->SetAirResistance(0.001f, 0.02f); SAllDDOParams disable_params; disable_params.Load(smart_cast<CKinematics*>(Visual())->LL_UserData()); m_pPhysicsShell->set_DisableParams(disable_params); ApplySpawnIniToPhysicShell(&lamp->spawn_ini(),m_pPhysicsShell,fixed_bones[0]!='\0'); }
CPhysicsShell* P_build_Shell (CGameObject* obj,bool not_active_state,U16Vec& fixed_bones) { bone_map.clear (); CPhysicsShell* pPhysicsShell; if(!fixed_bones.empty()) for (U16It it=fixed_bones.begin(); it!=fixed_bones.end(); it++) bone_map.insert(mk_pair(*it,physicsBone())); pPhysicsShell=P_build_Shell(obj,not_active_state,&bone_map); // fix bones BONE_P_PAIR_IT i=bone_map.begin(),e=bone_map.end(); if(i!=e) pPhysicsShell->SetPrefereExactIntegration(); for(;i!=e;i++){ CPhysicsElement* fixed_element=i->second.element; //R_ASSERT2(fixed_element,"fixed bone has no physics"); if(!fixed_element) continue; fixed_element->Fix(); } return pPhysicsShell; }