| 62 | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 63 | |
| 64 | DamageToolController::DamageToolController() |
| 65 | : m_damage(100.0f), m_toolColor(1.0f, 1.0f, 1.0f, 0.4f), |
| 66 | m_toolRenderMaterial(nullptr), m_sphereToolRenderable(nullptr), m_lineToolRenderable(nullptr), |
| 67 | m_explosiveImpulse(100), m_damagerIndex(0), m_stressForceFactor(1.0f), m_isMousePressed(false), m_damageCountWhilePressed(0) |
| 68 | { |
| 69 | // damage amount calc using NvBlastExtMaterial |
| 70 | auto getDamageAmountFn = [](const float damage, ExtPxActor* actor) |
| 71 | { |
| 72 | const NvBlastExtMaterial* material = actor->getFamily().getMaterial(); |
| 73 | return material ? material->getNormalizedDamage(damage) : 0.f; |
| 74 | }; |
| 75 | |
| 76 | // Damage functions |
| 77 | auto radialDamageExecute = [&](const Damager* damager, ExtPxActor* actor, BlastFamily& family, const Damager::DamageData& data) |
| 78 | { |
| 79 | const float damage = getDamageAmountFn(m_damage, actor); |
| 80 | if (damage > 0.f) |
| 81 | { |
| 82 | NvBlastExtRadialDamageDesc desc = |
| 83 | { |
| 84 | damage, |
| 85 | { data.hitPosition.x, data.hitPosition.y, data.hitPosition.z }, |
| 86 | damager->radius, |
| 87 | damager->radius * 1.6f |
| 88 | }; |
| 89 | |
| 90 | getBlastController().deferDamage(actor, family, damager->program, &desc, sizeof(desc)); |
| 91 | } |
| 92 | }; |
| 93 | auto sliceDamageExecute = [&](const Damager* damager, ExtPxActor* actor, BlastFamily& family, const Damager::DamageData& data) |
| 94 | { |
| 95 | const float damage = getDamageAmountFn(m_damage, actor); |
| 96 | if (damage > 0.f) |
| 97 | { |
| 98 | PxVec3 farEnd = data.origin + data.weaponDir * 1000.0f; |
| 99 | PxVec3 farEndPrev = data.origin + data.previousWeaponDir * 1000.0f; |
| 100 | |
| 101 | NvBlastExtTriangleIntersectionDamageDesc desc = |
| 102 | { |
| 103 | damage, |
| 104 | { data.origin.x, data.origin.y, data.origin.z }, |
| 105 | { farEnd.x, farEnd.y, farEnd.z }, |
| 106 | { farEndPrev.x, farEndPrev.y, farEndPrev.z }, |
| 107 | }; |
| 108 | |
| 109 | getBlastController().deferDamage(actor, family, damager->program, &desc, sizeof(desc)); |
| 110 | } |
| 111 | }; |
| 112 | auto capsuleDamageExecute = [&](const Damager* damager, ExtPxActor* actor, BlastFamily& family, const Damager::DamageData& data) |
| 113 | { |
| 114 | const float damage = getDamageAmountFn(m_damage, actor); |
| 115 | if (damage > 0.f) |
| 116 | { |
| 117 | PxVec3 dir = (data.hitPosition - data.origin).getNormalized(); |
| 118 | PxVec3 farEnd = data.origin + dir * 10000.0f; |
| 119 | |
| 120 | NvBlastExtCapsuleRadialDamageDesc desc = |
| 121 | { |
nothing calls this directly
no test coverage detected