void CHelicopter::BoneMGunCallbackY(CBoneInstance *B) { CHelicopter * P = static_cast<CHelicopter*>(B->callback_param()); Fmatrix rY; rY.rotateY (P->m_cur_rot.y); B->mTransform.mulB_43 (rY); }
void CIKLimb::BonesCallback1 (CBoneInstance* B) { SCalculateData* D=(SCalculateData*)B->Callback_Param; CIKLimb* L=D->m_limb ; float const *x=D->m_angles ; Fmatrix bm;//B->mTransform ; bm.rotateY(x[3]) ; CKinematics *K=D->m_K; CBoneData& BD=K->LL_GetData(L->m_bones[1]); Fmatrix cmp_save;cmp_save.set(B->mTransform) ; B->mTransform.mul_43(K->LL_GetTransform(BD.GetParentID()),BD.bind_transform); Fmatrix dd;dd.mul_43(Fmatrix().invert(B->mTransform),cmp_save); Fvector a;dd.getXYZ(a); B->mTransform.mulB_43(bm) ; Fmatrix cmp_savei;cmp_savei.invert(cmp_save); Fmatrix dif;dif.mul_43(cmp_savei,B->mTransform); }
void CEnvironment::RenderSky () { #ifndef _EDITOR if (0==g_pGameLevel) return ; #endif // clouds_sh.create ("clouds","null"); //. this is the bug-fix for the case when the sky is broken //. for some unknown reason the geoms happen to be invalid sometimes //. if vTune show this in profile, please add simple cache (move-to-forward last found) //. to the following functions: //. CResourceManager::_CreateDecl //. CResourceManager::CreateGeom if(bNeed_re_create_env) { sh_2sky.create (&m_b_skybox,"skybox_2t"); sh_2geom.create (v_skybox_fvf,RCache.Vertex.Buffer(), RCache.Index.Buffer()); clouds_sh.create ("clouds","null"); clouds_geom.create (v_clouds_fvf,RCache.Vertex.Buffer(), RCache.Index.Buffer()); bNeed_re_create_env = FALSE; } ::Render->rmFar (); // draw sky box Fmatrix mSky; mSky.rotateY (CurrentEnv.sky_rotation); mSky.translate_over (Device.vCameraPosition); u32 i_offset,v_offset; u32 C = color_rgba(iFloor(CurrentEnv.sky_color.x*255.f), iFloor(CurrentEnv.sky_color.y*255.f), iFloor(CurrentEnv.sky_color.z*255.f), iFloor(CurrentEnv.weight*255.f)); // Fill index buffer u16* pib = RCache.Index.Lock (20*3,i_offset); CopyMemory (pib,hbox_faces,20*3*2); RCache.Index.Unlock (20*3); // Fill vertex buffer v_skybox* pv = (v_skybox*) RCache.Vertex.Lock (12,sh_2geom.stride(),v_offset); for (u32 v=0; v<12; v++) pv[v].set (hbox_verts[v*2],C,hbox_verts[v*2+1]); RCache.Vertex.Unlock (12,sh_2geom.stride()); // Render RCache.set_xform_world (mSky); RCache.set_Geometry (sh_2geom); RCache.set_Shader (sh_2sky); RCache.set_Textures (&CurrentEnv.sky_r_textures); RCache.Render (D3DPT_TRIANGLELIST,v_offset,0,12,i_offset,20); // Sun ::Render->rmNormal (); eff_LensFlare->Render (TRUE,FALSE,FALSE); }
void CWeaponStatMgun::BoneCallbackY (CBoneInstance *B) { CWeaponStatMgun *P = static_cast<CWeaponStatMgun*>(B->callback_param()); Fmatrix rY; rY.rotateY (P->m_cur_y_rot); B->mTransform.mulB_43(rY); }
void CActor::g_Orientate (u32 mstate_rl, float dt) { static float fwd_l_strafe_yaw = deg2rad(pSettings->r_float(ACTOR_ANIM_SECT, "fwd_l_strafe_yaw")); static float back_l_strafe_yaw = deg2rad(pSettings->r_float(ACTOR_ANIM_SECT, "back_l_strafe_yaw")); static float fwd_r_strafe_yaw = deg2rad(pSettings->r_float(ACTOR_ANIM_SECT, "fwd_r_strafe_yaw")); static float back_r_strafe_yaw = deg2rad(pSettings->r_float(ACTOR_ANIM_SECT, "back_r_strafe_yaw")); static float l_strafe_yaw = deg2rad(pSettings->r_float(ACTOR_ANIM_SECT, "l_strafe_yaw")); static float r_strafe_yaw = deg2rad(pSettings->r_float(ACTOR_ANIM_SECT, "r_strafe_yaw")); if(!g_Alive())return; // visual effect of "fwd+strafe" like motion float calc_yaw = 0; if(mstate_real&mcClimb) { if(g_LadderOrient()) return; } switch(mstate_rl&mcAnyMove) { case mcFwd+mcLStrafe: calc_yaw = +fwd_l_strafe_yaw;//+PI_DIV_4; break; case mcBack+mcRStrafe: calc_yaw = +back_r_strafe_yaw;//+PI_DIV_4; break; case mcFwd+mcRStrafe: calc_yaw = -fwd_r_strafe_yaw;//-PI_DIV_4; break; case mcBack+mcLStrafe: calc_yaw = -back_l_strafe_yaw;//-PI_DIV_4; break; case mcLStrafe: calc_yaw = +l_strafe_yaw;//+PI_DIV_3-EPS_L; break; case mcRStrafe: calc_yaw = -r_strafe_yaw;//-PI_DIV_4+EPS_L; break; } // lerp angle for "effect" and capture torso data from camera angle_lerp (r_model_yaw_delta,calc_yaw,PI_MUL_4,dt); // build matrix Fmatrix mXFORM; mXFORM.rotateY (-(r_model_yaw + r_model_yaw_delta)); mXFORM.c.set (Position()); XFORM().set (mXFORM); //------------------------------------------------- float tgt_roll = 0.f; if (mstate_rl&mcLookout) { tgt_roll = (mstate_rl&mcLLookout)?-ACTOR_LOOKOUT_ANGLE:ACTOR_LOOKOUT_ANGLE; if( (mstate_rl&mcLLookout) && (mstate_rl&mcRLookout) ) tgt_roll = 0.0f; } if (!fsimilar(tgt_roll,r_torso_tgt_roll,EPS)){ angle_lerp (r_torso_tgt_roll,tgt_roll,PI_MUL_2,dt); r_torso_tgt_roll= angle_normalize_signed(r_torso_tgt_roll); } }
void CActor::g_cl_CheckControls(u32 mstate_wf, Fvector &vControlAccel, float &Jump, float dt) { mstate_old = mstate_real; vControlAccel.set (0,0,0); if (!(mstate_real&mcFall) && (character_physics_support()->movement()->Environment()==CPHMovementControl::peInAir)) { m_fFallTime -= dt; if (m_fFallTime<=0.f){ m_fFallTime = s_fFallTime; mstate_real |= mcFall; mstate_real &=~ mcJump; } } if(!CanMove()) { if(mstate_wf&mcAnyMove) { StopAnyMove(); mstate_wf &= ~mcAnyMove; mstate_wf &= ~mcJump; } //character_physics_support()->movement()->EnableCharacter(); //return; } // update player accel if (mstate_wf&mcFwd) vControlAccel.z += 1; if (mstate_wf&mcBack) vControlAccel.z += -1; if (mstate_wf&mcLStrafe) vControlAccel.x += -1; if (mstate_wf&mcRStrafe) vControlAccel.x += 1; if (character_physics_support()->movement()->Environment()==CPHMovementControl::peOnGround || character_physics_support()->movement()->Environment()==CPHMovementControl::peAtWall ) { // crouch if ((0==(mstate_real&mcCrouch))&&(mstate_wf&mcCrouch)) { if(mstate_real&mcClimb) { mstate_wf&=~mcCrouch; } else { character_physics_support()->movement()->EnableCharacter(); bool Crouched = false; if (isActorAccelerated(mstate_wf, IsZoomAimingMode())) Crouched = character_physics_support()->movement()->ActivateBoxDynamic(1); else Crouched = character_physics_support()->movement()->ActivateBoxDynamic(2); if (Crouched) mstate_real |= mcCrouch; } } // jump m_fJumpTime -= dt; if ( CanJump() && (mstate_wf&mcJump) ) { mstate_real |= mcJump; m_bJumpKeyPressed = TRUE; Jump = m_fJumpSpeed; m_fJumpTime = s_fJumpTime; //уменьшить силу игрока из-за выполненого прыжка if (!GodMode()) conditions().ConditionJump(inventory().TotalWeight() / MaxCarryWeight()); } /* if(m_bJumpKeyPressed) Jump = m_fJumpSpeed; */ // mask input into "real" state u32 move = mcAnyMove|mcAccel; if (((mstate_real&mcCrouch))) { if (!isActorAccelerated(mstate_real, IsZoomAimingMode()) && isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(!character_physics_support()->movement()->ActivateBoxDynamic(1))move &=~mcAccel; } if (isActorAccelerated(mstate_real, IsZoomAimingMode()) && !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(character_physics_support()->movement()->ActivateBoxDynamic(2))mstate_real &=~mcAccel; } } if ((mstate_wf&mcSprint) && !CanSprint()) { mstate_wf &= ~mcSprint; } mstate_real &= (~move); mstate_real |= (mstate_wf & move); if(mstate_wf&mcSprint) mstate_real|=mcSprint; else mstate_real&=~mcSprint; if(!(mstate_real&(mcFwd|mcLStrafe|mcRStrafe))||mstate_real&(mcCrouch|mcClimb)|| !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { mstate_real&=~mcSprint; mstate_wishful&=~mcSprint; } // check player move state if (mstate_real&mcAnyMove) { BOOL bAccelerated = isActorAccelerated(mstate_real, IsZoomAimingMode())&&CanAccelerate(); // correct "mstate_real" if opposite keys pressed if (_abs(vControlAccel.z)<EPS) mstate_real &= ~(mcFwd+mcBack ); if (_abs(vControlAccel.x)<EPS) mstate_real &= ~(mcLStrafe+mcRStrafe); // normalize and analyze crouch and run float scale = vControlAccel.magnitude(); if (scale>EPS) { scale = m_fWalkAccel/scale; if (bAccelerated) if (mstate_real&mcBack) scale *= m_fRunBackFactor; else scale *= m_fRunFactor; else if (mstate_real&mcBack) scale *= m_fWalkBackFactor; if (mstate_real&mcCrouch) scale *= m_fCrouchFactor; if (mstate_real&mcClimb) scale *= m_fClimbFactor; if (mstate_real&mcSprint) scale *= m_fSprintFactor; if (mstate_real&(mcLStrafe|mcRStrafe) && !(mstate_real&mcCrouch)) { if (bAccelerated) scale *= m_fRun_StrafeFactor; else scale *= m_fWalk_StrafeFactor; } vControlAccel.mul (scale); }else{ // mstate_real &= ~mcAnyMove; } } }else{ // mstate_real &=~ mcAnyMove; } //------------------------------------------------------------------------------- //transform local dir to world dir Fmatrix mOrient; mOrient.rotateY (-r_model_yaw); mOrient.transform_dir(vControlAccel); //XFORM().transform_dir(vControlAccel); /* if(mstate_real&mcClimb&&mstate_real&mcAnyMove&& inventory().ActiveItem()&&inventory().ActiveItem()->HandDependence()==hd2Hand) { //inventory().ActiveItem()->Deactivate(); inventory().Activate(NO_ACTIVE_SLOT); } */ }
void CActor::NoClipFly(int cmd) { Fvector cur_pos;// = Position(); cur_pos.set(0,0,0); float scale = 1.0f; if(pInput->iGetAsyncKeyState(DIK_LSHIFT)) scale = 0.25f; else if(pInput->iGetAsyncKeyState(DIK_LMENU)) scale = 4.0f; switch(cmd) { case kJUMP: cur_pos.y += 0.1f; break; case kCROUCH: cur_pos.y -= 0.1f; break; case kFWD: cur_pos.z += 0.1f; break; case kBACK: cur_pos.z -= 0.1f; break; case kL_STRAFE: cur_pos.x -= 0.1f; break; case kR_STRAFE: cur_pos.x += 0.1f; break; case kCAM_1: cam_Set(eacFirstEye); break; case kCAM_2: cam_Set(eacLookAt); break; case kCAM_3: cam_Set(eacFreeLook); break; case kNIGHT_VISION: SwitchNightVision(); break; case kTORCH: SwitchTorch(); break; case kDETECTOR: { PIItem det_active = inventory().ItemFromSlot(DETECTOR_SLOT); if(det_active) { CCustomDetector* det = smart_cast<CCustomDetector*>(det_active); det->ToggleDetector(g_player_hud->attached_item(0)!=NULL); return; } } break; case kUSE: ActorUse(); break; } cur_pos.mul(scale); Fmatrix mOrient; mOrient.rotateY(-(cam_Active()->GetWorldYaw())); mOrient.transform_dir(cur_pos); Position().add(cur_pos); character_physics_support()->movement()->SetPosition(Position()); }
void CCarWeapon::BoneCallbackY (CBoneInstance *B) { CCarWeapon *P = static_cast<CCarWeapon*>(B->Callback_Param); Fmatrix rY; rY.rotateY (P->m_cur_y_rot); B->mTransform.mulB_43 (rY); }
void CActor::g_cl_CheckControls(u32 mstate_wf, Fvector &vControlAccel, float &Jump, float dt) { float cam_eff_factor = 0.0f; mstate_old = mstate_real; vControlAccel.set (0,0,0); if (!(mstate_real&mcFall) && (character_physics_support()->movement()->Environment()==CPHMovementControl::peInAir)) { m_fFallTime -= dt; if (m_fFallTime<=0.f) { m_fFallTime = s_fFallTime; mstate_real |= mcFall; mstate_real &=~ mcJump; } } if(!CanMove()) { if(mstate_wf&mcAnyMove) { StopAnyMove(); mstate_wf &= ~mcAnyMove; mstate_wf &= ~mcJump; } } // update player accel if (mstate_wf&mcFwd) vControlAccel.z += 1; if (mstate_wf&mcBack) vControlAccel.z += -1; if (mstate_wf&mcLStrafe) vControlAccel.x += -1; if (mstate_wf&mcRStrafe) vControlAccel.x += 1; CPHMovementControl::EEnvironment curr_env = character_physics_support()->movement()->Environment(); if(curr_env==CPHMovementControl::peOnGround || curr_env==CPHMovementControl::peAtWall) { // crouch if ((0==(mstate_real&mcCrouch))&&(mstate_wf&mcCrouch)) { if(mstate_real&mcClimb) { mstate_wf&=~mcCrouch; } else { character_physics_support()->movement()->EnableCharacter(); bool Crouched = false; if(isActorAccelerated(mstate_wf, IsZoomAimingMode())) Crouched = character_physics_support()->movement()->ActivateBoxDynamic(1); else Crouched = character_physics_support()->movement()->ActivateBoxDynamic(2); if(Crouched) mstate_real |= mcCrouch; } } // jump m_fJumpTime -= dt; if( CanJump() && (mstate_wf&mcJump) ) { mstate_real |= mcJump; m_bJumpKeyPressed = TRUE; Jump = m_fJumpSpeed; m_fJumpTime = s_fJumpTime; //уменьшить силу игрока из-за выполненого прыжка if (!GodMode()) conditions().ConditionJump(inventory().TotalWeight() / MaxCarryWeight()); } // mask input into "real" state u32 move = mcAnyMove|mcAccel; if(mstate_real&mcCrouch) { if (!isActorAccelerated(mstate_real, IsZoomAimingMode()) && isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(!character_physics_support()->movement()->ActivateBoxDynamic(1))move &=~mcAccel; } if (isActorAccelerated(mstate_real, IsZoomAimingMode()) && !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(character_physics_support()->movement()->ActivateBoxDynamic(2))mstate_real &=~mcAccel; } } if ((mstate_wf&mcSprint) && !CanSprint()) mstate_wf &= ~mcSprint; mstate_real &= (~move); mstate_real |= (mstate_wf & move); if(mstate_wf&mcSprint) mstate_real|=mcSprint; else mstate_real&=~mcSprint; if(!(mstate_real&(mcFwd|mcLStrafe|mcRStrafe))||mstate_real&(mcCrouch|mcClimb)|| !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { mstate_real&=~mcSprint; mstate_wishful&=~mcSprint; } // check player move state if(mstate_real&mcAnyMove) { BOOL bAccelerated = isActorAccelerated(mstate_real, IsZoomAimingMode())&&CanAccelerate(); // correct "mstate_real" if opposite keys pressed if (_abs(vControlAccel.z)<EPS) mstate_real &= ~(mcFwd+mcBack ); if (_abs(vControlAccel.x)<EPS) mstate_real &= ~(mcLStrafe+mcRStrafe); // normalize and analyze crouch and run float scale = vControlAccel.magnitude(); if(scale>EPS) { scale = m_fWalkAccel/scale; if (bAccelerated) if (mstate_real&mcBack) scale *= m_fRunBackFactor; else scale *= m_fRunFactor; else if (mstate_real&mcBack) scale *= m_fWalkBackFactor; if (mstate_real&mcCrouch) scale *= m_fCrouchFactor; if (mstate_real&mcClimb) scale *= m_fClimbFactor; if (mstate_real&mcSprint) scale *= m_fSprintFactor; if (mstate_real&(mcLStrafe|mcRStrafe) && !(mstate_real&mcCrouch)) { if (bAccelerated) scale *= m_fRun_StrafeFactor; else scale *= m_fWalk_StrafeFactor; } vControlAccel.mul (scale); cam_eff_factor = scale; }//scale>EPS }//(mstate_real&mcAnyMove) }//peOnGround || peAtWall if(IsGameTypeSingle() && cam_eff_factor>EPS) { LPCSTR state_anm = NULL; if(mstate_real&mcSprint && !(mstate_old&mcSprint) ) state_anm = "sprint"; else if(mstate_real&mcLStrafe && !(mstate_old&mcLStrafe) ) state_anm = "strafe_left"; else if(mstate_real&mcRStrafe && !(mstate_old&mcRStrafe) ) state_anm = "strafe_right"; else if(mstate_real&mcFwd && !(mstate_old&mcFwd) ) state_anm = "move_fwd"; else if(mstate_real&mcBack && !(mstate_old&mcBack) ) state_anm = "move_back"; if(state_anm) { //play moving cam effect CActor* control_entity = static_cast_checked<CActor*>(Level().CurrentControlEntity()); R_ASSERT2 (control_entity, "current control entity is NULL"); CEffectorCam* ec = control_entity->Cameras().GetCamEffector(eCEActorMoving); if(NULL==ec) { string_path eff_name; xr_sprintf (eff_name, sizeof(eff_name), "%s.anm", state_anm); string_path ce_path; string_path anm_name; strconcat (sizeof(anm_name), anm_name, "camera_effects\\actor_move\\", eff_name); if (FS.exist( ce_path, "$game_anims$", anm_name)) { CAnimatorCamLerpEffectorConst* e = xr_new<CAnimatorCamLerpEffectorConst>(); float max_scale = 70.0f; float factor = cam_eff_factor/max_scale; e->SetFactor (factor); e->SetType (eCEActorMoving); e->SetHudAffect (false); e->SetCyclic (false); e->Start (anm_name); control_entity->Cameras().AddCamEffector(e); } } } } //transform local dir to world dir Fmatrix mOrient; mOrient.rotateY (-r_model_yaw); mOrient.transform_dir(vControlAccel); }