bool CCar::attach_Actor(CGameObject* actor) { if(Owner()||CPHDestroyable::Destroyed()) return false; CHolderCustom::attach_Actor(actor); IKinematics* K = smart_cast<IKinematics*>(Visual()); CInifile* ini = K->LL_UserData(); int id; if(ini->line_exist("car_definition","driver_place")) id=K->LL_BoneID(ini->r_string("car_definition","driver_place")); else { Owner()->setVisible(0); id=K->LL_GetBoneRoot(); } CBoneInstance& instance=K->LL_GetBoneInstance (u16(id)); m_sits_transforms.push_back(instance.mTransform); OnCameraChange(ectFirst); PPhysicsShell()->Enable(); PPhysicsShell()->add_ObjectContactCallback(ActorObstacleCallback); // VisualUpdate(); processing_activate(); ReleaseHandBreak(); // CurrentGameUI()->UIMainIngameWnd->CarPanel().Show(true); // CurrentGameUI()->UIMainIngameWnd->CarPanel().SetCarHealth(fEntityHealth/100.f); //CurrentGameUI()->UIMainIngameWnd.ShowBattery(true); //CBoneData& bone_data=K->LL_GetData(id); //Fmatrix driver_pos_tranform; //driver_pos_tranform.setHPB(bone_data.bind_hpb.x,bone_data.bind_hpb.y,bone_data.bind_hpb.z); //driver_pos_tranform.c.set(bone_data.bind_translate); //m_sits_transforms.push_back(driver_pos_tranform); //H_SetParent(actor); return true; }
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); } } }
void SArtefactDetectorsSupport::SetVisible(bool b) { m_switchVisTime = Device.dwTimeGlobal; if(b == !!m_parent->getVisible()) return; if(b) m_parent->StartLights (); else m_parent->StopLights (); if(b) { LPCSTR curr = pSettings->r_string(m_parent->cNameSect().c_str(), (b)?"det_show_particles":"det_hide_particles"); IKinematics* K = smart_cast<IKinematics*>(m_parent->Visual()); R_ASSERT2 (K, m_parent->cNameSect().c_str()); LPCSTR bone = pSettings->r_string(m_parent->cNameSect().c_str(), "particles_bone"); u16 bone_id = K->LL_BoneID(bone); R_ASSERT2 (bone_id!=BI_NONE, bone); m_parent->CParticlesPlayer::StartParticles(curr,bone_id,Fvector().set(0,1,0),m_parent->ID()); curr = pSettings->r_string(m_parent->cNameSect().c_str(), (b)?"det_show_snd":"det_hide_snd"); m_sound.create (curr, st_Effect, sg_SourceType); m_sound.play_at_pos (0, m_parent->Position(), 0); } m_parent->setVisible (b); m_parent->SwitchAfParticles(b); }
BOOL CWeaponStatMgun::net_Spawn(CSE_Abstract* DC) { if(!inheritedPH::net_Spawn (DC)) return FALSE; IKinematics* K = smart_cast<IKinematics*>(Visual()); CInifile* pUserData = K->LL_UserData(); R_ASSERT2 (pUserData,"Empty WeaponStatMgun user data!"); m_rotate_x_bone = K->LL_BoneID (pUserData->r_string("mounted_weapon_definition","rotate_x_bone")); m_rotate_y_bone = K->LL_BoneID (pUserData->r_string("mounted_weapon_definition","rotate_y_bone")); m_fire_bone = K->LL_BoneID (pUserData->r_string("mounted_weapon_definition","fire_bone")); m_camera_bone = K->LL_BoneID (pUserData->r_string("mounted_weapon_definition","camera_bone")); U16Vec fixed_bones; fixed_bones.push_back (K->LL_GetBoneRoot()); PPhysicsShell() = P_build_Shell(this,false,fixed_bones); CBoneData& bdX = K->LL_GetData(m_rotate_x_bone); VERIFY(bdX.IK_data.type==jtJoint); m_lim_x_rot.set (bdX.IK_data.limits[0].limit.x,bdX.IK_data.limits[0].limit.y); CBoneData& bdY = K->LL_GetData(m_rotate_y_bone); VERIFY(bdY.IK_data.type==jtJoint); m_lim_y_rot.set (bdY.IK_data.limits[1].limit.x,bdY.IK_data.limits[1].limit.y); xr_vector<Fmatrix> matrices; K->LL_GetBindTransform (matrices); m_i_bind_x_xform.invert (matrices[m_rotate_x_bone]); m_i_bind_y_xform.invert (matrices[m_rotate_y_bone]); m_bind_x_rot = matrices[m_rotate_x_bone].k.getP(); m_bind_y_rot = matrices[m_rotate_y_bone].k.getH(); m_bind_x.set (matrices[m_rotate_x_bone].c); m_bind_y.set (matrices[m_rotate_y_bone].c); m_cur_x_rot = m_bind_x_rot; m_cur_y_rot = m_bind_y_rot; m_destEnemyDir.setHP (m_bind_y_rot,m_bind_x_rot); XFORM().transform_dir (m_destEnemyDir); inheritedShooting::Light_Create(); processing_activate (); setVisible (TRUE); setEnabled (TRUE); return TRUE; }
bool is_bone_head( IKinematics &K, u16 bone ) { const u16 head_bone = K.LL_BoneID( "bip01_head" ) ; const u16 neck_bone = K.LL_BoneID( "bip01_neck" ) ; return ( bone != BI_NONE ) && neck_bone == bone || find_in_parents( head_bone, bone, K ); }
void SArtefactDetectorsSupport::Blink() { LPCSTR curr = pSettings->r_string(m_parent->cNameSect().c_str(), "det_show_particles"); IKinematics* K = smart_cast<IKinematics*>(m_parent->Visual()); R_ASSERT2 (K, m_parent->cNameSect().c_str()); LPCSTR bone = pSettings->r_string(m_parent->cNameSect().c_str(), "particles_bone"); u16 bone_id = K->LL_BoneID(bone); R_ASSERT2 (bone_id!=BI_NONE, bone); m_parent->CParticlesPlayer::StartParticles(curr,bone_id,Fvector().set(0,1,0),m_parent->ID(), 1000, true); }
void CScriptGameObject::start_particles(LPCSTR pname, LPCSTR bone) { CParticlesPlayer* PP = smart_cast<CParticlesPlayer*>(&object()); if (!PP) return; IKinematics* K = smart_cast<IKinematics*>(object().Visual()); R_ASSERT(K); u16 play_bone = K->LL_BoneID(bone); R_ASSERT(play_bone != BI_NONE); if (K->LL_GetBoneVisible(play_bone)) PP->StartParticles(pname, play_bone, Fvector().set(0, 1, 0), 9999); else ai().script_engine().script_log(ScriptStorage::eLuaMessageTypeError, "Cant start particles, bone [%s] is not visible now", bone); }
CPhysicsShell* P_build_Shell (CGameObject* obj,bool not_active_state,LPCSTR fixed_bones) { U16Vec f_bones; if(fixed_bones){ IKinematics* K = smart_cast<IKinematics*>(obj->Visual()); int count = _GetItemCount(fixed_bones); for (int i=0 ;i<count; ++i){ string64 fixed_bone; _GetItem (fixed_bones,i,fixed_bone); f_bones.push_back(K->LL_BoneID(fixed_bone)); R_ASSERT2(BI_NONE!=f_bones.back(),"wrong fixed bone") ; } } return P_build_Shell (obj,not_active_state,f_bones); }
void CWeaponRPG7::UpdateMissileVisibility() { bool vis_hud,vis_weap; vis_hud = (!!iAmmoElapsed || GetState()==eReload); vis_weap = !!iAmmoElapsed; if(GetHUDmode()) { HudItemData()->set_bone_visible("grenade",vis_hud,TRUE); } IKinematics* pWeaponVisual = smart_cast<IKinematics*>(Visual()); VERIFY (pWeaponVisual); pWeaponVisual->LL_SetBoneVisible(pWeaponVisual->LL_BoneID("grenade"), vis_weap, TRUE); }
void fix_bones(LPCSTR fixed_bones,CPhysicsShell* shell ) { VERIFY(fixed_bones); VERIFY(shell); IKinematics *pKinematics = shell->PKinematics(); VERIFY(pKinematics); 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") ; CPhysicsElement* E = shell->get_Element(fixed_bone_id) ; if(E) E->Fix(); } }
void CBaseMonster::fill_bones_body_parts (LPCSTR body_part, CriticalWoundType wound_type) { LPCSTR body_parts_section = pSettings->r_string(cNameSect(),body_part); IKinematics *kinematics = smart_cast<IKinematics*>(Visual()); VERIFY (kinematics); CInifile::Sect &body_part_section = pSettings->r_section(body_parts_section); CInifile::SectCIt I = body_part_section.Data.begin(); CInifile::SectCIt E = body_part_section.Data.end(); for ( ; I != E; ++I) m_bones_body_parts.insert ( std::make_pair( kinematics->LL_BoneID((*I).first), u32(wound_type) ) ); }
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())); } } }
void CPHCollisionDamageReceiver::Init() { CPhysicsShellHolder *sh =PPhysicsShellHolder (); IKinematics *K =smart_cast<IKinematics*>(sh->Visual()); CInifile *ini=K->LL_UserData(); if(ini->section_exist("collision_damage")) { CInifile::Sect& data = ini->r_section("collision_damage"); for (CInifile::SectCIt I=data.Data.begin(); I!=data.Data.end(); I++){ const CInifile::Item& item = *I; u16 index = K->LL_BoneID(*item.first); R_ASSERT3(index != BI_NONE, "Wrong bone name", *item.first); BoneInsert(index,float(atof(*item.second))); CODEGeom* og= sh->PPhysicsShell()->get_GeomByID(index); //R_ASSERT3(og, "collision damage bone has no physics collision", *item.first); if(og)og->add_obj_contact_cb(CollisionCallback); } } }
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())); } } }
void CArtefact::OnH_A_Chield() { inherited::OnH_A_Chield (); StopLights(); if (IsGameTypeSingle()) { SwitchAfParticles(false); } else { IKinematics* K = smart_cast<IKinematics*>(H_Parent()->Visual()); if (K) m_CarringBoneID = K->LL_BoneID("bip01_head"); else m_CarringBoneID = u16(-1); } if(m_detectorObj) { m_detectorObj->m_currPatrolPath = NULL; m_detectorObj->m_currPatrolVertex = NULL; } }
void ui_actor_state_wnd::UpdateActorInfo( CInventoryOwner* owner ) { CActor* actor = smart_cast<CActor*>( owner ); if ( !actor ) { return; } float value = 0.0f; value = actor->conditions().GetHealth(); value = floor(value * 55) / 55; // number of sticks in progress bar // show bleeding icon m_state[stt_health]->set_progress(value); value = actor->conditions().BleedingSpeed(); m_state[stt_bleeding]->show_static(false, 1); m_state[stt_bleeding]->show_static(false, 2); m_state[stt_bleeding]->show_static(false, 3); if(!fis_zero(value, EPS)) { if(value<0.35f) m_state[stt_bleeding]->show_static(true, 1); else if(value<0.7f) m_state[stt_bleeding]->show_static(true, 2); else m_state[stt_bleeding]->show_static(true, 3); } // show radiation icon value = actor->conditions().GetRadiation(); m_state[stt_radiation]->show_static(false, 1); m_state[stt_radiation]->show_static(false, 2); m_state[stt_radiation]->show_static(false, 3); if(!fis_zero(value, EPS)) { if(value<0.35f) m_state[stt_radiation]->show_static(true, 1); else if(value<0.7f) m_state[stt_radiation]->show_static(true, 2); else m_state[stt_radiation]->show_static(true, 3); } CCustomOutfit* outfit = actor->GetOutfit(); PIItem itm = actor->inventory().ItemFromSlot(HELMET_SLOT); CHelmet* helmet = smart_cast<CHelmet*>(itm); m_state[stt_fire]->set_progress(0.0f); m_state[stt_radia]->set_progress(0.0f); m_state[stt_acid]->set_progress(0.0f); m_state[stt_psi]->set_progress(0.0f); m_state[stt_wound]->set_progress(0.0f); m_state[stt_fire_wound]->set_progress(0.0f); m_state[stt_shock]->set_progress(0.0f); m_state[stt_power]->set_progress(0.0f); float burn_value = 0.0f; float radi_value = 0.0f; float cmbn_value = 0.0f; float tele_value = 0.0f; float woun_value = 0.0f; float shoc_value = 0.0f; float fwou_value = 0.0f; CEntityCondition::BOOSTER_MAP cur_booster_influences = actor->conditions().GetCurBoosterInfluences(); CEntityCondition::BOOSTER_MAP::const_iterator it; it = cur_booster_influences.find(eBoostRadiationProtection); if(it!=cur_booster_influences.end()) radi_value += it->second.fBoostValue; it = cur_booster_influences.find(eBoostChemicalBurnProtection); if(it!=cur_booster_influences.end()) cmbn_value += it->second.fBoostValue; it = cur_booster_influences.find(eBoostTelepaticProtection); if(it!=cur_booster_influences.end()) tele_value += it->second.fBoostValue; if(outfit) { burn_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeBurn); radi_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeRadiation); cmbn_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeChemicalBurn); tele_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeTelepatic); woun_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeWound); shoc_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeShock); IKinematics* ikv = smart_cast<IKinematics*>(actor->Visual()); VERIFY(ikv); u16 spine_bone = ikv->LL_BoneID("bip01_spine"); fwou_value += outfit->GetBoneArmor(spine_bone)*outfit->GetCondition(); if(!outfit->bIsHelmetAvaliable) { u16 spine_bone = ikv->LL_BoneID("bip01_head"); fwou_value += outfit->GetBoneArmor(spine_bone)*outfit->GetCondition(); } } if(helmet) { burn_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeBurn); radi_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeRadiation); cmbn_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeChemicalBurn); tele_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeTelepatic); woun_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeWound); shoc_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeShock); IKinematics* ikv = smart_cast<IKinematics*>(actor->Visual()); VERIFY(ikv); u16 spine_bone = ikv->LL_BoneID("bip01_head"); fwou_value += helmet->GetBoneArmor(spine_bone)*helmet->GetCondition(); } //fire burn protection progress bar { burn_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeBurn); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeBurn); burn_value = floor(burn_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_fire]->set_progress(burn_value);//0..1 } //radiation protection progress bar { radi_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeRadiation); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeRadiation); radi_value = floor(radi_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_radia]->set_progress(radi_value);//0..1 } //chemical burn protection progress bar { cmbn_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeChemicalBurn); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeChemicalBurn); cmbn_value = floor(cmbn_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_acid]->set_progress(cmbn_value);//0..1 } //telepatic protection progress bar { tele_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeTelepatic); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeTelepatic); tele_value = floor(tele_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_psi]->set_progress(tele_value);//0..1 } //wound protection progress bar { float max_power = actor->conditions().GetMaxWoundProtection(); woun_value = floor(woun_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_wound]->set_progress(woun_value);//0..1 } //shock protection progress bar { shoc_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeShock); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeShock); shoc_value = floor(shoc_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_shock]->set_progress(shoc_value);//0..1 } //fire wound protection progress bar { float max_power = actor->conditions().GetMaxFireWoundProtection(); fwou_value = floor(fwou_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_fire_wound]->set_progress(fwou_value); } //power restore speed progress bar { value = actor->GetRestoreSpeed(ALife::ePowerRestoreSpeed) / actor->conditions().GetMaxPowerRestoreSpeed();; value = floor(value * 31) / 31; // number of sticks in progress bar m_state[stt_power]->set_progress(value);//0..1 } // ----------------------------------------------------------------------------------- UpdateHitZone(); }
void CWeapon::UpdateAddonsVisibility() { IKinematics* pWeaponVisual = smart_cast<IKinematics*>(Visual()); R_ASSERT(pWeaponVisual); u16 bone_id; UpdateHUDAddonsVisibility (); pWeaponVisual->CalculateBones_Invalidate (); bone_id = pWeaponVisual->LL_BoneID (wpn_scope); if(ScopeAttachable()) { if(IsScopeAttached()) { if(!pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,TRUE,TRUE); }else{ if(pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); } } if(m_eScopeStatus==ALife::eAddonDisabled && bone_id!=BI_NONE && pWeaponVisual->LL_GetBoneVisible(bone_id) ) { pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); // Log("scope", pWeaponVisual->LL_GetBoneVisible (bone_id)); } bone_id = pWeaponVisual->LL_BoneID (wpn_silencer); if(SilencerAttachable()) { if(IsSilencerAttached()){ if(!pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,TRUE,TRUE); }else{ if( pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); } } if(m_eSilencerStatus==ALife::eAddonDisabled && bone_id!=BI_NONE && pWeaponVisual->LL_GetBoneVisible(bone_id) ) { pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); // Log("silencer", pWeaponVisual->LL_GetBoneVisible (bone_id)); } bone_id = pWeaponVisual->LL_BoneID (wpn_grenade_launcher); if(GrenadeLauncherAttachable()) { if(IsGrenadeLauncherAttached()) { if(!pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,TRUE,TRUE); }else{ if(pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); } } if(m_eGrenadeLauncherStatus==ALife::eAddonDisabled && bone_id!=BI_NONE && pWeaponVisual->LL_GetBoneVisible(bone_id) ) { pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); // Log("gl", pWeaponVisual->LL_GetBoneVisible (bone_id)); } pWeaponVisual->CalculateBones_Invalidate (); pWeaponVisual->CalculateBones (TRUE); }
void imotion_position::state_end( ) { VERIFY( shell ); inherited::state_end( ); CPhysicsShellHolder *obj= static_cast<CPhysicsShellHolder*>( shell->get_ElementByStoreOrder( 0 )->PhysicsRefObject() ); VERIFY( obj ); obj->processing_deactivate(); shell->Enable(); shell->setForce( Fvector().set( 0.f, 0.f, 0.f ) ); shell->setTorque( Fvector().set( 0.f, 0.f, 0.f ) ); shell->AnimToVelocityState( end_delta, default_l_limit * 10, default_w_limit * 10 ); #ifdef DEBUG dbg_draw_state_end( shell ); #endif shell->remove_ObjectContactCallback( get_depth ); IKinematics *K = shell->PKinematics(); disable_update( false ); disable_bone_calculation( *K, false ); K->SetUpdateCallback( saved_visual_callback ); deinit_bones(); save_fixes( K ); shell->EnabledCallbacks( TRUE ); restore_fixes( ); VERIFY( K ); IKinematicsAnimated *KA = smart_cast<IKinematicsAnimated*>( shell->PKinematics() ); VERIFY( KA ); update_callback.motion = 0; KA->SetUpdateTracksCalback( 0 ); #if 0 DBG_OpenCashedDraw(); shell->dbg_draw_geometry( 0.02, D3DCOLOR_ARGB( 255, 0, 255, 0 ) ); DBG_DrawBones( *shell->get_ElementByStoreOrder( 0 )->PhysicsRefObject() ); DBG_ClosedCashedDraw( 50000 ); #endif u16 root = K->LL_GetBoneRoot(); if( root!=0 ) { K->LL_GetTransform( 0 ).set( Fidentity ); K->LL_SetBoneVisible( 0, FALSE, FALSE ); u16 bip01 = K->LL_BoneID( "bip01" ); if( bip01 != BI_NONE && bip01 != root ) { K->LL_GetTransform( bip01 ).set( Fidentity ); K->LL_SetBoneVisible( bip01, FALSE, FALSE ); } } K->CalculateBones_Invalidate(); K->CalculateBones( true ); #if 0 DBG_OpenCashedDraw(); shell->dbg_draw_geometry( 0.02, D3DCOLOR_ARGB( 255, 0, 0, 255 ) ); DBG_DrawBones( *shell->get_ElementByStoreOrder( 0 )->PhysicsRefObject() ); DBG_ClosedCashedDraw( 50000 ); #endif }
bool CPhysicObject::get_door_vectors ( Fvector& closed, Fvector& open ) const { VERIFY(Visual()); IKinematics *K = Visual()->dcast_PKinematics(); VERIFY(K); u16 door_bone = K->LL_BoneID("door"); if( door_bone==BI_NONE ) return false; const CBoneData &bd = K->LL_GetData( door_bone ); const SBoneShape &shape = bd.shape; if( shape.type != SBoneShape::stBox ) return false; if( shape.flags.test( SBoneShape::sfNoPhysics ) ) return false; Fmatrix start_bone_pos; K->Bone_GetAnimPos( start_bone_pos, door_bone, u8(-1), true ); Fmatrix start_pos = Fmatrix().mul_43( XFORM(), start_bone_pos ); const Fobb &box = shape.box; Fvector center_pos; start_pos.transform_tiny( center_pos, box.m_translate ); Fvector door_dir; start_pos.transform_dir(door_dir, box.m_rotate.i ); Fvector door_dir_local = box.m_rotate.i ; //Fvector door_dir_bone; start_bone_pos.transform_dir(door_dir_bone, box.m_rotate.i ); const Fvector det_vector = Fvector().sub( center_pos, start_pos.c ); if( door_dir.dotproduct( det_vector ) < 0.f ) { door_dir.invert(); door_dir_local.invert(); //door_dir_bone.invert(); } const SJointIKData &joint = bd.IK_data; if( joint.type != jtJoint ) return false; const Fvector2& limits = joint.limits[1].limit; //if( limits.y < EPS ) //limits.y - limits.x < EPS // return false; if( M_PI - limits.y < EPS && M_PI + limits.x < EPS ) return false; Fmatrix to_hi = Fmatrix().rotateY( -limits.x ); to_hi.transform_dir( open, door_dir_local ); Fmatrix to_lo = Fmatrix().rotateY( -limits.y ); to_lo.transform_dir( closed, door_dir_local ); start_pos.transform_dir(open); start_pos.transform_dir(closed); //DBG_OpenCashedDraw( ); #ifdef DEBUG if(dbg_draw_doors) { DBG_DrawMatrix( Fidentity, 10.0f ); DBG_DrawMatrix( XFORM(), .5f, 100 ); DBG_DrawMatrix( start_pos, 0.2f,100 ); const Fvector pos = start_pos.c.add( Fvector().set(0,0.2f,0) ); const Fvector pos1 = start_pos.c.add( Fvector().set(0,0.3f,0) ); DBG_DrawLine( pos, Fvector( ).add( pos, open ), D3DCOLOR_XRGB( 0, 255, 0 ) ); DBG_DrawLine( pos, Fvector( ).add( pos, closed ), D3DCOLOR_XRGB( 255, 0, 0 ) ); DBG_DrawLine( pos1, Fvector( ).add( pos1, det_vector ), D3DCOLOR_XRGB( 255, 255, 0 ) ); } #endif //DBG_ClosedCashedDraw( 50000000 ); return true; }
BOOL CHelicopter::net_Spawn(CSE_Abstract* DC) { SetfHealth(100.0f); setState(CHelicopter::eAlive); m_flame_started =false; m_light_started =false; m_exploded =false; m_ready_explode =false; m_dead =false; if (!inherited::net_Spawn(DC)) return (FALSE); CPHSkeleton::Spawn((CSE_Abstract*)(DC)); for(u32 i=0; i<4; ++i) CRocketLauncher::SpawnRocket(*m_sRocketSection, smart_cast<CGameObject*>(this)); // assigning m_animator here CSE_Abstract *abstract =(CSE_Abstract*)(DC); CSE_ALifeHelicopter *heli = smart_cast<CSE_ALifeHelicopter*>(abstract); VERIFY (heli); R_ASSERT (Visual()&&smart_cast<IKinematics*>(Visual())); IKinematics* K = smart_cast<IKinematics*>(Visual()); CInifile* pUserData = K->LL_UserData(); m_rotate_x_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","wpn_rotate_x_bone")); m_rotate_y_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","wpn_rotate_y_bone")); m_fire_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","wpn_fire_bone")); m_death_bones_to_hide = pUserData->r_string("on_death_mode","scale_bone"); m_left_rocket_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","left_rocket_bone")); m_right_rocket_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","right_rocket_bone")); m_smoke_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","smoke_bone")); m_light_bone = K->LL_BoneID (pUserData->r_string("helicopter_definition","light_bone")); CExplosive::Load (pUserData,"explosion"); CExplosive::SetInitiator(ID()); LPCSTR s = pUserData->r_string("helicopter_definition","hit_section"); if( pUserData->section_exist(s) ) { int lc = pUserData->line_count(s); LPCSTR name; LPCSTR value; s16 boneID; for (int i=0 ; i<lc; ++i) { pUserData->r_line( s, i, &name, &value); boneID =K->LL_BoneID(name); m_hitBones.insert( std::make_pair(boneID, (float)atof(value)) ); } } CBoneInstance& biX = smart_cast<IKinematics*>(Visual())->LL_GetBoneInstance(m_rotate_x_bone); biX.set_callback (bctCustom,BoneMGunCallbackX,this); CBoneInstance& biY = smart_cast<IKinematics*>(Visual())->LL_GetBoneInstance(m_rotate_y_bone); biY.set_callback (bctCustom,BoneMGunCallbackY,this); CBoneData& bdX = K->LL_GetData(m_rotate_x_bone); VERIFY(bdX.IK_data.type==jtJoint); m_lim_x_rot.set (bdX.IK_data.limits[0].limit.x,bdX.IK_data.limits[0].limit.y); CBoneData& bdY = K->LL_GetData(m_rotate_y_bone); VERIFY(bdY.IK_data.type==jtJoint); m_lim_y_rot.set (bdY.IK_data.limits[1].limit.x,bdY.IK_data.limits[1].limit.y); xr_vector<Fmatrix> matrices; K->LL_GetBindTransform (matrices); m_i_bind_x_xform.invert (matrices[m_rotate_x_bone]); m_i_bind_y_xform.invert (matrices[m_rotate_y_bone]); m_bind_rot.x = matrices[m_rotate_x_bone].k.getP(); m_bind_rot.y = matrices[m_rotate_y_bone].k.getH(); m_bind_x.set (matrices[m_rotate_x_bone].c); m_bind_y.set (matrices[m_rotate_y_bone].c); IKinematicsAnimated *A = smart_cast<IKinematicsAnimated*>(Visual()); if (A) { A->PlayCycle (*heli->startup_animation); K->CalculateBones (TRUE); } m_engineSound.create (*heli->engine_sound,st_Effect,sg_SourceType); m_engineSound.play_at_pos (0,XFORM().c,sm_Looped); CShootingObject::Light_Create (); setVisible (TRUE); setEnabled (TRUE); m_stepRemains = 0.0f; //lighting m_light_render = ::Render->light_create(); m_light_render->set_shadow (false); m_light_render->set_type (IRender_Light::POINT); m_light_render->set_range (m_light_range); m_light_render->set_color (m_light_color); if(g_Alive())processing_activate (); TurnEngineSound(false); if(pUserData->section_exist("destroyed")) CPHDestroyable::Load(pUserData,"destroyed"); #ifdef DEBUG Device.seqRender.Add(this,REG_PRIORITY_LOW-1); #endif return TRUE; }