Exemplo n.º 1
0
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];
}
Exemplo n.º 2
0
// Integrate forces into positions using RK4 step
int LinearBody::RK4Step()
{
	
	// Recalculate all forces
	double realTimestep = timestep;
	timestep /= 2;
	UpdateForces();

	// Check if dead
	if (DeathCheck())
		return 1;

	// Apply RK4 Step using new forces
	for (ALLNODES_i) {
		
	}
	
	return 0;
}
Exemplo n.º 3
0
// Integrate forces into positions using a simple euler step.
// You should really keep the timestep <0.01 for this type of integration.
int LinearBody::EulerStep()
{
	// Recalculate all forces
	UpdateForces();

	// Check if we're dead. Return with error if already dead.
	if (DeathCheck())
		return 1;

	// Apply simple euler step using new forces
	for (ALLNODES_i) {
		// update velocity    a = F / m
		nodes[i].v.x += (nodes[i].a.x)*timestep;
		nodes[i].v.y += (nodes[i].a.y)*timestep;
		// update posiiton
		nodes[i].p.x += (nodes[i].v.x)*timestep;
		nodes[i].p.y += (nodes[i].v.y)*timestep;
	}

	return 0;
}
Exemplo n.º 4
0
void Physics::Update() {
	UpdateForces();
	UpdateVerlet();
	IterateCollisions();
}
Exemplo n.º 5
0
void CW::PhysicsEngine::Update(void)
{
	UpdateForces();
	UpdateVerlet();
	Iterate();
}