Reading Render Meshes

This brief guide describes how to read render meshes using the openNURBS toolkit.

If you are developing software to read .3dm files, you might find that the software only seems to read NURBS data; but render meshes are ignored. We do provide methods for third-party developers to read render meshes from .3dm files.

An object’s render meshes are stored on that object. For example, the render meshes for ON_Brep and ON_Extrusion objects are stored on that object. The developer can obtain an object’s render meshes from a Brep by calling ON_Brep::GetMesh and from an Extrusion by calling ON_MeshCache::Mesh.

If you are referencing the Example_read sample included with the openNURBS toolkit, then after the 3DM file has been read, you can obtain the render meshes from the ONX_Model object as follows:

ONX_Model model = ...

ONX_ModelComponentIterator it(model, ON_ModelComponent::Type::ModelGeometry);
const ON_ModelComponent* model_component = nullptr;
for (model_component = it.FirstComponent(); nullptr != model_component; model_component = it.NextComponent())
{
  const ON_ModelGeometryComponent* model_geometry = ON_ModelGeometryComponent::Cast(model_component);
  if (nullptr != model_geometry)
  {
    // Test for mesh object
    const ON_Mesh* mesh = ON_Mesh::Cast(model_geometry->Geometry(nullptr));
    if (nullptr != mesh)
    {
      // TODO: do something with ON_Mesh object...
      continue;
    }

    // Test for Brep object
    const ON_Brep* brep = ON_Brep::Cast(model_geometry->Geometry(nullptr));
    if (nullptr != brep)
    {
      ON_SimpleArray<const ON_Mesh*> meshes(brep->m_F.Count());
      const int mesh_count = brep->GetMesh(ON::render_mesh, meshes);
      if (mesh_count > 0)
      {
        // TODO: do something with array of ON_Mesh objects...
      }
      continue;
    }

    // Test for extrusion object
    const ON_Extrusion* extrusion = ON_Extrusion::Cast(model_geometry->Geometry(nullptr));
    if (nullptr != extrusion)
    {
      const ON_Mesh* mesh = extrusion->m_mesh_cache.Mesh(ON::render_mesh);
      if (nullptr != mesh)
      {
        // TODO: do something with ON_Mesh object...
      }
      continue;
    }
  }
}