void CExplosiveRocket::PH_A_CrPr () { if (m_just_after_spawn) { CPhysicsShellHolder& obj = CInventoryItem::object(); VERIFY(obj.Visual()); IKinematics *K = obj.Visual()->dcast_PKinematics(); VERIFY( K ); if (!obj.PPhysicsShell()) { Msg("! ERROR: PhysicsShell is NULL, object [%s][%d]", obj.cName().c_str(), obj.ID()); return; } if(!obj.PPhysicsShell()->isFullActive()) { K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); } obj.PPhysicsShell()->GetGlobalTransformDynamic(&obj.XFORM()); K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); obj.spatial_move(); m_just_after_spawn = false; } }
void CCharacterPhysicsSupport::in_NetSpawn( CSE_Abstract* e ) { m_sv_hit = SHit(); if( m_EntityAlife.use_simplified_visual ( ) ) { m_flags.set( fl_death_anim_on, TRUE ); IKinematics* ka = smart_cast<IKinematics*>( m_EntityAlife.Visual( ) ); VERIFY( ka ); ka->CalculateBones_Invalidate( ); ka->CalculateBones( TRUE ); CollisionCorrectObjPos( m_EntityAlife.Position( ) ); m_pPhysicsShell = P_build_Shell( &m_EntityAlife, false ); ka->CalculateBones_Invalidate( ); ka->CalculateBones( TRUE ); return; } CPHDestroyable::Init();//this zerows colbacks !!; IRenderVisual *pVisual = m_EntityAlife.Visual(); IKinematicsAnimated*ka= smart_cast<IKinematicsAnimated*>( pVisual ); IKinematics*pK= smart_cast<IKinematics*>( pVisual ); VERIFY( &e->spawn_ini() ); m_death_anims.setup( ka, *e->s_name , pSettings ); if( !m_EntityAlife.g_Alive() ) { if( m_eType == etStalker ) ka->PlayCycle( "waunded_1_idle_0" ); else ka->PlayCycle( "death_init" ); }else if( !m_EntityAlife.animation_movement_controlled( ) ) ka->PlayCycle( "death_init" );///непонятно зачем это вообще надо запускать ///этот хак нужен, потому что некоторым монстрам ///анимация после спона, может быть вообще не назначена pK->CalculateBones_Invalidate( ); pK->CalculateBones( TRUE ); CPHSkeleton::Spawn( e ); movement( )->EnableCharacter(); movement( )->SetPosition(m_EntityAlife.Position( ) ); movement( )->SetVelocity ( 0, 0, 0 ); if(m_eType!=etActor) { m_flags.set( fl_specific_bonce_demager, TRUE ); m_BonceDamageFactor = 1.f; } if( Type( ) == etStalker ) { m_hit_animations.SetupHitMotions( *smart_cast<IKinematicsAnimated*>( m_EntityAlife.Visual( ) ) ); } anim_mov_state.init( ); anim_mov_state.active = m_EntityAlife.animation_movement_controlled( ); }
void CPhysicObject::PH_A_CrPr () { if (m_just_after_spawn) { VERIFY(Visual()); IKinematics *K = Visual()->dcast_PKinematics(); VERIFY( K ); if (!PPhysicsShell()) { return; } if(!PPhysicsShell()->isFullActive()) { K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); } PPhysicsShell()->GetGlobalTransformDynamic(&XFORM()); K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); #if 0 Fbox bb= BoundingBox (); DBG_OpenCashedDraw (); Fvector c,r,p; bb.get_CD(c,r ); XFORM().transform_tiny(p,c); DBG_DrawAABB( p, r,D3DCOLOR_XRGB(255, 0, 0)); //PPhysicsShell()->XFORM().transform_tiny(c); Fmatrix mm; PPhysicsShell()->GetGlobalTransformDynamic(&mm); mm.transform_tiny(p,c); DBG_DrawAABB( p, r,D3DCOLOR_XRGB(0, 255, 0)); DBG_ClosedCashedDraw (50000); #endif spatial_move(); m_just_after_spawn = false; VERIFY(!OnServer()); PPhysicsShell()->get_ElementByStoreOrder(0)->Fix(); PPhysicsShell()->SetIgnoreStatic (); //PPhysicsShell()->SetIgnoreDynamic (); //PPhysicsShell()->DisableCollision(); } //CalculateInterpolationParams() };
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 imotion_position::move_update( ) { VERIFY( shell ); IKinematics *K = shell->PKinematics(); VERIFY( K ); disable_update( false ); K->CalculateBones_Invalidate( ); K->CalculateBones( ); disable_update( true ); VERIFY( shell ); }
void CPHSkeleton::RespawnInit() { IKinematics* K = smart_cast<IKinematics*>(PPhysicsShellHolder()->Visual()); if(K) { K->LL_SetBoneRoot(0); K->LL_SetBonesVisible(0xffffffffffffffffL); K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); } Init(); ClearUnsplited(); }
void CCar::SpawnInitPhysics (CSE_Abstract *D) { CSE_PHSkeleton *so = smart_cast<CSE_PHSkeleton*>(D); R_ASSERT (so); ParseDefinitions ();//parse ini filling in m_driving_wheels,m_steering_wheels,m_breaking_wheels CreateSkeleton (D);//creates m_pPhysicsShell & fill in bone_map IKinematics *K =smart_cast<IKinematics*>(Visual()); K->CalculateBones_Invalidate();//this need to call callbacks K->CalculateBones (TRUE); Init ();//inits m_driving_wheels,m_steering_wheels,m_breaking_wheels values using recieved in ParceDefinitions & from bone_map //PPhysicsShell()->add_ObjectContactCallback(ActorObstacleCallback); SetDefaultNetState (so); CPHUpdateObject::Activate (); }
void CPhysicObject:: anim_time_set ( float time ) { if( !check_blend( m_anim_blend, cName().c_str(), cNameSect().c_str(), cNameVisual().c_str() ) ) return ; if( time < 0.f || time > m_anim_blend->timeTotal ) { #ifdef DEBUG Msg( " ! can not set blend time %f - it must be in range 0 - %f(timeTotal) obj: %s, model: %s, anim: %s", time, m_anim_blend->timeTotal, cName().c_str(), cNameVisual().c_str(), smart_cast<IKinematicsAnimated*>( PPhysicsShell()->PKinematics() )->LL_MotionDefName_dbg( m_anim_blend->motionID ).first ); #endif return; } m_anim_blend->timeCurrent = time; IKinematics *K = smart_cast<IKinematics*>(Visual()); VERIFY( K ); K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); }
void CWeaponStatMgun::cam_Update (float dt, float fov) { Fvector P,Da; Da.set (0,0,0); IKinematics* K = smart_cast<IKinematics*>(Visual()); K->CalculateBones_Invalidate (); K->CalculateBones (TRUE); const Fmatrix& C = K->LL_GetTransform(m_camera_bone); XFORM().transform_tiny (P,C.c); Fvector d = C.k; XFORM().transform_dir (d); Fvector2 des_cam_dir; d.getHP(des_cam_dir.x, des_cam_dir.y); des_cam_dir.mul(-1.0f); Camera()->yaw = angle_inertion_var(Camera()->yaw, des_cam_dir.x, 0.5f, 7.5f, PI_DIV_6, Device.fTimeDelta); Camera()->pitch = angle_inertion_var(Camera()->pitch, des_cam_dir.y, 0.5f, 7.5f, PI_DIV_6, Device.fTimeDelta); if(OwnerActor()){ // rotate head OwnerActor()->Orientation().yaw = -Camera()->yaw; OwnerActor()->Orientation().pitch = -Camera()->pitch; } Camera()->Update (P,Da); Level().Cameras().UpdateFromCamera (Camera()); }
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 }
void CInventoryItem::PH_A_CrPr () { if (m_just_after_spawn) { VERIFY(object().Visual()); IKinematics *K = object().Visual()->dcast_PKinematics(); VERIFY( K ); if (!object().PPhysicsShell()) { Msg("! ERROR: PhysicsShell is NULL, object [%s][%d]", object().cName().c_str(), object().ID()); VERIFY2(0, "physical shell is NULL"); return; } if(!object().PPhysicsShell()->isFullActive()) { K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); } object().PPhysicsShell()->GetGlobalTransformDynamic(&object().XFORM()); K->CalculateBones_Invalidate(); K->CalculateBones(TRUE); #if 0 Fbox bb= BoundingBox (); DBG_OpenCashedDraw (); Fvector c,r,p; bb.get_CD(c,r ); XFORM().transform_tiny(p,c); DBG_DrawAABB( p, r,D3DCOLOR_XRGB(255, 0, 0)); //PPhysicsShell()->XFORM().transform_tiny(c); Fmatrix mm; PPhysicsShell()->GetGlobalTransformDynamic(&mm); mm.transform_tiny(p,c); DBG_DrawAABB( p, r,D3DCOLOR_XRGB(0, 255, 0)); DBG_ClosedCashedDraw (50000); #endif object().spatial_move(); m_just_after_spawn = false; VERIFY(!OnServer()); object().PPhysicsShell()->get_ElementByStoreOrder(0)->Fix(); object().PPhysicsShell()->SetIgnoreStatic (); //object().PPhysicsShell()->SetIgnoreDynamic (); //PPhysicsShell()->DisableCollision(); } /*net_updateData* p = NetSync(); //restore recalculated data and get data for interpolation if (!object().CrPr_IsActivated()) return; //////////////////////////////////// CPHSynchronize* pSyncObj = NULL; pSyncObj = object().PHGetSyncItem (0); if (!pSyncObj) return; //////////////////////////////////// pSyncObj->get_State (p->PredictedState); //////////////////////////////////// pSyncObj->set_State (p->RecalculatedState); //////////////////////////////////// if (!m_flags.test(FInInterpolate)) return; //////////////////////////////////// Fmatrix xformX; pSyncObj->cv2obj_Xfrom(p->PredictedState.quaternion, p->PredictedState.position, xformX); VERIFY2 (_valid(xformX),*object().cName()); pSyncObj->cv2obj_Xfrom (p->PredictedState.quaternion, p->PredictedState.position, xformX); p->IEndRot.set (xformX); p->IEndPos.set (xformX.c); VERIFY2 (_valid(p->IEndPos),*object().cName()); ///////////////////////////////////////////////////////////////////////// CalculateInterpolationParams (); ///////////////////////////////////////////////////*/ };