MeshVS_MeshPrsBuilder won't display gouraud shaded objects

Hi, I'm using MeshVS_MeshPrsBuilder for the fast display of STL meshes, which is so much faster than the more standard StlAPI.
( IMHO converting meshes -> breps by default is a bad idea... the docs also dont state that this conversion is going on, which is worrying )
Even though I'm setting the following flags ( MeshVS_DA_SmoothShading and MeshVS_DA_Reflection are necessary for gouraud shading ):

mesh_drawer.SetMaterial(MeshVS_DA_FrontMaterial, Graphic3d_MaterialAspect(Graphic3d_NOM_SATIN))
mesh_drawer.SetBoolean( MeshVS_DA_DisplayNodes, False)
mesh_drawer.SetBoolean( MeshVS_DA_ShowEdges, False)
mesh_drawer.SetBoolean( MeshVS_DA_SmoothShading, True)
mesh_drawer.SetBoolean( MeshVS_DA_Reflection, True)

I'm not arriving to smooth shading.
Any ideas what might be going wrong?
I've been glancing over the c++ classes and can't figure out why smooth shading wont pan out...

Thanks,

-jelle

Mark Blome's picture

Hi Jelle,

I think this fails because SmoothShading requires mean normal vectors at mesh nodes, not element normal vectors.

MeshVS_MeshPrsBuilder will ask the data source (any class derived from MeshVS_DataSource) about nodal normal
vectors using the function GetNodeNormal(). However by default in MeshVS_DataSource this function returns false,
which will deactivate smooth shading:

Standard_BooleanMeshVS_DataSource::GetNodeNormal( const Standard_Integer ranknode, const Standard_Integer Id, Standard_Real &nx, Standard_Real &ny, Standard_Real &nz)
{
return Standard_False;
}

In PythonOCC provided SMESH_MeshVSLink (derived from MeshVS_DataSource ) implemented by Sioutis Fotios this function is not implemented.
I will implement this function and let you know if that would solve this problem (I am working on SMESH_MeshVSLink for speed improvements when displaying
volume meshes at the moment anyway).

Regards,
Mark

Mark Blome's picture

Hi,

smooth shading works nicely with surface meshes if a MeshVS_DataSource3D derived class is
provided to MeshVS_MeshPrsBuilder that implements nodal normal vectors (GetNodeNormal method).
In the attached ZIP file such a class is implemented and two examples are shown (smooth shading visualization
of 2 surface grids created with NETGEN).

Mark