void Update(Scene* scene, float dt) { Particle* particles = &scene->mParticles[0]; Triangle* triangles = &scene->mTriangles[0]; Element* elements = &scene->mElements[0]; const Vec3* planes = &scene->mPlanes[0]; uint32_t numParticles = NumParticles(scene); uint32_t numTriangles = NumTriangles(scene); uint32_t numPlanes = scene->mPlanes.size(); SceneParams params = scene->mParams; FractureEvent* fractures = &scene->mFractures[0]; uint32_t maxFractures = scene->mFractures.size(); uint32_t numFractures = UpdateForces(particles, numParticles, triangles, elements, numTriangles, params.mGravity, params.mLameLambda, params.mLameMu, params.mDamping, params.mDrag, dt, fractures, maxFractures, params.mToughness, params.mYield, params.mCreep); CollidePlanes(particles, numParticles, planes, numPlanes, params.mFriction); IntegrateForces(particles, numParticles, dt); //if (numFractures) // cout << "numFractures: " << numFractures << endl; // todo. ugh figure out a better way to manage this scene->mParticles.resize(2*numParticles); particles = &scene->mParticles[0]; /* glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_LINES); for (size_t i=0; i < numFractures; ++i) { Vec2 p = Vec2(fractures[i].mPlane)*-fractures[i].mPlane.z; Vec2 n = PerpCCW(Vec2(fractures[i].mPlane)); glVertex2fv(p+n*100.0f); glVertex2fv(p-n*100.0f); glVertex2fv(p); glVertex2fv(p + Vec2(fractures[i].mPlane)); } glEnd(); */ if (params.mToughness > 0.0f) { numParticles = Fracture(particles, numParticles, triangles, numTriangles, fractures, numFractures); numParticles = SeparateSingular(particles, numParticles, triangles, numTriangles); } scene->mParticles.resize(numParticles); particles = &scene->mParticles[0]; }
void PhysicsN::IntegrateVelocity( Body2D *b, real dt ) { if(b->im == 0.0f) return; b->position += b->velocity * dt; b->orient += b->angularVelocity * dt; b->SetOrient( b->orient ); IntegrateForces( b, dt ); }
void Body::IntegrateVelocity(float delta) { if(m_inverseMass == 0.0f) { return; } m_position += m_velocity*delta; m_orientation += m_angularVelocity*delta; m_shape->SetOrientation(m_orientation); IntegrateForces(delta); }
void PhysicsN::Step( void ) { // Generate new collision info contacts.clear( ); for(uint32 i = 0; i < bodies.size( ); ++i) { Body2D *A = bodies[i]; for(uint32 j = i + 1; j < bodies.size( ); ++j) { Body2D *B = bodies[j]; if(A->im == 0 && B->im == 0) continue; Manifold m( A, B ); m.Solve( ); if(m.contact_count) contacts.emplace_back( m ); } } // Integrate forces for(uint32 i = 0; i < bodies.size( ); ++i) IntegrateForces( bodies[i], m_dt ); // Initialize collision for(uint32 i = 0; i < contacts.size( ); ++i) contacts[i].Initialize( ); // Solve collisions for(uint32 j = 0; j < m_iterations; ++j) for(uint32 i = 0; i < contacts.size( ); ++i) contacts[i].ApplyImpulse( ); // Integrate velocities for(uint32 i = 0; i < bodies.size( ); ++i) IntegrateVelocity( bodies[i], m_dt ); // Correct positions for(uint32 i = 0; i < contacts.size( ); ++i) contacts[i].PositionalCorrection( ); // Clear all forces for(uint32 i = 0; i < bodies.size( ); ++i) { Body2D *b = bodies[i]; b->force = Vec2( 0, 0 ); b->torque = 0; } }
void IntegrateVelocity(RigidBody2D *b, float dt) { if (b->im == 0.0f) return; b->position += b->velocity * dt; b->orient += b->angularVelocity * dt; b->SetOrient(b->orient); if (b->gameObject != nullptr) { b->gameObject->transform->position = Vector3(b->position.x, b->position.y, b->gameObject->transform->position.z); b->gameObject->transform->Rotate(b->angularVelocity * dt); } IntegrateForces(b, dt); }