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 }