3ds Max C++ API Reference
MNMeshSelectionConverter Class Reference

When a Mesh object or modifier (such as Editable Mesh, Edit Mesh, or Mesh Select) handles viewport subobject selection, the flow is basically as follows from Editable Mesh. More...

#include <mnmesh.h>

+ Inheritance diagram for MNMeshSelectionConverter:

Public Member Functions

DllExport void FaceToElement (MNMesh &mesh, BitArray &faceSel, BitArray &elementSel)
 Converts a face selection to an element selection. More...
 
DllExport void EdgeToBorder (MNMesh &mesh, BitArray &edgeSel, BitArray &borderSel)
 
DllExport void VertexToEdge (MNMesh &mesh, BitArray &vertexSel, BitArray &edgeSel)
 Converts a vertex selection to a "By Vertex" edge selection. More...
 
DllExport void VertexToFace (MNMesh &mesh, BitArray &vertexSel, BitArray &faceSel)
 
- Public Member Functions inherited from FlagUser
 FlagUser ()=default
 
 FlagUser (const FlagUser &)=default
 
 FlagUser (FlagUser &&)=default
 
FlagUseroperator= (const FlagUser &)=default
 
FlagUseroperator= (FlagUser &&)=default
 
void SetFlag (DWORD fl, bool val=TRUE)
 
void ClearFlag (DWORD fl)
 
bool GetFlag (DWORD fl) const
 
void ClearAllFlags ()
 
void CopyFlags (DWORD fl)
 
void CopyFlags (const FlagUser &fu)
 
void CopyFlags (const FlagUser *fu)
 
void CopyFlags (DWORD fl, DWORD mask)
 
void CopyFlags (const FlagUser &fu, DWORD mask)
 
void CopyFlags (const FlagUser *fu, DWORD mask)
 
void OrFlags (const FlagUser &fu)
 
void OrFlags (const FlagUser *fu)
 
void AndFlags (const FlagUser &fu)
 
void AndFlags (const FlagUser *fu)
 
bool FlagMatch (DWORD fmask, DWORD fl) const
 
bool FlagMatch (DWORD fmask, const FlagUser &fu) const
 
bool FlagMatch (DWORD fmask, const FlagUser *fu) const
 
DWORD ExportFlags () const
 
void ImportFlags (DWORD fl)
 
IOResult WriteFlags (ISave *isave, ULONG *nb) const
 
IOResult ReadFlags (ILoad *iload, ULONG *nb)
 

Additional Inherited Members

- Static Public Member Functions inherited from MaxHeapOperators
static UtilExport voidoperator new (size_t size)
 Standard new operator used to allocate objects If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new (size_t size, const std::nothrow_t &e)
 Standard new operator used to allocate objects if there is insufficient memory, NULL will be returned. More...
 
static UtilExport voidoperator new (size_t size, const char *filename, int line)
 New operator used to allocate objects that takes the filename and line number where the new was called If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new (size_t size, int block_type, const char *filename, int line)
 New operator used to allocate objects that takes the type of memory, filename and line number where the new was called If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new (size_t size, const std::nothrow_t &e, const char *filename, int line)
 New operator used to allocate objects that takes the filename and line number where the new was called If there is insufficient memory, NULL will be returned. More...
 
static UtilExport voidoperator new (size_t size, unsigned long flags)
 New operator used to allocate objects that takes extra flags to specify special operations If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new (size_t size, const std::nothrow_t &e, unsigned long flags)
 New operator used to allocate objects that takes extra flags to specify special operations If there is insufficient memory, NULL will be returned. More...
 
static UtilExport voidoperator new[] (size_t size)
 New operator used to allocate arrays of objects If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new[] (size_t size, const std::nothrow_t &e)
 New operator used to allocate arrays of objects If there is insufficient memory, NULL will be returned. More...
 
static UtilExport voidoperator new[] (size_t size, const char *filename, int line)
 New operator used to allocate arrays of objects If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new[] (size_t size, int block_type, const char *filename, int line)
 New operator used to allocate arrays of objects. More...
 
static UtilExport voidoperator new[] (size_t size, const std::nothrow_t &e, const char *filename, int line)
 New operator used to allocate arrays of objects If there is insufficient memory, NULL will be returned. More...
 
static UtilExport voidoperator new[] (size_t size, unsigned long flags)
 New operator used to allocate arrays of objects If there is insufficient memory, an exception will be thrown. More...
 
static UtilExport voidoperator new[] (size_t size, const std::nothrow_t &e, unsigned long flags)
 New operator used to allocate arrays of objects If there is insufficient memory, NULL will be returned. More...
 
static UtilExport void operator delete (void *ptr)
 Standard delete operator used to deallocate an object If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete (void *ptr, const std::nothrow_t &e)
 Standard delete operator used to deallocate an object If the pointer is invalid, nothing will happen. More...
 
static UtilExport void operator delete (void *ptr, const char *filename, int line)
 Delete operator used to deallocate an object that takes the filename and line number where the delete was called If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete (void *ptr, int block_type, const char *filename, int line)
 Delete operator used to deallocate an object that takes the type of memory, filename and line number where the delete was called If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete (void *ptr, const std::nothrow_t &e, const char *filename, int line)
 Delete operator used to deallocate an object that takes the filename and line number where the delete was called If the pointer is invalid, nothing will happen. More...
 
static UtilExport void operator delete (void *ptr, unsigned long flags)
 Delete operator used to deallocate an object that takes extra flags to specify special operations If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete (void *ptr, const std::nothrow_t &e, unsigned long flags)
 Delete operator used to deallocate an object that takes extra flags to specify special operations If the pointer is invalid, nothing will happen. More...
 
