void CWeaponStatMgun::UpdateBarrelDir() { IKinematics* K = smart_cast<IKinematics*>(Visual()); m_fire_bone_xform = K->LL_GetTransform(m_fire_bone); m_fire_bone_xform.mulA_43 (XFORM()); m_fire_pos.set (0,0,0); m_fire_bone_xform.transform_tiny(m_fire_pos); m_fire_dir.set (0,0,1); m_fire_bone_xform.transform_dir (m_fire_dir); m_allow_fire = true; Fmatrix XFi; XFi.invert (XFORM()); Fvector dep; XFi.transform_dir (dep,m_destEnemyDir); {// x angle m_i_bind_x_xform.transform_dir(dep); dep.normalize(); m_tgt_x_rot = angle_normalize_signed(m_bind_x_rot-dep.getP()); float sv_x = m_tgt_x_rot; clamp (m_tgt_x_rot,-m_lim_x_rot.y,-m_lim_x_rot.x); if (!fsimilar(sv_x,m_tgt_x_rot,EPS_L)) m_allow_fire=FALSE; } {// y angle m_i_bind_y_xform.transform_dir(dep); dep.normalize(); m_tgt_y_rot = angle_normalize_signed(m_bind_y_rot-dep.getH()); float sv_y = m_tgt_y_rot; clamp (m_tgt_y_rot,-m_lim_y_rot.y,-m_lim_y_rot.x); if (!fsimilar(sv_y,m_tgt_y_rot,EPS_L)) m_allow_fire=FALSE; } m_cur_x_rot = angle_inertion_var(m_cur_x_rot,m_tgt_x_rot,0.5f,3.5f,PI_DIV_6,Device.fTimeDelta); m_cur_y_rot = angle_inertion_var(m_cur_y_rot,m_tgt_y_rot,0.5f,3.5f,PI_DIV_6,Device.fTimeDelta); }
void CHelicopter::UpdateMGunDir() { IKinematics* K = smart_cast<IKinematics*>(Visual()); m_fire_bone_xform = K->LL_GetTransform(m_fire_bone); m_fire_bone_xform.mulA_43 (XFORM()); m_fire_pos.set (0,0,0); m_fire_bone_xform.transform_tiny(m_fire_pos); m_fire_dir.set (0,0,1); m_fire_bone_xform.transform_dir(m_fire_dir); m_fire_dir.sub (m_enemy.destEnemyPos,m_fire_pos).normalize_safe(); m_left_rocket_bone_xform = K->LL_GetTransform(m_left_rocket_bone); m_left_rocket_bone_xform.mulA_43 (XFORM()); m_left_rocket_bone_xform.c.y += 1.0f; //.fake m_right_rocket_bone_xform = K->LL_GetTransform(m_right_rocket_bone); m_right_rocket_bone_xform.mulA_43 (XFORM()); m_right_rocket_bone_xform.c.y += 1.0f; //.fake m_allow_fire = TRUE; Fmatrix XFi; XFi.invert (XFORM()); Fvector dep; XFi.transform_tiny (dep,m_enemy.destEnemyPos); {// x angle Fvector A_; A_.sub(dep,m_bind_x); m_i_bind_x_xform.transform_dir(A_); A_.normalize(); m_tgt_rot.x = angle_normalize_signed(m_bind_rot.x-A_.getP()); float sv_x = m_tgt_rot.x; clamp (m_tgt_rot.x,-m_lim_x_rot.y,-m_lim_x_rot.x); if (!fsimilar(sv_x,m_tgt_rot.x,EPS_L)) m_allow_fire=FALSE; } {// y angle Fvector A_; A_.sub(dep,m_bind_y); m_i_bind_y_xform.transform_dir(A_); A_.normalize(); m_tgt_rot.y = angle_normalize_signed(m_bind_rot.y-A_.getH()); float sv_y = m_tgt_rot.y; clamp (m_tgt_rot.y,-m_lim_y_rot.y,-m_lim_y_rot.x); if (!fsimilar(sv_y,m_tgt_rot.y,EPS_L)) m_allow_fire=FALSE; } if ((angle_difference(m_cur_rot.x,m_tgt_rot.x)>deg2rad(m_barrel_dir_tolerance))|| (angle_difference(m_cur_rot.y,m_tgt_rot.y)>deg2rad(m_barrel_dir_tolerance))) m_allow_fire=FALSE; }
Fvector& global_hit_position( Fvector &gp, CEntityAlive& ea, const SHit& H ) { VERIFY( ea.Visual() ); IKinematics *K = ea.Visual( )->dcast_PKinematics( ); VERIFY( K ); K->LL_GetTransform( H.bone() ).transform_tiny( gp, H.bone_space_position( ) ); ea.XFORM().transform_tiny( gp ); return gp; }
void CInventoryItem::UpdateXForm () { if (0==object().H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(object().H_Parent()); if (!E) return; if (E->cast_base_monster()) return; const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; if (parent->attached(this)) return; R_ASSERT (E); IKinematics* V = smart_cast<IKinematics*> (E->Visual()); VERIFY (V); // Get matrices int boneL = -1, boneR = -1, boneR2 = -1; E->g_WeaponBones(boneL,boneR,boneR2); if (boneR == -1) return; // if ((HandDependence() == hd1Hand) || (STATE == eReload) || (!E->g_Alive())) // boneL = boneR2; #pragma todo("TO ALL: serious performance problem") V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); D.normalize_safe(); if(fis_zero(D.magnitude())) { mRes.set(E->XFORM()); mRes.c.set(mR.c); } else { D.normalize(); R.crossproduct (mR.j,D); N.crossproduct (D,R); N.normalize(); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); } // UpdatePosition (mRes); object().Position().set(mRes.c); }
void CArtefact::UpdateXForm() { if (Device.dwFrame!=dwXF_Frame) { dwXF_Frame = Device.dwFrame; if (0==H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(H_Parent()); if(!E) return ; const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; VERIFY (E); IKinematics* V = smart_cast<IKinematics*> (E->Visual()); VERIFY (V); if(CAttachableItem::enabled()) return; // Get matrices int boneL = -1, boneR = -1, boneR2 = -1; E->g_WeaponBones (boneL,boneR,boneR2); if (boneR == -1) return; boneL = boneR2; V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); D.normalize_safe(); R.crossproduct (mR.j,D); R.normalize_safe(); N.crossproduct (D,R); N.normalize_safe(); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); // UpdatePosition (mRes); XFORM().mul (mRes,offset()); } }
void reset_root_bone_start_pose( CPhysicsShell& shell ) { VERIFY( &shell ); CPhysicsElement * physics_root_element = shell.get_ElementByStoreOrder( 0 ); VERIFY( physics_root_element ); IKinematics * K = shell.PKinematics(); VERIFY( K ); u16 animation_root_bone_id = K->LL_GetBoneRoot(); CODEGeom *physics_root_bone_geom = physics_root_element->geometry( 0 ); VERIFY( physics_root_bone_geom ); u16 physics_root_bone_id = physics_root_bone_geom->bone_id(); VERIFY( physics_root_bone_id != BI_NONE ); if( animation_root_bone_id == physics_root_bone_id ) return ; //u16 anim_bones_number = K->LL_BoneCount(); //buffer_vector<u32> anim_bones_bind_positions( _alloca(anim_bones_number*sizeof(u32)), // anim_bones_number // ); #pragma todo("LL_GetBindTransform shoud use buffer_vector") xr_vector<Fmatrix> anim_bones_bind_positions; K->LL_GetBindTransform( anim_bones_bind_positions ); const Fmatrix physics_root_to_anim_root_bind_transformation = Fmatrix().mul_43( Fmatrix().invert( anim_bones_bind_positions[ physics_root_bone_id ] ), anim_bones_bind_positions[ animation_root_bone_id ] ); const Fmatrix &physics_root_bone_anim_transform = K->LL_GetTransform( physics_root_bone_id ); const Fmatrix physics_root_bone_corrected_pos = Fmatrix().mul_43( physics_root_bone_anim_transform , physics_root_to_anim_root_bind_transformation ); physics_root_element->SetTransform( Fmatrix().mul_43( shell.mXFORM, physics_root_bone_corrected_pos ) ); //physics_root_element->TransformPosition( Fmatrix().mul_43( Fmatrix().invert( K->LL_GetTransform( animation_root_bone_id ) ), physics_root_bone_corrected_pos ) ); }
void CPhysicObject::AddElement(CPhysicsElement* root_e, int id) { IKinematics* K = smart_cast<IKinematics*>(Visual()); CPhysicsElement* E = P_create_Element(); CBoneInstance& B = K->LL_GetBoneInstance(u16(id)); E->mXFORM.set (K->LL_GetTransform(u16(id))); Fobb bb = K->LL_GetBox(u16(id)); if(bb.m_halfsize.magnitude()<0.05f) { bb.m_halfsize.add(0.05f); } E->add_Box (bb); E->setMass (10.f); E->set_ParentElement(root_e); B.set_callback (bctPhysics,m_pPhysicsShell->GetBonesCallback(),E); m_pPhysicsShell->add_Element (E); if( !(m_type==epotFreeChain && root_e==0) ) { CPhysicsJoint* J= P_create_Joint(CPhysicsJoint::full_control,root_e,E); J->SetAnchorVsSecondElement (0,0,0); J->SetAxisDirVsSecondElement (1,0,0,0); J->SetAxisDirVsSecondElement (0,1,0,2); J->SetLimits (-M_PI/2,M_PI/2,0); J->SetLimits (-M_PI/2,M_PI/2,1); J->SetLimits (-M_PI/2,M_PI/2,2); m_pPhysicsShell->add_Joint (J); } CBoneData& BD = K->LL_GetData(u16(id)); for (vecBonesIt it=BD.children.begin(); BD.children.end() != it; ++it){ AddElement (E,(*it)->GetSelfID()); } }
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::UpdateXForm () { if (Device.dwFrame == dwXF_Frame) return; dwXF_Frame = Device.dwFrame; if (!H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(H_Parent()); if (!E) { if (!IsGameTypeSingle()) UpdatePosition (H_Parent()->XFORM()); return; } const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; if (parent->attached(this)) return; IKinematics* V = smart_cast<IKinematics*> (E->Visual()); VERIFY (V); // Get matrices int boneL = -1, boneR = -1, boneR2 = -1; // this ugly case is possible in case of a CustomMonster, not a Stalker, nor an Actor E->g_WeaponBones (boneL,boneR,boneR2); if (boneR == -1) return; if ((HandDependence() == hd1Hand) || (GetState() == eReload) || (!E->g_Alive())) boneL = boneR2; V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); if(fis_zero(D.magnitude())) { mRes.set (E->XFORM()); mRes.c.set (mR.c); } else { D.normalize (); R.crossproduct (mR.j,D); N.crossproduct (D,R); N.normalize (); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); } UpdatePosition (mRes); }
void CIKLimbsController::Calculate( ) { update_blend( m_legs_blend ); Fmatrix &obj = m_object->XFORM( ); #ifdef DEBUG if( ph_dbg_draw_mask1.test( phDbgDrawIKSHiftObject ) ) _object_shift.dbg_draw( obj, _pose_extrapolation, Fvector().set( 0,2.5f,0)); #endif SCalculateData cd[max_size]; xr_vector<CIKLimb>::iterator i, b = _bone_chains.begin(), e = _bone_chains.end(); for( i = b ; e != i; ++i ) { cd[i-b] = SCalculateData ( *i, obj ); LimbCalculate( cd[i-b] ); } IKinematics *K = m_object->Visual()->dcast_PKinematics( ); u16 root = K->LL_GetBoneRoot( ) ; CBoneInstance &root_bi = K->LL_GetBoneInstance(root); BOOL sv_root_cb_ovwr = root_bi.callback_overwrite(); BoneCallback sv_root_cb = root_bi.callback(); root_bi.set_callback( root_bi.callback_type(), 0, root_bi.callback_param(), TRUE ); if( ik_shift_object )//&& ! m_object->animation_movement_controlled( ) { ShiftObject( cd ); } const u16 sz =(u16)_bone_chains.size(); for(u16 j = 0; sz > j; ++j ) cd[j].m_limb->SetGoal( cd[j] ); for(u16 j = 0; sz > j; ++j ) { cd[j].m_limb->SolveBones( cd[j] ); #ifdef DEBUG if( ph_dbg_draw_mask1.test( phDbgDrawIKPredict ) ) { //IKinematics *K = m_object->Visual()->dcast_PKinematics( ); u16 ref_bone_id = cd[j].m_limb->dbg_ref_bone_id(); Fmatrix m =Fmatrix().mul( obj, K->LL_GetTransform( ref_bone_id ) ); Fvector toe; cd[j].m_limb->dbg_ik_foot().ToePosition( toe ); m.transform_tiny( toe ); DBG_DrawLine( toe, Fvector().add( toe, Fvector().set( 0, -_object_shift.shift(), 0 ) ), D3DCOLOR_XRGB( 255, 0, 0 ) ); } #endif } ObjectShift( 0, cd ); root_bi.set_callback( root_bi.callback_type(), sv_root_cb, root_bi.callback_param(), sv_root_cb_ovwr ); }
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 character_hit_animation_controller::PlayHitMotion( const Fvector &dir, const Fvector &bone_pos, u16 bi, CEntityAlive &ea )const { IRenderVisual *pV = ea.Visual( ); IKinematicsAnimated* CA = smart_cast<IKinematicsAnimated*>( pV ); IKinematics* K = smart_cast<IKinematics*>( pV ); //play_cycle(CA,all_shift_down,1,block_times[6],1) ; if( !( K->LL_BoneCount( ) > bi ) ) return; Fvector dr = dir; Fmatrix m; GetBaseMatrix( m, ea ); #ifdef DEBUG if( ph_dbg_draw_mask1.test( phDbgHitAnims ) ) { DBG_OpenCashedDraw(); DBG_DrawLine( m.c, Fvector( ).sub( m.c, Fvector( ).mul( dir, 1.5 ) ), D3DCOLOR_XRGB( 255, 0, 255 ) ); DBG_ClosedCashedDraw( 1000 ); } #endif m.invert( ); m.transform_dir( dr ); // Fvector hit_point; K->LL_GetTransform( bi ).transform_tiny( hit_point, bone_pos ); ea.XFORM( ).transform_tiny( hit_point ); m.transform_tiny( hit_point ); Fvector torqu; torqu.crossproduct( dr, hit_point ); hit_point.x = 0; float rotational_ammount = hit_point.magnitude( ) * g_params.power_factor * g_params.rotational_power_factor;//_abs(torqu.x) if( torqu.x < 0 ) play_cycle( CA, hit_downr, 3, block_blends[7], 1 ) ; else play_cycle( CA, hit_downl, 3, block_blends[6], 1 ) ; if( !IsEffected( bi, *K ) ) return; if( torqu.x<0 ) play_cycle( CA, turn_right, 2, block_blends[4], rotational_ammount ) ; else play_cycle( CA, turn_left, 2, block_blends[5], rotational_ammount ) ; //CA->LL_SetChannelFactor(3,rotational_ammount); dr.x = 0; dr.normalize_safe(); dr.mul(g_params.power_factor); if( dr.y > g_params.side_sensitivity_threshold ) play_cycle( CA, rthit_motion, 2, block_blends[0], _abs( dr.y ) ) ; else if( dr.y < -g_params.side_sensitivity_threshold ) play_cycle( CA, lthit_motion, 2, block_blends[1], _abs( dr.y ) ) ; if( dr.z<0.f ) play_cycle( CA, fvhit_motion, 2, block_blends[2], _abs(dr.z) ) ; else play_cycle( CA, bkhit_motion, 2, block_blends[3], _abs( dr.z ) ) ; CA->LL_SetChannelFactor( 2, g_params.anim_channel_factor ); }
void character_hit_animation_controller::GetBaseMatrix( Fmatrix &m,CEntityAlive &ea)const { IKinematics* CA = smart_cast<IKinematics*>(ea.Visual()); m.mul_43(ea.XFORM(),CA->LL_GetTransform(base_bone)); }