static void ulRealntoString( int parcnt, genpar *pars, void *d0, void *d1, mapevalenviron* mapenv, evalcontext* ecntxt ) { comndtyp com; std::string comstr; addvaltostring( comstr, pars, NULL ); com = newcom( (char*)comstr.c_str(), ecntxt ); ecntxt->stacks->pushand( ULcom, &com ); }
void Physics::OnUpdate(IBehavior* invokingBehavior, IMessage* message) { Physics* pPhysics = (Physics*)invokingBehavior; const Aabb& objLocalAabb = pPhysics->gameObject->GetLocalAabb(); for(unsigned int i = 0; i < 3; ++i) { if( pPhysics->localAabb.min.v[i] != objLocalAabb.min.v[i] || pPhysics->localAabb.max.v[i] != objLocalAabb.max.v[i] ) { pPhysics->Initialize(); return; } } if( pPhysics->physicsFlags & GRAVITY ) { Attribute<bool>* groundedAttrib = (Attribute<bool>*)pPhysics->GetAttribute( PhysicsAttributes::GROUNDED_ATTRIB); if( groundedAttrib->value == false ) pPhysics->ApplyGravity(); } Float3 com(0.0f, 0.0f, 0.0f); for(unsigned int i = 0; i < pPhysics->m_X.size(); ++i) com += pPhysics->m_X[i]; com *= (1.0f / pPhysics->m_X.size()); pPhysics->ApplyVerlet(); pPhysics->ApplyConstraints(); Float3 newcom(0.0f, 0.0f, 0.0f); for(unsigned int i = 0; i < pPhysics->m_X.size(); ++i) newcom += pPhysics->m_X[i]; newcom *= (1.0f / pPhysics->m_X.size()); Float3 delta = newcom - com; if( delta.magnitude() > 0.25f ) { delta.normalize(); delta *= 0.25f; } pPhysics->gameObject->TranslateGlobal( delta ); }