| 28 | } |
| 29 | |
| 30 | void CPHShell::ExplosionHit(const Fvector& pos, const Fvector& dir, float val, const u16 id) |
| 31 | { |
| 32 | if (!isActive()) |
| 33 | return; |
| 34 | EnableObject(0); |
| 35 | // Fvector local_pos;local_pos.set(0.f,0.f,0.f); |
| 36 | ELEMENT_I i = elements.begin(), e = elements.end(); |
| 37 | float impulse = val / _sqrt(_sqrt((float)elements.size())); |
| 38 | for (; i != e; i++) |
| 39 | { |
| 40 | // Fvector max_area_dir; |
| 41 | CPHElement* element = (*i); |
| 42 | // element->get_MaxAreaDir(max_area_dir); |
| 43 | // float sign=max_area_dir.dotproduct(dir)>0.f ? 1.f : -1.f; |
| 44 | // max_area_dir.mul(sign); |
| 45 | u16 gn = element->CPHGeometryOwner::numberOfGeoms(); |
| 46 | float g_impulse = impulse / gn; |
| 47 | for (u16 j = 0; j < gn; ++j) |
| 48 | { |
| 49 | Fvector r_dir, r_pos, r_box; |
| 50 | float rad = element->getRadius(); |
| 51 | r_box.set(rad, rad, rad); |
| 52 | r_pos.random_point(r_box); |
| 53 | r_dir.random_dir(); |
| 54 | if (!fis_zero(pos.magnitude(), EPS_L)) |
| 55 | { |
| 56 | r_dir.mul(0.5f); |
| 57 | r_dir.add(dir); |
| 58 | } |
| 59 | |
| 60 | r_dir.normalize_safe(); // safe??? |
| 61 | element->applyImpulseTrace(r_pos, r_dir, g_impulse, element->CPHGeometryOwner::Geom(j)->bone_id()); |
| 62 | } |
| 63 | } |
| 64 | } |
nothing calls this directly
no test coverage detected