MCPcopy Create free account
hub / github.com/OGSR/OGSR-Engine / keep

Method keep

ogsr_engine/xrGame/TeleWhirlwind.cpp:272–317  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

270}
271
272void CTeleWhirlwindObject::keep()
273{
274 CPhysicsShell* p = get_object()->PPhysicsShell();
275 if (!p || !p->isActive())
276 return;
277 else
278 {
279 p->SetAirResistance(0.f, 0.f);
280 p->set_ApplyByGravity(FALSE);
281 }
282
283 u16 element_number = p->get_ElementsNumber();
284 Fvector center = m_telekinesis->Center();
285
286 CPhysicsElement* maxE = p->get_ElementByStoreOrder(0);
287 for (u16 element = 0; element < element_number; ++element)
288 {
289 CPhysicsElement* E = p->get_ElementByStoreOrder(element);
290 if (maxE->getMass() < E->getMass())
291 maxE = E;
292 Fvector dir;
293 dir.sub(center, E->mass_Center());
294 dir.normalize_safe();
295 Fvector vel;
296 E->get_LinearVel(vel);
297 float force = dir.dotproduct(vel) * E->getMass() / 2.f;
298 if (force < 0.f)
299 {
300 dir.mul(force);
301 }
302 }
303
304 maxE->setTorque(Fvector().set(0, 500.f, 0));
305
306 Fvector dist;
307 dist.sub(center, maxE->mass_Center());
308 if (dist.magnitude() > m_telekinesis->keep_radius() * 1.5f)
309 {
310 p->setTorque(Fvector().set(0, 0, 0));
311 p->setForce(Fvector().set(0, 0, 0));
312 p->set_LinearVel(Fvector().set(0, 0, 0));
313 p->set_AngularVel(Fvector().set(0, 0, 0));
314 p->set_ApplyByGravity(TRUE);
315 switch_state(TS_Raise);
316 }
317}
318void CTeleWhirlwindObject::fire(const Fvector& target)
319{
320 // inherited::fire(target);

Callers

nothing calls this directly

Calls 15

get_objectFunction · 0.85
get_ElementsNumberMethod · 0.80
keep_radiusMethod · 0.80
isActiveMethod · 0.45
SetAirResistanceMethod · 0.45
set_ApplyByGravityMethod · 0.45
CenterMethod · 0.45
getMassMethod · 0.45
subMethod · 0.45
normalize_safeMethod · 0.45
get_LinearVelMethod · 0.45

Tested by

no test coverage detected