Example #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];
}
void FDestructibleMeshEditorViewportClient::RefreshFromStaticMesh()
{
#if WITH_APEX
	UDestructibleMesh* DestructibleMesh = DestructibleMeshEditorPtr.Pin()->GetDestructibleMesh();
	
	DestructibleMesh->BuildFromStaticMesh(*DestructibleMesh->SourceStaticMesh);
	Fracture();
#endif // WITH_APEX
}