🌶️ MultiFastMesh

 

In certain situations, there is a need to showcase a 3D object that consists of numerous smaller sub-parts, each with its own color and visibility settings.

For instance, let's consider a 3D printing simulation where the final piece is built by adding a small amount of material at each step. If you were to recreate a 3D representation of this process, you would typically generate separate entities for each simulation step. At each step, you would then turn some entities visible/invisible and maybe change their color (to highlight the latest level or the latest motion in the simulation, for example).

This approach quickly becomes unfeasible due to the heavy impact a large number of individual meshes has on performance.  

The best performances are achieved when all the individual meshes are merged into a single mesh. With a single mesh, however, it's not possible to specify color and visibility for the individual sub-meshes.

The MultiFastMesh entity is perfect to handle such situations: it is almost as fast as a single mesh while offering the possibility to specify color and visibility for individual sub-parts.

The following example shows how to build and show a MultiFastMesh:

//  Creating some geometry (3 quads):
//
//  0 ----- 2 ----- 4 ----- 6
//  |   __ /|   __ /|   __ /|
//  | /     | /     | /     |
//  1 ----- 3 ----- 5 ----- 7

float[] pos =
{
    0, 0, 0,
    1, 0, 0,
    0, 1, 0,
    1, 1, 0,
    0, 2, 0,
    1, 2, 0,
    0, 3, 0,
    1, 3, 0
};

float[] nrm = new float[pos.Length];
for (int i = 0; i < nrm.Length; i += 3)
{
    nrm[i + 0] = 0.0f;
    nrm[i + 1] = 0.0f;
    nrm[i + 2] = 1.0f;
}

int[] tri =
{
    0, 1, 3,
    0, 3, 2,

    2, 3, 5,
    2, 5, 4,

    4, 5, 7,
    4, 7, 6
};

MultiFastMesh mfm = new MultiFastMesh(pos, nrm, tri, new[]
{
    // each quad is a sub-mesh
    new IntInterval(0, 5),       // Sub-mesh 1: from index 0 (inclusive) to index 5 (inclusive) in the triangles array
    new IntInterval(6, 11),      // Sub-mesh 2: [6 , 11]
    new IntInterval(12, 17),     // Sub-mesh 3: [12, 17]
});

// By filling SubMeshColors it is possible to specify which sub-meshes gets drawn and what is their color.
// If a sub-mesh is not present in this list, it won't be drawn.

// Example I
// ---------
// All the sub-meshes are visible and have the same color:
mfm.SubMeshIntervals = new List<MultiFastMesh.SubMeshInterval>
{
    new MultiFastMesh.SubMeshInterval(0, 2 /* we specified 3 sub-meshes in the constructor */, Color.Green)
};

// Example II
// ----------
// Only sub-meshes 0 and 2 are visible and they have different colors:
mfm.SubMeshIntervals = new List<MultiFastMesh.SubMeshInterval>
{
    new MultiFastMesh.SubMeshInterval(0, 0, Color.Green), // The 1st sub-mesh is visible and green
    // the 2nd sub-mesh is not visible (not added to SubMeshColors)          
    new MultiFastMesh.SubMeshInterval(2, 2, Color.Orange) // the 3rd sub-mesh is visible and orange
};

design1.Entities.Add(mfm, Color.Black);
  

 

Example 1

ViewPosFbo2.png

 

Example 2

ViewPosFbo.png

Was this article helpful?
0 out of 0 found this helpful

Comments

0 comments

Please sign in to leave a comment.

Articles in this section

See more