Unifying Mesh Normals
Windows only
Problem
You have found that RhinoUnifyMeshNormals
C/C++ functions seems to behave differently than the UnifyMeshNormals command. How can one achieve the same functionality in a plugin?
Solution
In addition to calling the RhinoUnifyMeshNormals
function, the UnifyMeshNormals command also recomputes the mesh’s vertex normals, based on the new face normals, using ON_Mesh::ComputeVertexNormals
.
Sample
The following sample demonstrates this.
CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context ) { CRhinoGetObject go; go.SetCommandPrompt( L"Select mesh to unify normals" ); go.SetGeometryFilter( CRhinoGetObject::mesh_object ); go.GetObjects( 1, 1 ); CRhinoCommand::result rc = go.CommandResult(); if( rc != CRhinoCommand::success ) return rc; const CRhinoObjRef ref = go.Object(0); const ON_Mesh* mesh = ref.Mesh(); if( 0 == mesh ) return CRhinoCommand::failure; int count = 0; ON_Mesh* new_mesh = RhinoUnifyMeshNormals( *mesh, 0, false, &count ); if( new_mesh && new_mesh->IsValid() ) { new_mesh->ComputeVertexNormals(); CRhinoMeshObject* new_obj = new CRhinoMeshObject(); new_obj->SetMesh( new_mesh ); context.m_doc.ReplaceObject( ref, new_obj ); context.m_doc.Redraw(); RhinoApp().Print( L"Reversed the orientation of %d faces.\n", count ); rc = CRhinoCommand::success; } else { if( 0 != count ) { RhinoApp().Print( L"Unable to unify mesh normals.\n" ); rc = CRhinoCommand::failure; } else { RhinoApp().Print( L"All face normals are already oriented in the same direction.\n" ); rc = CRhinoCommand::nothing; } } return rc; }