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'); }
template <class T> IC void CCar::fill_wheel_vector(LPCSTR S,xr_vector<T>& type_wheels) { IKinematics* pKinematics =smart_cast<IKinematics*>(Visual()); string64 S1; int count = _GetItemCount(S); for (int i=0 ;i<count; ++i) { _GetItem (S,i,S1); u16 bone_id = pKinematics->LL_BoneID(S1); type_wheels.push_back (T()); T& twheel = type_wheels.back(); BONE_P_PAIR_IT J = bone_map.find(bone_id); if (J == bone_map.end()) { bone_map.insert(mk_pair(bone_id,physicsBone())); SWheel& wheel = (m_wheels_map.insert(mk_pair(bone_id,SWheel(this)))).first->second; wheel.bone_id = bone_id; twheel.pwheel = &wheel; wheel .Load(S1); twheel .Load(S1); } else { twheel.pwheel = &(m_wheels_map.find(bone_id))->second; twheel .Load(S1); } } }
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; }
IC void CCar::fill_doors_map(LPCSTR S,xr_map<u16,SDoor>& doors) { IKinematics* pKinematics =smart_cast<IKinematics*>(Visual()); string64 S1; int count = _GetItemCount(S); for (int i=0 ;i<count; ++i) { _GetItem (S,i,S1); u16 bone_id = pKinematics->LL_BoneID(S1); SDoor door(this); door.bone_id= bone_id; doors.insert (mk_pair(bone_id,door)); BONE_P_PAIR_IT J = bone_map.find(bone_id); if (J == bone_map.end()) { bone_map.insert(mk_pair(bone_id,physicsBone())); } } }
IC void CCar::fill_exhaust_vector(LPCSTR S,xr_vector<SExhaust>& exhausts) { IKinematics* pKinematics =smart_cast<IKinematics*>(Visual()); string64 S1; int count = _GetItemCount(S); for (int i=0 ;i<count; ++i) { _GetItem (S,i,S1); u16 bone_id = pKinematics->LL_BoneID(S1); exhausts.push_back (SExhaust(this)); SExhaust& exhaust = exhausts.back(); exhaust.bone_id = bone_id; BONE_P_PAIR_IT J = bone_map.find(bone_id); if (J == bone_map.end()) { bone_map.insert(mk_pair(bone_id,physicsBone())); } } }
CPhysicsShell* P_build_Shell (CGameObject* obj,bool not_active_state,BONE_P_MAP* p_bone_map,LPCSTR fixed_bones) { CPhysicsShell* pPhysicsShell; CKinematics* pKinematics=smart_cast<CKinematics*>(obj->Visual()); 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") ; p_bone_map->insert(mk_pair(fixed_bone_id,physicsBone())) ; } pPhysicsShell=P_build_Shell(obj,not_active_state,p_bone_map); //m_pPhysicsShell->add_Joint(P_create_Joint(CPhysicsJoint::enumType::full_control,0,fixed_element)); } else pPhysicsShell=P_build_Shell(obj,not_active_state); BONE_P_PAIR_IT i=p_bone_map->begin(),e=p_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; }
void CCar::ParseDefinitions() { bone_map.clear(); IKinematics* pKinematics=smart_cast<IKinematics*>(Visual()); bone_map.insert(mk_pair(pKinematics->LL_GetBoneRoot(),physicsBone())); CInifile* ini = pKinematics->LL_UserData(); R_ASSERT2(ini,"Car has no description !!! See ActorEditor Object - UserData"); CExplosive::Load(ini,"explosion"); //CExplosive::SetInitiator(ID()); m_camera_position = ini->r_fvector3("car_definition","camera_pos"); ///////////////////////////car definition/////////////////////////////////////////////////// fill_wheel_vector (ini->r_string ("car_definition","driving_wheels"),m_driving_wheels); fill_wheel_vector (ini->r_string ("car_definition","steering_wheels"),m_steering_wheels); fill_wheel_vector (ini->r_string ("car_definition","breaking_wheels"),m_breaking_wheels); fill_exhaust_vector (ini->r_string ("car_definition","exhausts"),m_exhausts); fill_doors_map (ini->r_string ("car_definition","doors"),m_doors); ///////////////////////////car properties/////////////////////////////// m_max_power = ini->r_float("car_definition","engine_power"); m_max_power *= (0.8f*1000.f); m_max_rpm = ini->r_float("car_definition","max_engine_rpm"); m_max_rpm *= (1.f/60.f*2.f*M_PI); m_min_rpm = ini->r_float("car_definition","idling_engine_rpm"); m_min_rpm *= (1.f/60.f*2.f*M_PI); m_power_rpm = ini->r_float("car_definition","max_power_rpm"); m_power_rpm *= (1.f/60.f*2.f*M_PI);// m_torque_rpm = ini->r_float("car_definition","max_torque_rpm"); m_torque_rpm *= (1.f/60.f*2.f*M_PI);// m_power_increment_factor = READ_IF_EXISTS(ini,r_float,"car_definition","power_increment_factor",m_power_increment_factor); m_rpm_increment_factor = READ_IF_EXISTS(ini,r_float,"car_definition","rpm_increment_factor",m_rpm_increment_factor); m_power_decrement_factor = READ_IF_EXISTS(ini,r_float,"car_definition","power_decrement_factor",m_power_increment_factor); m_rpm_decrement_factor = READ_IF_EXISTS(ini,r_float,"car_definition","rpm_decrement_factor",m_rpm_increment_factor); m_power_neutral_factor = READ_IF_EXISTS(ini,r_float,"car_definition","power_neutral_factor",m_power_neutral_factor); R_ASSERT2(m_power_neutral_factor>0.1f&&m_power_neutral_factor<1.f,"power_neutral_factor must be 0 - 1 !!"); if(ini->line_exist("car_definition","exhaust_particles")) { m_exhaust_particles =ini->r_string("car_definition","exhaust_particles"); } b_auto_switch_transmission= !!ini->r_bool("car_definition","auto_transmission"); InitParabola (); m_axle_friction = ini->r_float("car_definition","axle_friction"); m_steering_speed = ini->r_float("car_definition","steering_speed"); if(ini->line_exist("car_definition","break_time")) { m_break_time=ini->r_float("car_definition","break_time"); } /////////////////////////transmission//////////////////////////////////////////////////////////////////////// float main_gear_ratio=ini->r_float("car_definition","main_gear_ratio"); R_ASSERT2(ini->section_exist("transmission_gear_ratio"),"no section transmission_gear_ratio"); m_gear_ratious.push_back(ini->r_fvector3("transmission_gear_ratio","R")); m_gear_ratious[0][0]=-m_gear_ratious[0][0]*main_gear_ratio; string32 rat_num; for(int i=1;true;++i) { xr_sprintf(rat_num,"N%d",i); if(!ini->line_exist("transmission_gear_ratio",rat_num)) break; Fvector gear_rat=ini->r_fvector3("transmission_gear_ratio",rat_num); gear_rat[0]*=main_gear_ratio; gear_rat[1]*=(1.f/60.f*2.f*M_PI); gear_rat[2]*=(1.f/60.f*2.f*M_PI); m_gear_ratious.push_back(gear_rat); } ///////////////////////////////sound/////////////////////////////////////////////////////// m_car_sound->Init(); ///////////////////////////////fuel/////////////////////////////////////////////////// m_fuel_tank=ini->r_float("car_definition","fuel_tank"); m_fuel=m_fuel_tank; m_fuel_consumption=ini->r_float("car_definition","fuel_consumption"); m_fuel_consumption/=100000.f; if(ini->line_exist("car_definition","exhaust_particles")) m_exhaust_particles = ini->r_string("car_definition","exhaust_particles"); ///////////////////////////////lights/////////////////////////////////////////////////// m_lights.Init(this); m_lights.ParseDefinitions(); if(ini->section_exist("animations")) { m_driver_anim_type=ini->r_u16("animations","driver_animation_type"); } if(ini->section_exist("doors")) { m_doors_torque_factor=ini->r_u16("doors","open_torque_factor"); } m_damage_particles.Init(this); }