194 lines
7.2 KiB
C++
Executable File
194 lines
7.2 KiB
C++
Executable File
/*
|
|
* MeshSub.h - edit mesh sub-object classes & functions
|
|
* also includes MeshDelta and MNMesh scripter classes
|
|
*
|
|
* exposes the new-with-R3 MeshDelta, MapDelta & MeshSel tools for
|
|
* working with meshes. Also provides access to MNMesh tools and
|
|
* mesh sub-objects as direct properties on nodes.
|
|
*
|
|
* Copyright © Autodesk, Inc., 1998
|
|
* John Wainwright
|
|
*/
|
|
|
|
#ifndef _H_MESHSUB
|
|
#define _H_MESHSUB
|
|
|
|
// mesh selection types
|
|
#define MSEL_ALL 1 // whole mesh selected
|
|
#define MSEL_CUR 2 // current selection
|
|
#define MSEL_EXP 3 // explicit selection (in vsel)
|
|
#define MSEL_SINGLE 4 // explicit single index
|
|
#define MSEL_NAMED 5 // named selection set - name in nss_name
|
|
|
|
/* -------------- base class for mesh sub-object selections ------------------- */
|
|
|
|
class MeshSelection : public Value
|
|
{
|
|
public:
|
|
MAXWrapper* owner; // owner node or modifier if any
|
|
BYTE sel_type; // selection type
|
|
BitArray vsel; // stand-alone selection if any
|
|
int index; // single vert index
|
|
TSTR nss_name; // name of named selection set
|
|
|
|
void gc_trace();
|
|
|
|
virtual MeshSelection* new_sel(MAXWrapper* own, BYTE stype, int indx = 0) = 0;
|
|
|
|
// utility functions to be specialized
|
|
virtual BitArray get_sel() = 0; // my element selection
|
|
virtual BitArray get_owner_sel() = 0; // get owner's element selection
|
|
virtual void set_owner_sel(BitArray &sel) = 0; // set owner's element selection
|
|
virtual BitArray get_sel_vertices(Mesh* m) = 0; // vertexes involved in my element selection
|
|
virtual BitArray get_sel_vertices(MNMesh* m) = 0; // vertexes involved in my element selection
|
|
virtual BitArray get_sel_vertices(PatchMesh* m) = 0; // vertexes involved in my element selection
|
|
virtual GenericNamedSelSetList& get_named_sel_set_list() = 0;
|
|
virtual int num_elements(Mesh* m) = 0;
|
|
virtual int num_elements(MNMesh* m) = 0;
|
|
virtual int num_elements(PatchMesh* m) = 0;
|
|
virtual BOOL is_same_selection(Value* s) = 0;
|
|
virtual void delete_sel(Mesh& m, MeshDelta& md, BitArray &sel) = 0;
|
|
virtual void delete_sel(MNMesh* m, ReferenceTarget* owner, BitArray &sel) = 0;
|
|
|
|
// utility functions
|
|
int get_sel_index(BitArray &vs, int n); // index for n'th item vertex in BitArray
|
|
void update_sel();
|
|
void set_sel(BitArray &vs);
|
|
void sprin1(TCHAR* type, CharStream* s);
|
|
|
|
// operations
|
|
#include "defimpfn.h"
|
|
# include "arraypro.h"
|
|
def_generic ( move, "move");
|
|
def_generic ( scale, "scale");
|
|
def_generic ( rotate, "rotate");
|
|
def_generic ( delete, "delete");
|
|
def_generic ( select, "select");
|
|
def_generic ( deselect, "deselect");
|
|
def_generic ( selectmore, "selectMore");
|
|
use_generic ( coerce, "coerce");
|
|
|
|
ScripterExport Value* map(node_map& m);
|
|
|
|
void to_fpvalue(FPValue& v);
|
|
ScripterExport Value* to_bitarrayValue();
|
|
|
|
// built-in property accessors
|
|
def_property ( count );
|
|
def_property ( index );
|
|
def_property ( selSetNames );
|
|
};
|
|
|
|
/* ---------------- mesh vertex selection --------------------- */
|
|
|
|
visible_class (VertSelectionValue)
|
|
|
|
class VertSelectionValue : public MeshSelection
|
|
{
|
|
public:
|
|
ScripterExport VertSelectionValue(MAXWrapper* own, BYTE stype, int indx = 0);
|
|
|
|
MeshSelection* new_sel(MAXWrapper* own, BYTE stype, int indx = 0);
|
|
|
|
classof_methods (VertSelectionValue, Value);
|
|
# define is_vertselection(v) ((v)->tag == class_tag(VertSelectionValue))
|
|
void collect() { delete this; }
|
|
ScripterExport void sprin1(CharStream* s);
|
|
|
|
// specialized utility functions
|
|
BitArray get_sel();
|
|
BitArray get_owner_sel() { return (owner == NULL) ? BitArray() : owner->get_vertsel(); }
|
|
void set_owner_sel(BitArray &sel) {if (owner != NULL) owner->set_vertsel(sel); }
|
|
BitArray get_sel_vertices(Mesh* m);
|
|
BitArray get_sel_vertices(MNMesh* m);
|
|
BitArray get_sel_vertices(PatchMesh* m);
|
|
GenericNamedSelSetList& get_named_sel_set_list() { return owner->get_named_vertsel_set(); }
|
|
int num_elements(Mesh* m) { return m->getNumVerts(); }
|
|
int num_elements(MNMesh* m) { return m->VNum(); }
|
|
int num_elements(PatchMesh* m) { return m->getNumVerts(); }
|
|
BOOL is_same_selection(Value* s) { return is_vertselection(s); }
|
|
void delete_sel(Mesh& m, MeshDelta& md, BitArray &sel) { md.DeleteVertSet(m, sel); }
|
|
void delete_sel(MNMesh* m, ReferenceTarget* owner, BitArray &sel);
|
|
|
|
// operations
|
|
def_generic ( put, "put");
|
|
|
|
// built-in property accessors
|
|
def_property ( pos );
|
|
};
|
|
|
|
/* ---------------- mesh face selection --------------------- */
|
|
|
|
visible_class (FaceSelectionValue)
|
|
|
|
class FaceSelectionValue : public MeshSelection
|
|
{
|
|
public:
|
|
ScripterExport FaceSelectionValue(MAXWrapper* own, BYTE stype, int indx = 0);
|
|
|
|
MeshSelection* new_sel(MAXWrapper* own, BYTE stype, int indx = 0);
|
|
|
|
classof_methods (FaceSelectionValue, Value);
|
|
# define is_faceselection(v) ((v)->tag == class_tag(FaceSelectionValue))
|
|
void collect() { delete this; }
|
|
ScripterExport void sprin1(CharStream* s);
|
|
|
|
// specialized utility functions
|
|
BitArray get_sel();
|
|
BitArray get_owner_sel() { return (owner == NULL) ? BitArray() : owner->get_facesel(); }
|
|
void set_owner_sel(BitArray &sel) {if (owner != NULL) owner->set_facesel(sel); }
|
|
BitArray get_sel_vertices(Mesh* m);
|
|
BitArray get_sel_vertices(MNMesh* m);
|
|
BitArray get_sel_vertices(PatchMesh* m);
|
|
GenericNamedSelSetList& get_named_sel_set_list() { return owner->get_named_facesel_set(); }
|
|
int num_elements(Mesh* m) { return m->getNumFaces(); }
|
|
int num_elements(MNMesh* m) { return m->FNum(); }
|
|
int num_elements(PatchMesh* m) { return m->getNumPatches(); }
|
|
BOOL is_same_selection(Value* s) { return is_faceselection(s); }
|
|
void delete_sel(Mesh& m, MeshDelta& md, BitArray &sel) { md.DeleteFaceSet(m, sel); }
|
|
void delete_sel(MNMesh* m, ReferenceTarget* owner, BitArray &sel);
|
|
|
|
// operations
|
|
def_generic ( put, "put");
|
|
|
|
// built-in property accessors
|
|
};
|
|
|
|
/* ---------------- edge face selection --------------------- */
|
|
|
|
visible_class (EdgeSelectionValue)
|
|
|
|
class EdgeSelectionValue : public MeshSelection
|
|
{
|
|
public:
|
|
ScripterExport EdgeSelectionValue(MAXWrapper* own, BYTE stype, int indx = 0);
|
|
|
|
MeshSelection* new_sel(MAXWrapper* own, BYTE stype, int indx = 0);
|
|
|
|
classof_methods (EdgeSelectionValue, Value);
|
|
# define is_edgeselection(v) ((v)->tag == class_tag(EdgeSelectionValue))
|
|
void collect() { delete this; }
|
|
ScripterExport void sprin1(CharStream* s);
|
|
|
|
// specialized utility functions
|
|
BitArray get_sel();
|
|
BitArray get_owner_sel() { return (owner == NULL) ? BitArray() : owner->get_edgesel(); }
|
|
void set_owner_sel(BitArray &sel) {if (owner != NULL) owner->set_edgesel(sel); }
|
|
BitArray get_sel_vertices(Mesh* m);
|
|
BitArray get_sel_vertices(MNMesh* m);
|
|
BitArray get_sel_vertices(PatchMesh* m);
|
|
GenericNamedSelSetList& get_named_sel_set_list() { return owner->get_named_edgesel_set(); }
|
|
int num_elements(Mesh* m) { return m->getNumFaces() * 3; }
|
|
int num_elements(MNMesh* m) { return m->ENum(); }
|
|
int num_elements(PatchMesh* m) { return m->getNumEdges(); }
|
|
BOOL is_same_selection(Value* s) { return is_edgeselection(s); }
|
|
void delete_sel(Mesh& m, MeshDelta& md, BitArray &sel) { md.DeleteEdgeSet(m, sel); }
|
|
void delete_sel(MNMesh* m, ReferenceTarget* owner, BitArray &sel);
|
|
|
|
// operations
|
|
|
|
// built-in property accessors
|
|
};
|
|
|
|
#endif
|