//------------------------------------------------------------------------- int CScriptBind_Action::Persistant2DText(IFunctionHandler* pH, const char* text, float size, Vec3 color, const char* name, float timeout) { IPersistantDebug* pPD = CCryAction::GetCryAction()->GetIPersistantDebug(); pPD->Begin(name, false); pPD->Add2DText(text, size, ColorF(color, 1.f), timeout); return pH->EndFunction(); }
//------------------------------------------------------------------------ float CGameRulesCommonDamageHandling::GetCollisionEnergy( const IEntity *pVictim, const CGameRules::SCollisionHitInfo& colHitInfo ) const { float m1 = colHitInfo.target_mass; float m0 = 0.f; IPhysicalEntity *phys = pVictim->GetPhysics(); if(phys) { pe_status_dynamics dyn; phys->GetStatus(&dyn); m0 = dyn.mass; } IEntity *pOffender = gEnv->pEntitySystem->GetEntity(colHitInfo.targetId); bool bCollider = (pOffender || m1 > 0.001f); const bool debugColl = DebugCollisions(); if (debugColl) { CryLog("GetCollisionEnergy %s (%.1f) <-> %s (%.1f)", pVictim?pVictim->GetName():"[no entity]", m0, pOffender?pOffender->GetName():"[no entity]", m1); } float v0Sq = 0.f, v1Sq = 0.f; if (bCollider) // non-static { m0 = min(m0, m1); Vec3 v0normal, v1normal, vrel; Vec3 tempNormal = colHitInfo.normal; float v0dotN = colHitInfo.velocity.dot(colHitInfo.normal); v0normal = tempNormal.scale(v0dotN); float v1dotN = colHitInfo.target_velocity.dot(colHitInfo.normal);; // "target" is the offender v1normal = tempNormal.scale(v1dotN); vrel = v0normal.sub(v1normal); float vrelSq = vrel.len2(); v0Sq = min( sqr(v0dotN), vrelSq ); v1Sq = min( sqr(v1dotN), vrelSq ); if (debugColl) { IPersistantDebug* pPD = g_pGame->GetIGameFramework()->GetIPersistantDebug(); pPD->Begin("CollDamage", false); pPD->AddSphere(colHitInfo.pos, 0.15f, Col_Red, 5.f); pPD->AddDirection(colHitInfo.pos, 1.5f, tempNormal.scale(sgn(v0dotN)), Col_Green, 5.f); pPD->AddDirection(colHitInfo.pos, 1.5f, tempNormal.scale(sgn(v1dotN)), Col_Red, 5.f); if ((v0Sq > 2*2) || (v1Sq > 2*2)) { CryLog("normal velocities: rel %.1f, <%s> %.1f / <%s> %.1f", sqrt(vrelSq), pVictim?pVictim->GetName():"none", v0dotN, pOffender?pOffender->GetName():"none", v1dotN); CryLog("target_type: %i, target_velocity: %.2f %.2f %.2f", colHitInfo.target_type, colHitInfo.target_velocity.x, colHitInfo.target_velocity.y, colHitInfo.target_velocity.z); } } } else { v0Sq = sqr(colHitInfo.velocity.dot(colHitInfo.normal)); if (debugColl && v0Sq>5*5) { IPersistantDebug* pPD = g_pGame->GetIGameFramework()->GetIPersistantDebug(); pPD->Begin("CollDamage", false); pPD->AddDirection(colHitInfo.pos, 1.5f, colHitInfo.normal, Col_Green, 5.f); string debugText; debugText.Format("z: %f", colHitInfo.velocity.z); pPD->Add2DText(debugText.c_str(), 1.5f, Col_White, 5.f); } } float colliderEnergyScale = 1.f; if (pVictim != NULL && pOffender != NULL) { if(IActor* pVictimActor = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(pVictim->GetId())) { colliderEnergyScale = !pVictimActor->IsPlayer() ? GetAIPlayerAgainstColliderEnergyScale(*pOffender) : GetPlayerAgainstColliderEnergyScale(*pOffender); if (debugColl) { CryLog("colliderEnergyScale: %.1f", colliderEnergyScale); } } } const float energy0 = 0.5f * m0 * v0Sq; const float energy1 = 0.5f * m1 * v1Sq * colliderEnergyScale; return energy0 + energy1; }