本文整理汇总了C++中IPhysicalEntity::GetParams方法的典型用法代码示例。如果您正苦于以下问题:C++ IPhysicalEntity::GetParams方法的具体用法?C++ IPhysicalEntity::GetParams怎么用?C++ IPhysicalEntity::GetParams使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IPhysicalEntity
的用法示例。
在下文中一共展示了IPhysicalEntity::GetParams方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PreProcessMovement
//------------------------------------------------------------------------
void CVehicleMovementHelicopter::PreProcessMovement(const float deltaTime)
{
IPhysicalEntity *pPhysics = GetPhysics();
assert(pPhysics);
float gravity;
pe_simulation_params paramsSim;
if(pPhysics->GetParams(¶msSim))
gravity = abs(paramsSim.gravity.z);
else
gravity = 9.8f;
m_engineForce = gravity * m_enginePower;
const Matrix33 tm(m_PhysPos.q);
const Ang3 angles = Ang3::GetAnglesXYZ(tm);
m_workingUpDir = m_engineUpDir;
//m_workingUpDir += (m_rotorDiskTiltScale * Vec3(m_actionRoll, -m_actionPitch, 0.0f));
m_workingUpDir += (m_rotorDiskTiltScale * Vec3(angles.y, -angles.x, 0.0f));
m_workingUpDir = tm * m_workingUpDir;
m_workingUpDir.NormalizeSafe();
if(m_noHoveringTimer > 0.0f)
m_noHoveringTimer -= deltaTime;
}
示例2: IgnoreCollision
void CBaseGrabHandler::IgnoreCollision(EntityId eID,unsigned int flags,bool ignore)
{
IEntity *pGrab = gEnv->pEntitySystem->GetEntity(eID);
IPhysicalEntity *ppGrab = pGrab ? pGrab->GetPhysics() : NULL;
if(!ppGrab) return;
if(ignore)
{
// NOTE Dez 14, 2006: <pvl> this whole block just fills in
// a request structure and passes it to physics
IEntity *pEnt = m_pActor->GetEntity();
pe_action_add_constraint ac;
ac.flags = constraint_inactive|constraint_ignore_buddy;
ac.pBuddy = pEnt->GetPhysics();
ac.pt[0].Set(0,0,0);
ICharacterInstance *pCharacter = pEnt->GetCharacter(0);
IPhysicalEntity *pPhysEnt = pCharacter?pCharacter->GetISkeletonPose()->GetCharacterPhysics(-1):NULL;
if(pPhysEnt)
{
pe_simulation_params sp;
pPhysEnt->GetParams(&sp);
if(sp.iSimClass <= 2)
ac.pBuddy = pPhysEnt;
}
ppGrab->Action(&ac);
}
else
{
// NOTE Dez 14, 2006: <pvl> the same as the other branch - just
// fill in a request and pass it to the physics engine
pe_action_update_constraint uc;
uc.bRemove = 1;
ppGrab->Action(&uc);
}
// NOTE Dez 14, 2006: <pvl> flag manipulation is basically a legacy
// code - probably not used anymore, scheduled for removal.
if(flags)
{
pe_params_part pp;
pp.flagsAND = pp.flagsColliderAND = ~flags;
pp.flagsOR = pp.flagsColliderOR = flags * (ignore?0:1);
pe_status_nparts status_nparts;
for(pp.ipart = ppGrab->GetStatus(&status_nparts)-1; pp.ipart>=0; pp.ipart--)
ppGrab->SetParams(&pp);
}
}
示例3: IsValid
bool CStickyProjectile::IsValid() const
{
if (!IsStuck())
return false;
if(m_parentId == 0)
return true;
pe_params_part part;
part.partid = m_stuckPartId;
IEntity* pEntity = gEnv->pEntitySystem->GetEntity(m_parentId);
if(pEntity)
{
if (pEntity->IsHidden())
{
return false;
}
if(ICharacterInstance* pCharacter = pEntity->GetCharacter(0))
{
if(ISkeletonPose* pSkel = pCharacter->GetISkeletonPose())
{
IPhysicalEntity* pSkelPhysics = pSkel->GetCharacterPhysics();
if (pSkelPhysics)
{
return pSkelPhysics->GetParams(&part) != 0;
}
}
}
else
{
IPhysicalEntity* pPhysics = pEntity->GetPhysics();
if (pPhysics)
{
return pPhysics->GetParams(&part) != 0;
}
}
}
return false;
}
示例4: OnExit
void CPlayerStateFly::OnExit( CPlayer& player )
{
player.CreateScriptEvent("printhud",0,"FlyMode/NoClip OFF");
pe_player_dynamics simPar;
IPhysicalEntity* piPhysics = player.GetEntity()->GetPhysics();
if (!piPhysics || piPhysics->GetParams(&simPar) == 0)
{
return;
}
CPlayerStateUtil::PhySetNoFly( player, simPar.gravity );
}
示例5: DeathBlow
//-----------------------------------------------------------------------
void CSpectacularKill::DeathBlow(CActor& targetActor)
{
CRY_ASSERT_MESSAGE(m_isBusy, "spectacular kill should be in progress when triggering the death blow");
if (!m_isBusy)
return;
if (targetActor.IsDead())
return;
Vec3 targetDir = targetActor.GetEntity()->GetForwardDir();
{
HitInfo hitInfo;
hitInfo.shooterId = m_pOwner->GetEntityId();
hitInfo.targetId = targetActor.GetEntityId();
hitInfo.damage = 99999.0f; // CERTAIN_DEATH
hitInfo.dir = targetDir;
hitInfo.normal = -hitInfo.dir; // this has to be in an opposite direction from the hitInfo.dir or the hit is ignored as a 'backface' hit
hitInfo.type = CGameRules::EHitType::StealthKill;
g_pGame->GetGameRules()->ClientHit(hitInfo);
}
// WARNING: RagDollize resets the entity's rotation!
// [7/30/2010 davidr] FixMe: If the entity isn't dead here (because is immortal or any other reason) ragdollizing it will
// leave it on an inconsistent state (usually only reproducible on debug scenarios)
targetActor.GetGameObject()->SetAspectProfile(eEA_Physics, eAP_Ragdoll);
// Give a small nudge in the hit direction to make the target fall over
const SSpectacularKillParams* pSpectacularKillParams = GetParamsForClass(targetActor.GetEntity()->GetClass());
CRY_ASSERT(pSpectacularKillParams);
if (pSpectacularKillParams && (pSpectacularKillParams->impulseScale > 0.0f) && (pSpectacularKillParams->impulseBone != -1))
{
const float killDeathBlowVelocity = pSpectacularKillParams->impulseScale; // desired velocity after impulse in meters per second
IPhysicalEntity* pTargetPhysics = targetActor.GetEntity()->GetPhysics();
if (pTargetPhysics)
{
pe_simulation_params simulationParams;
pTargetPhysics->GetParams(&simulationParams);
pe_action_impulse impulse;
impulse.partid = pSpectacularKillParams->impulseBone;
impulse.impulse = targetDir*killDeathBlowVelocity*simulationParams.mass; // RagDollize reset the entity's rotation so I have to use the value I cached earlier
pTargetPhysics->Action(&impulse);
}
}
m_deathBlowState = eDBS_Done;
}
示例6: CameraSync
void CGameRealtimeRemoteUpdateListener::CameraSync()
{
IGame *pGame = gEnv->pGame;
if(!pGame)
return;
IGameFramework *pGameFramework=pGame->GetIGameFramework();
if(!pGameFramework)
return;
IViewSystem *pViewSystem=pGameFramework->GetIViewSystem();
if(!pViewSystem)
return;
IView *pView=pViewSystem->GetActiveView();
if(!pView)
return;
IEntity *pEntity = gEnv->pEntitySystem->GetEntity(pView->GetLinkedId());
if(!pEntity)
return;
IActor *pPlayer=pGameFramework->GetClientActor();
if ( !pPlayer )
return;
IEntity * pPlayerEntity = pPlayer->GetEntity();
if (!pPlayerEntity)
return;
IPhysicalEntity * piPlayerPhysics = pPlayerEntity->GetPhysics();
if ( !piPlayerPhysics )
return;
pe_player_dimensions dim;
piPlayerPhysics->GetParams( &dim );
//TODO: only GDCE2011, in the future make this game magic constant be gone in LiveCreate 2.0
// game player view code has a complex position code path, the sync position should be
// honoured by game code when live creaate camera sync is enabled
m_Position.z -= 1.62f;
pEntity->SetPos(m_Position);
pPlayerEntity->Hide(false);
pViewSystem->SetOverrideCameraRotation(true,Quat::CreateRotationVDir(m_ViewDirection));
pPlayerEntity->Hide(true);
SEntityUpdateContext ctx;
pPlayer->Update( ctx, 0 );
m_bCameraSync = true;
}
示例7: RayTraceGeometry
bool CCannonBall::RayTraceGeometry( const EventPhysCollision* pCollision, const Vec3& pos, const Vec3& hitDirection, SBackHitInfo* pBackHitInfo )
{
FUNCTION_PROFILER(GetISystem(), PROFILE_GAME);
bool exitPointFound = false;
IPhysicalEntity* pCollider = pCollision->pEntity[1];
assert(pCollider);
pe_params_part partParams;
partParams.partid = pCollision->partid[1];
pe_status_pos posStatus;
if (pCollider->GetParams(&partParams) && pCollider->GetStatus(&posStatus))
{
if (partParams.pPhysGeom && partParams.pPhysGeom->pGeom)
{
geom_world_data geomWorldData;
geomWorldData.R = Matrix33(posStatus.q*partParams.q);
geomWorldData.offset = posStatus.pos + (posStatus.q * partParams.pos);
geomWorldData.scale = posStatus.scale * partParams.scale;
geom_contact *pContacts;
intersection_params intersectionParams;
IGeometry* pRayGeometry = s_pRayWrapper->GetRay(pos, hitDirection);
const Vec3 hitDirectionNormalized = hitDirection.GetNormalized();
{ WriteLockCond lock;
const int contactCount = partParams.pPhysGeom->pGeom->IntersectLocked(pRayGeometry,&geomWorldData,0,&intersectionParams,pContacts,lock);
if (contactCount > 0)
{
float bestDistance = 10.0f;
for (int i = (contactCount-1); (i >= 0) && (pContacts[i].t < bestDistance) && ((pContacts[i].n*hitDirectionNormalized) < 0); i--)
{
bestDistance = (float)pContacts[i].t;
pBackHitInfo->pt = pContacts[i].pt;
exitPointFound = true;
}
}
} // lock
}
}
s_pRayWrapper->ResetRay();
return exitPointFound;
}
示例8: DebugUpdate
void CIntersectionAssistanceUnit::DebugUpdate() const
{
if(g_pGameCVars->pl_pickAndThrow.intersectionAssistDebugEnabled)
{
IEntity* pEntity = gEnv->pEntitySystem->GetEntity(m_subjectEntityId);
if(pEntity)
{
IPhysicalEntity *pPhysical = pEntity->GetPhysics();
if(pPhysical)
{
const float fFontSize = 1.2f;
float drawColor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
string sMsg(string().Format(" Entity ID: [%d]", m_subjectEntityId));
sMsg += string().Format("\n Entity Name: [%s]", pEntity->GetName());
sMsg += string().Format("\n EmbedTimer: [%.3f]", m_embedTimer);
sMsg += string().Format("\n EmbedState: [%s]",(m_embedState == eES_None) ? "NONE" : (m_embedState == eES_Evaluating) ? "EVALUATING" : (m_embedState == eES_ReEvaluating) ? "REEVALUATING" : (m_embedState == eES_NotEmbedded) ? "NOT EMBEDDED" : (m_embedState == eES_Embedded) ? "EMBEDDED" : "UNKNOWN");
Vec3 vCurrTrans = m_entityStartingWPos - pEntity->GetWorldPos();
sMsg += string().Format("\n Translation: < %.3f, %.3f, %.3f >", vCurrTrans.x, vCurrTrans.y, vCurrTrans.z );
sMsg += string().Format("\n Trans magnitude: < %.3f >", vCurrTrans.GetLength() );
sMsg += string().Format("\n Trans per sec: < %.3f >", vCurrTrans.GetLength() / g_pGameCVars->pl_pickAndThrow.intersectionAssistTimePeriod );
sMsg += string().Format("\n Collision count: %u", m_collisionCount );
// RENDER
Vec3 vDrawPos = pEntity->GetWorldPos() + Vec3(0.0f,0.0f,0.6f);
gEnv->pRenderer->DrawLabelEx(vDrawPos, fFontSize, drawColor, true, true, sMsg.c_str());
// Box
pe_params_bbox bbox;
if(pPhysical->GetParams(&bbox))
{
ColorB colDefault = ColorB( 127,127,127 );
ColorB embedded = ColorB(255, 0, 0);
ColorB notEmbedded = ColorB(0, 255, 0);
gEnv->pRenderer->GetIRenderAuxGeom()->DrawAABB( AABB(bbox.BBox[0],bbox.BBox[1]), Matrix34(IDENTITY), false, (m_embedState == eES_Embedded) ? embedded : (m_embedState == eES_NotEmbedded) ? notEmbedded : colDefault, eBBD_Faceted);
}
}
}
}
}
示例9: Update
//------------------------------------------------------------------------
void CVehicleActionEntityAttachment::Update(const float deltaTime)
{
if(m_isAttached)
return;
IEntitySystem *pEntitySystem = gEnv->pEntitySystem;
assert(pEntitySystem);
IEntity *pEntity = pEntitySystem->GetEntity(m_entityId);
if(!pEntity)
return;
IPhysicalEntity *pPhysEntity = pEntity->GetPhysics();
if(!pPhysEntity)
return;
pe_simulation_params paramsSim;
float gravity;
if(pPhysEntity->GetParams(¶msSim))
gravity = abs(paramsSim.gravity.z);
else
gravity = 9.82f;
pe_status_dynamics dyn;
if(pPhysEntity->GetStatus(&dyn))
{
pe_action_impulse impulse;
impulse.impulse = Matrix33(pEntity->GetWorldTM()) * Vec3(0.0f, 0.0f, 1.0f) * g_parachuteForce * gravity;
impulse.impulse = impulse.impulse - dyn.v;
impulse.impulse *= dyn.mass * deltaTime;
impulse.iSource = 3;
pPhysEntity->Action(&impulse);
}
m_timer -= deltaTime;
if(m_timer <= 0.0f || dyn.v.z >= 0.0f)
m_pVehicle->SetObjectUpdate(this, IVehicle::eVOU_NoUpdate);
}
示例10: OnEnter
void CPlayerStateSwim::OnEnter( CPlayer& player )
{
player.m_playerStateSwim_WaterTestProxy.OnEnterWater(player);
IPhysicalEntity* pPhysEnt = player.GetEntity()->GetPhysics();
if (pPhysEnt != NULL)
{
// get current gravity before setting to zero.
pe_player_dynamics simPar;
if( pPhysEnt->GetParams(&simPar) != 0 )
{
m_gravity = simPar.gravity;
}
CPlayerStateUtil::PhySetFly( player );
}
m_lastWaterLevel = player.m_playerStateSwim_WaterTestProxy.GetWaterLevel();
m_lastWaterLevelTime = player.m_playerStateSwim_WaterTestProxy.GetWaterLevelTimeUpdated();
player.m_stats.inAir = 0.0f;
if (player.IsClient())
{
ICameraMode::AnimationSettings animationSettings;
animationSettings.positionFactor = 1.0f;
animationSettings.rotationFactor = GetSwimParams().m_stateSwim_animCameraFactor;
player.GetPlayerCamera()->SetCameraModeWithAnimationBlendFactors( eCameraMode_PartialAnimationControlled, animationSettings, "Entering swim state" );
player.SendMusicLogicEvent(eMUSICLOGICEVENT_PLAYER_SWIM_ENTER);
if (!player.IsCinematicFlagActive(SPlayerStats::eCinematicFlag_HolsterWeapon))
player.HolsterItem(true);
if (gEnv->bMultiplayer) // any left hand holding in SP?
{
player.HideLeftHandObject(true);
}
}
// Record 'Swim' telemetry stats.
CStatsRecordingMgr::TryTrackEvent(&player, eGSE_Swim, true);
}
示例11: OnEnter
void CPlayerStateFly::OnEnter( CPlayer& player )
{
pe_player_dynamics simPar;
IPhysicalEntity* piPhysics = player.GetEntity()->GetPhysics();
if (!piPhysics || piPhysics->GetParams(&simPar) == 0)
{
return;
}
player.m_actorPhysics.velocity = player.m_actorPhysics.velocityUnconstrained.Set(0,0,0);
player.m_actorPhysics.speed = player.m_stats.speedFlat = 0.0f;
player.m_actorPhysics.groundMaterialIdx = -1;
player.m_actorPhysics.gravity = simPar.gravity;
player.m_stats.fallSpeed = 0.0f;
player.m_stats.inFiring = 0;
CPlayerStateUtil::PhySetFly( player );
}
示例12: FlagSkeleton
//------------------------------------------------------------------------
void CVehiclePartAnimated::FlagSkeleton(ISkeletonPose* pSkeletonPose,IDefaultSkeleton &rIDefaultSkeleton)
{
if (!pSkeletonPose)
return;
IPhysicalEntity* pPhysics = GetEntity()->GetPhysics();
if (!pPhysics)
return;
string name;
int idWater = rIDefaultSkeleton.GetJointIDByName("proxy_water");
uint32 buoyancyParts = (idWater != -1) ? 1 : 0;
uint32 jointCount = rIDefaultSkeleton.GetJointCount();
for (uint32 i = 0; i < jointCount; ++i)
{
int physId = pSkeletonPose->GetPhysIdOnJoint(i);
if (physId >= 0)
{
CheckColltypeHeavy(physId);
name = rIDefaultSkeleton.GetJointNameByID(i);
// when water proxy available, remove float from all others
// if no water proxy, we leave only "proxy" parts floating
if (idWater != -1)
{
if (i == idWater)
{
SetFlags(physId, geom_collides, false);
SetFlagsCollider(physId, 0);
}
else
SetFlags(physId, geom_floats, false);
}
else
{
if (name.find("proxy") != string::npos)
++buoyancyParts;
else
SetFlags(physId, geom_floats, false);
}
// all objects which have a corresponding *_proxy on the skeleton
// are set to ray collision only
if (name.find("_proxy") == string::npos)
{
name.append("_proxy");
int proxyId = rIDefaultSkeleton.GetJointIDByName(name.c_str());
if (proxyId != -1)
{
// remove ray collision from hull proxy(s)
SetFlags(pSkeletonPose->GetPhysIdOnJoint(proxyId), geom_colltype_ray | geom_colltype13, false);
// get StatObj from main part, to connect proxies foreignData with it
IStatObj* pStatObj = pSkeletonPose->GetStatObjOnJoint(i);
if (pStatObj)
{
pe_params_part params;
params.partid = proxyId;
if (pPhysics->GetParams(¶ms))
{
if (params.pPhysGeom && params.pPhysGeom->pGeom)
params.pPhysGeom->pGeom->SetForeignData(pStatObj, 0);
}
}
for (int p = 2; p < 6; ++p)
{
// check additional proxies, by naming convention _02, .. _05
char buf[64];
cry_sprintf(buf, "%s_%02i", name.c_str(), p);
proxyId = rIDefaultSkeleton.GetJointIDByName(buf);
if (proxyId == -1)
break;
int proxyPhysId = pSkeletonPose->GetPhysIdOnJoint(proxyId);
if (proxyPhysId == -1)
continue;
SetFlags(proxyPhysId, geom_colltype_ray | geom_colltype13, false);
// connect proxies to main StatObj (needed for bullet tests, decals)
if (pStatObj)
{
pe_params_part params;
params.partid = proxyPhysId;
if (pPhysics->GetParams(¶ms))
{
if (params.pPhysGeom && params.pPhysGeom->pGeom)
params.pPhysGeom->pGeom->SetForeignData(pStatObj, 0);
}
}
}
// set ray-collision only on the part
//.........这里部分代码省略.........
示例13: DamagePlayers
void CVehicleDamageBehaviorBlowTire::DamagePlayers()
{
// check for the nasty case when the player is shooting at the vehicle tires while prone
// under or behind the car, In that case the player should get killed by the vehicle,
// otherwise he gets stuck forever. Note that he should only get killed when the tier
// is actually destroyed and not by collision resulting by the impulse added by just
// shooting at the tiers. Unfortunately using physics for doing this check is not reliable
// enough so we have to check it explicitly
IEntityPhysicalProxy *pPhysicsProxy = (IEntityPhysicalProxy*)m_pVehicle->GetEntity()->GetProxy(ENTITY_PROXY_PHYSICS);
if (!pPhysicsProxy)
return;
AABB bbox;
pPhysicsProxy->GetWorldBounds( bbox );
IPhysicalWorld *pWorld = gEnv->pSystem->GetIPhysicalWorld();
IPhysicalEntity **ppColliders;
// check entities in collision with the car
int cnt = pWorld->GetEntitiesInBox( bbox.min,bbox.max, ppColliders,ent_living);
for (int i = 0; i < cnt; i++)
{
IEntity *pEntity = gEnv->pEntitySystem->GetEntityFromPhysics( ppColliders[i] );
if (!pEntity)
continue;
// skip the vehicle itself
if (pEntity==m_pVehicle->GetEntity())
continue;
IPhysicalEntity *pPhysEnt = pEntity->GetPhysics();
if (!pPhysEnt)
continue;
IActor* pActor = gEnv->pGame->GetIGameFramework()->GetIActorSystem()->GetActor(pEntity->GetId());
if(!pActor)
continue;
//Jan M.: the player is killed when he entered the vehicle while prone although he is still passenger!
if(m_pVehicle == pActor->GetLinkedVehicle())
continue;
//the player must be prone under the vehicle
IAnimatedCharacter * animatedCharacter=pActor->GetAnimatedCharacter();
if (!animatedCharacter)
continue;
int stance = animatedCharacter->GetCurrentStance();
if (stance!=STANCE_PRONE)
continue;
pe_player_dimensions dim;
if (!pPhysEnt->GetParams(&dim))
continue;
// position returned is at entity's feet, add head position from physics
Vec3 vPos1=pEntity->GetPos();
vPos1.z = vPos1.z + dim.heightHead;
float fZ=bbox.GetCenter().z;
if (vPos1.z>fZ)
continue; // not under the vehicle
// at this point we have a collision with the car moving down and the guy prone under the car, it is safe
// to assume he has been squished so let's kill him.
if (gEnv->bServer && pActor->GetHealth()>0)
{
// adding a server hit to make it working in MP
IGameRules *pGameRules = gEnv->pGame->GetIGameFramework()->GetIGameRulesSystem()->GetCurrentGameRules();
if (pGameRules)
{
HitInfo hit;
EntityId shooterId=m_pVehicle->GetEntityId();
if (m_pVehicle->GetDriver())
shooterId=m_pVehicle->GetDriver()->GetEntityId();
hit.targetId = pEntity->GetId();
hit.shooterId = shooterId;
hit.weaponId = m_pVehicle->GetEntityId();
hit.damage = 1000.f;
hit.type = 0;
hit.pos = pActor->GetEntity()->GetWorldPos();
pGameRules->ServerHit(hit);
}
}
} //i
}
示例14: GetCloseColliderParts
//------------------------------------------------------------------------
int CScriptBind_Actor::GetCloseColliderParts(IFunctionHandler *pH, int characterSlot, Vec3 hitPos, float radius)
{
// find nearest physic. parts to explosion center
// for now we just return the closest part (using the AABB)
CActor *pActor = GetActor(pH);
if (!pActor)
return pH->EndFunction();
IEntity* pEntity = pActor->GetEntity();
ICharacterInstance* pChar = pEntity->GetCharacter(characterSlot);
if (pChar && pChar->GetISkeletonPose()->GetCharacterPhysics())
{
IPhysicalEntity* pPhysics = pChar->GetISkeletonPose()->GetCharacterPhysics();
pe_status_nparts nparts;
int numParts = pPhysics->GetStatus(&nparts);
float minLenSq = radius*radius + 0.1f;
int minLenPart = -1;
pe_status_pos status;
for (int i=0; i<numParts; ++i)
{
status.ipart = i;
if (pPhysics->GetStatus(&status))
{
AABB box(status.pos+status.BBox[0], status.pos+status.BBox[1]);
// if hitpos inside AABB, return
if (box.IsContainPoint(hitPos))
{
minLenPart = i;
break;
}
// else find closest distance
float lenSq = Distance::Point_AABBSq(hitPos, box);
if (lenSq < minLenSq)
{
minLenSq = lenSq;
minLenPart = i;
}
}
}
// get material from selected part
static ISurfaceTypeManager* pSurfaceMan = gEnv->p3DEngine->GetMaterialManager()->GetSurfaceTypeManager();
if (minLenPart != -1)
{
pe_params_part params;
params.ipart = minLenPart;
if (pPhysics->GetParams(¶ms))
{
phys_geometry* pGeom = params.pPhysGeomProxy ? params.pPhysGeomProxy : params.pPhysGeom;
if (pGeom->surface_idx > 0 && pGeom->surface_idx < params.nMats)
{
if (ISurfaceType *pSurfaceType=pSurfaceMan->GetSurfaceType(pGeom->pMatMapping[pGeom->surface_idx]))
return pH->EndFunction(params.partid, pSurfaceType->GetName(), pSurfaceType->GetType());
}
}
return pH->EndFunction(params.partid);
}
}
return pH->EndFunction();
}
示例15: UpdatePlayerPhysicsStats
void CPlayerStateUtil::UpdatePlayerPhysicsStats( CPlayer& player, SActorPhysics& actorPhysics, float frameTime )
{
const int currentFrameID = gEnv->pRenderer->GetFrameID();
if( actorPhysics.lastFrameUpdate < currentFrameID )
{
pe_status_living livStat;
if( !CPlayerStateUtil::GetPhysicsLivingStat( player, &livStat ) )
{
return;
}
SPlayerStats& stats = *player.GetActorStats();
const Vec3 newVelocity = livStat.vel-livStat.velGround;
actorPhysics.velocityDelta = newVelocity - actorPhysics.velocity;
actorPhysics.velocity = newVelocity;
actorPhysics.velocityUnconstrainedLast = actorPhysics.velocityUnconstrained;
actorPhysics.velocityUnconstrained = livStat.velUnconstrained;
actorPhysics.flags.SetFlags( SActorPhysics::EActorPhysicsFlags_WasFlying, actorPhysics.flags.AreAnyFlagsActive(SActorPhysics::EActorPhysicsFlags_Flying) );
actorPhysics.flags.SetFlags( SActorPhysics::EActorPhysicsFlags_Flying, livStat.bFlying > 0 );
actorPhysics.flags.SetFlags( SActorPhysics::EActorPhysicsFlags_Stuck, livStat.bStuck > 0 );
Vec3 flatVel(player.m_pPlayerRotation->GetBaseQuat().GetInverted()*newVelocity);
flatVel.z = 0;
stats.speedFlat = flatVel.len();
if(player.IsInAir())
{
stats.maxAirSpeed = max(stats.maxAirSpeed, newVelocity.GetLengthFast());
}
else
{
stats.maxAirSpeed = 0.f;
}
float fSpeedFlatSelector = stats.speedFlat - 0.1f;
const float groundNormalBlend = clamp(frameTime * 6.666f, 0.0f, 1.0f);
actorPhysics.groundNormal = LERP(actorPhysics.groundNormal, livStat.groundSlope, groundNormalBlend);
if (livStat.groundSurfaceIdxAux > 0)
actorPhysics.groundMaterialIdx = livStat.groundSurfaceIdxAux;
else
actorPhysics.groundMaterialIdx = livStat.groundSurfaceIdx;
actorPhysics.groundHeight = livStat.groundHeight;
EntityId newGroundColliderId = 0;
if (livStat.pGroundCollider)
{
IEntity* pEntity = gEnv->pEntitySystem->GetEntityFromPhysics(livStat.pGroundCollider);
newGroundColliderId = pEntity ? pEntity->GetId() : 0;
}
if( newGroundColliderId != actorPhysics.groundColliderId )
{
if( actorPhysics.groundColliderId )
{
if( IGameObject* pGameObject = gEnv->pGame->GetIGameFramework()->GetGameObject( actorPhysics.groundColliderId ) )
{
SGameObjectEvent event( eGFE_StoodOnChange, eGOEF_ToExtensions );
event.ptr = &player;
event.paramAsBool = false;
pGameObject->SendEvent(event);
}
}
if( newGroundColliderId )
{
if( IGameObject* pGameObject = gEnv->pGame->GetIGameFramework()->GetGameObject( newGroundColliderId ) )
{
SGameObjectEvent event( eGFE_StoodOnChange, eGOEF_ToExtensions );
event.ptr = &player;
event.paramAsBool = true;
pGameObject->SendEvent(event);
}
}
actorPhysics.groundColliderId = newGroundColliderId;
}
IPhysicalEntity *pPhysEnt = player.GetEntity()->GetPhysics();
if( pPhysEnt )
{
pe_status_dynamics dynStat;
pPhysEnt->GetStatus(&dynStat);
actorPhysics.angVelocity = dynStat.w;
actorPhysics.mass = dynStat.mass;
pe_player_dynamics simPar;
if (pPhysEnt->GetParams(&simPar) != 0)
{
actorPhysics.gravity = simPar.gravity;
}
}
actorPhysics.lastFrameUpdate = currentFrameID;
#ifdef PLAYER_MOVEMENT_DEBUG_ENABLED
//.........这里部分代码省略.........