I'm going to go ahead and answer this with the procedural approach. I'll assume you have a workable knowledge of linear algebra. I am going to hash over this quite quickly so feel free to ask me to expand on any point of the answer.
Consider this overhead:
- Storing each model in memory (and disk) using a vertex buffer (or whatever your graphical platform uses).
- Having to render this buffer each frame; this includes swapping buffers in and out of GPU memory.
This isn't too different from this:
- Having to determine the 'broken' parts of the mesh (this can be pre-calculated during your build).
- Having to fill a buffer each frame (set up with discard-on-write).
- Having to render this single buffer each frame.
I would strongly recommend at least experimenting with a procedural approach to this.
Essentially what you need to do is find the normal of each triangle face, and choose a extrusion distance (just a constant that you can tweak, most likely). Following that create a new set of vertices for each triangle offset by
Extrusion * -Normal (they can likely inherit the UV coord of their original vertex). Finally wire them up in the index buffer - which you can keep as static data (so long as you retain the order of the triangles). This can be done when you load meshes that can explode; or as part of your build phase. Remember that shared vertices (arising due to index buffers or such) need to be duplicated. I would essentially store the data in something like the following structure:
Vector3 A, B, C, D, E, F
Vector3 TA, TB, TC // Texture coords, D, E, F are same as A, B, C
Single Scale // Possibly
Now when you need to fill the buffer all you need to do is go over each triangle (in order) and append it to your vertex buffer. You don't need to worry about the indicies as those are constant. This is very similar to how sprite particle system works (except the indicies are not constant).
You can also skip filling the vertex buffer each frame by additionally passing in the
extrudedTriangleNormal into the vertex buffer. You can then have your vertex shader animate each individual vertex.