static UtilExport void operator delete[] (void *ptr)
 Standard delete operator used to deallocate an array of objects If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete[] (void *ptr, const std::nothrow_t &e)
 Standard delete operator used to deallocate an array of objects If the pointer is invalid, nothing will happen. More...
 
static UtilExport void operator delete[] (void *ptr, const char *filename, int line)
 Delete operator used to deallocate an array of objects that takes the filename and line number where the delete was called If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete[] (void *ptr, int block_type, const char *filename, int line)
 Delete operator used to deallocate an array of objects that takes the type of memory, filename and line number where the delete was called If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete[] (void *ptr, const std::nothrow_t &e, const char *filename, int line)
 Delete operator used to deallocate an array of objects that takes the filename and line number where the delete was called If the pointer is invalid, nothing will happen. More...
 
static UtilExport void operator delete[] (void *ptr, unsigned long flags)
 Delete operator used to deallocate an array of objects that takes extra flags to specify special operations If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport void operator delete[] (void *ptr, const std::nothrow_t &e, unsigned long flags)
 Delete operator used to deallocate an array of objects that takes extra flags to specify special operations If the pointer is invalid, an exception will be thrown. More...
 
static UtilExport voidoperator new (size_t size, void *placement_ptr)
 Placement new operator. More...
 
static UtilExport void operator delete (void *ptr, void *placement_ptr)
 Placement delete operator. More...
 
static UtilExport voidaligned_malloc (size_t size, size_t alignment)
 Allocates memory on a specified alignment boundary. More...
 
static UtilExport voidaligned_realloc (void *ptr, size_t size, size_t alignment)
 Reallocates memory on a specified alignment boundary. More...
 
static UtilExport void aligned_free (void *ptr)
 Frees a block of memory that was allocated with aligned_malloc/aligned_realloc. More...
 

Detailed Description

When a Mesh object or modifier (such as Editable Mesh, Edit Mesh, or Mesh Select) handles viewport subobject selection, the flow is basically as follows from Editable Mesh.


  • EditTriObject::HitTest is called with window information.

  • It passes the hit region description to Mesh::SubObjectHitTest

  • Mesh::SubObjectHitTest culls some subobjects (say, because they're backfacing), and creates hits for others that are within the hit region.

  • EditTriObject::SelectSubComponent is called with the list of hits, and

    constructs the appropriate BitArray selection.

    The problem was that in cases of Window selection, you want to only select an element or polygon if all the faces of that element or polygon were in the selection region. But since some of these faces could have been culled, they might not have hit records even if they're within the correct region. This would mean, for instance, that a window selection of an entire Sphere would fail to get select its single element, because all the backfaces would not

    have been selected.

    So in order to do this correctly, we need the face culling information. This information is stored and applied in the new MeshSelectionConverter interface, which is part of class Mesh.

    This sort of culling and subobject level translation is not only relevant for Polygon and Element selections, but also for "By Vertex" selections of edges, faces, polygons, or elements.

    Examples of the use of this interface are available in maxsdk/SAMPLES/mesh/editablemesh/triobjed.cpp, and in meshsel.cpp and editmesh.cpp in maxsdk/SAMPLES/modifiers..

    Owner: class Mesh

    InterfaceID: MESHSELECTCONVERT_INTERFACE

    Flags:
    We have the usual three methods for setting, clearing, and getting flags: void SetFlag (DWORD f, bool value=true) void ClearFlag(DWORD f) bool GetFlag (DWORD f)
    We currently only have one flag influencing subobject selection conversion: MESH_SELCONV_REQUIRE_ALL
    If set, it implies that, for instance, an element is only selected if all of its (non-culled) faces are selected. If cleared, an element is selected if any of its faces are selected.

Member Function Documentation

◆ FaceToElement()

DllExport void FaceToElement ( MNMesh mesh,
BitArray faceSel,
BitArray elementSel 
)

Converts a face selection to an element selection.

This method can only produce accurate results with culling if we are certain that the face selection corresponds to the results of the last call to

the owner Mesh's SubObjectHitTest method. (To turn off culling, use GetCull ().ClearAll(). Culling is not relevant if the MESH_SELCONV_REQUIRE_ALL flag

is turned off.)

Parameters:
Mesh & mesh

The mesh that owns this interface

BitArray & faceSel

The face selection representing actual hits in the viewport.

BitArray & elementSel

This is where the output Element selection is stored.

◆ EdgeToBorder()

DllExport void EdgeToBorder ( MNMesh mesh,
BitArray edgeSel,
BitArray borderSel 
)

◆ VertexToEdge()

DllExport void VertexToEdge ( MNMesh mesh,
BitArray vertexSel,
BitArray edgeSel 
)

Converts a vertex selection to a "By Vertex" edge selection.

This method can only produce accurate results with culling if we are certain that the vertex selection corresponds to the results of the last call

to the owner Mesh's SubObjectHitTest method. (To turn off culling, use GetCull ().ClearAll(). Culling is not relevant if the MESH_SELCONV_REQUIRE_ALL flag

is turned off.)

Parameters:
Mesh & mesh

The mesh that owns this interface

BitArray & vertexSel

The face selection representing actual hits in the viewport

BitArray & edgeSel

The face selection representing actual hits in the viewport

◆ VertexToFace()

DllExport void VertexToFace ( MNMesh mesh,
BitArray vertexSel,
BitArray faceSel 
)