📄 mesh.h
字号:
};
typedef Strip *StripPtr;
typedef Tab<StripPtr> StripTab;
#endif
class StripData {
public:
int ct;
DWORD f[6];
void AddFace(DWORD face)
{ if(ct < 6) f[ct++] = face; }
};
typedef int (*INTRFUNC)();
DllExport void setMeshIntrFunc(INTRFUNC fn);
class MeshSubHitRec {
private:
MeshSubHitRec *next;
public:
DWORD dist;
int index;
DWORD flags;
MeshSubHitRec(DWORD dist, int index, MeshSubHitRec *next)
{this->dist = dist; this->index = index; this->next = next;}
MeshSubHitRec(DWORD dist, int index, DWORD flags, MeshSubHitRec *next)
{this->dist = dist; this->index = index; this->next = next;this->flags = flags;}
MeshSubHitRec *Next() { return next; }
};
class SubObjHitList {
private:
MeshSubHitRec *first;
public:
SubObjHitList() { first = NULL; }
~SubObjHitList() {
MeshSubHitRec *ptr = first, *fptr;
while (ptr) {
fptr = ptr;
ptr = ptr->Next();
delete fptr;
}
first = NULL;
}
MeshSubHitRec *First() { return first; }
void AddHit( DWORD dist, int index ) {
first = new MeshSubHitRec(dist,index,first);
}
};
// Flags for sub object hit test
// NOTE: these are the same bits used for object level.
#define SUBHIT_SELONLY (1<<0)
#define SUBHIT_UNSELONLY (1<<2)
#define SUBHIT_ABORTONHIT (1<<3)
#define SUBHIT_SELSOLID (1<<4)
#define SUBHIT_USEFACESEL (1<<23) // When this bit is set, the sel only and unsel only tests will use the faces selection when doing a vertex level hit test
#define SUBHIT_VERTS (1<<24)
#define SUBHIT_FACES (1<<25)
#define SUBHIT_EDGES (1<<26)
#define SUBHIT_TYPEMASK (SUBHIT_VERTS|SUBHIT_FACES|SUBHIT_EDGES)
// Display flags
#define DISP_VERTTICKS (1<<0)
#define DISP_SELVERTS (1<<10)
#define DISP_SELFACES (1<<11)
#define DISP_SELEDGES (1<<12)
#define DISP_SELPOLYS (1<<13)
// Selection level bits.
#define MESH_OBJECT (1<<0)
#define MESH_VERTEX (1<<1)
#define MESH_FACE (1<<2)
#define MESH_EDGE (1<<3)
class MeshOpProgress;
class UVWMapper;
class MeshRenderData {
public:
virtual void DeleteThis()=0;
};
class AdjFaceList;
class Mesh {
friend class Face;
friend class MeshAccess;
friend void gfxCleanup(void *data);
private:
#if MESH_MULTI_PROCESSING
static int refCount;
static HANDLE xfmThread;
static HANDLE xfmMutex;
static HANDLE xfmStartEvent;
static HANDLE xfmEndEvent;
friend DWORD WINAPI xfmFunc(LPVOID ptr);
static HANDLE fNorThread;
static HANDLE fNorMutex;
static HANDLE fNorStartEvent;
static HANDLE fNorEndEvent;
friend DWORD WINAPI fNorFunc(LPVOID ptr);
static HANDLE workThread;
static HANDLE workMutex;
static HANDLE workStartEvent;
static HANDLE workEndEvent;
friend DWORD WINAPI workFunc(LPVOID ptr);
#endif
// derived data-- can be regenerated
RVertex *rVerts; // <<< instance specific.
GraphicsWindow *cacheGW; // identifies rVerts cache
Point3 *faceNormal; // object space--depends on geom+topo
Box3 bdgBox; // object space--depends on geom+topo
int numVisEdges; // depends on topo
int edgeListHasAll; // depends on topo
VEdge *visEdge; // depends on topo
// Vertex and face work arrays -- for snap code
int snapVCt;
int snapFCt;
char *snapV;
char *snapF;
// -------------------------------------
//
long flags; // work flags-
float norScale; // scale of normals -- couldn't this be done
// automatically relative to bdgBox?
// Rolf: these are instance specific and should be pulled out of here,
// and just passed in from the Node.
BYTE dspNormals; // display surface normals--- put in flags?
BYTE dspAllEdges; // shows hidden edges ---- put in flags?
BYTE dspVertTicks; // shows vertex ticks
int renderFace(GraphicsWindow *gw, DWORD index, int *custVis=NULL);
int renderEdge(GraphicsWindow *gw, DWORD face, DWORD edge);
void renderStrip(GraphicsWindow *gw, Strip *s);
void render3DFace(GraphicsWindow *gw, DWORD index, int *custVis=NULL);
void render3DStrip(GraphicsWindow *gw, Strip *s);
void render3DWireStrip(GraphicsWindow *gw, Strip *s);
BOOL CanDrawStrips(DWORD rndMode, Material *mtl, int numMtls);
BOOL NormalsMatchVerts();
void checkRVertsAlloc(void);
void calcNormal(int i);
void buildFaceNormals(); // calcs just the face normals
void setCacheGW(GraphicsWindow *gw) { cacheGW = gw; }
GraphicsWindow *getCacheGW(void) { return cacheGW; }
void freeVerts();
void freeVertCol();
void freeFaces();
void freeFaceNormals();
void freeRVerts(BOOL forceDelete=FALSE);
void freeTVerts();
void freeTVFaces();
void freeVCFaces();
void freeSnapData();
int buildSnapData(GraphicsWindow *gw,int verts,int edges);
public:
// Topology
int numVerts;
int numFaces;
Face * faces;
// Geometry
Point3 * verts;
// Texture Coord assignment
int numTVerts;
UVVert * tVerts;
TVFace * tvFace;
// Color per vertex
int numCVerts;
VertColor * vertCol;
TVFace * vcFace;
// More maps:
int numMaps;
MeshMap *maps;
// Per-vertex info (of any kind):
BitArray vdSupport;
PerData *vData;
// Material assignment
MtlID mtlIndex; // object material
// Selection
BitArray vertSel; // selected vertices
BitArray faceSel; // selected faces
BitArray edgeSel; // selected edges, identified as 3*faceIndex + edgeIndex
BitArray vertHide; // Hide flags for vertices
// Display attribute flags
DWORD dispFlags;
// Selection level
DWORD selLevel;
// true if normals have been built for the current mesh
int normalsBuilt;
MeshRenderData* renderData; // used by the renderer
// derived data-- can be regenerated
StripTab *stab; // depends on topo
#ifdef PUT_NORMALS_IN_STRIPS
DWTab norInd; // indirection array for fast normal lookup
int normalCount; // total number of normals
Point3 * gfxNormals; // flattened list of normals
#endif
DllExport Mesh();
DllExport Mesh(const Mesh& fromMesh);
DllExport ~Mesh();
void Init();
DllExport void DeleteThis();
DllExport Mesh& operator=(const Mesh& fromMesh);
DllExport BOOL setNumVerts(int ct, BOOL keep=FALSE, BOOL synchSel=TRUE);
int getNumVerts(void) const { return numVerts; }
DllExport BOOL setNumFaces(int ct, BOOL keep=FALSE, BOOL synchSel=TRUE);
int getNumFaces(void) const{ return numFaces; }
// Original mapping coordinates (map channel 1)
DllExport BOOL setNumTVerts(int ct, BOOL keep=FALSE);
int getNumTVerts(void) const { return numTVerts; }
DllExport BOOL setNumTVFaces(int ct, BOOL keep=FALSE, int oldCt=0);
// Color per vertex array (map channel 0)
DllExport BOOL setNumVertCol(int ct,BOOL keep=FALSE);
int getNumVertCol() const {return numCVerts;}
DllExport BOOL setNumVCFaces(int ct, BOOL keep=FALSE, int oldCt=0);
// For mp in following: 0=vert colors, 1=original TVerts, 2&up = new map channels
DllExport void setNumMaps (int ct, BOOL keep=FALSE);
int getNumMaps () const { return numMaps; }
DllExport BOOL mapSupport (int mp) const;
DllExport void setMapSupport (int mp, BOOL support=TRUE);
DllExport void setNumMapVerts (int mp, int ct, BOOL keep=FALSE);
DllExport int getNumMapVerts (int mp) const;
DllExport void setNumMapFaces (int mp, int ct, BOOL keep=FALSE, int oldCt=0);
DllExport UVVert *mapVerts (int mp) const;
DllExport TVFace *mapFaces (int mp) const;
void setMapVert (int mp, int i, const UVVert&xyz) { if (mapVerts(mp)) mapVerts(mp)[i] = xyz; }
DllExport void MakeMapPlanar (int mp); // Copies mesh topology, vert locations into map.
DllExport BitArray GetIsoMapVerts (int mp);
DllExport void DeleteMapVertSet (int mp, BitArray set, BitArray *fdel=NULL);
DllExport void DeleteIsoMapVerts (int mp=-1); // default indicates to do all active maps
DllExport void freeMapVerts (int mp);
DllExport void freeMapFaces (int mp);
DllExport void setNumVData (int ct, BOOL keep=FALSE);
int getNumVData () const { return vdSupport.GetSize(); }
DllExport BOOL vDataSupport (int vd) const;
DllExport void setVDataSupport (int vd, BOOL support=TRUE);
void *vertexData (int vd) const { return vDataSupport(vd) ? vData[vd].data : NULL; }
float *vertexFloat (int vd) const { return (float *) vertexData (vd); }
DllExport void freeVData (int vd);
DllExport void freeAllVData ();
// Two specific vertex scalars.
float *getVertexWeights () { return vertexFloat(VDATA_WEIGHT); }
void SupportVertexWeights () { setVDataSupport (VDATA_WEIGHT); }
void ClearVertexWeights() { setVDataSupport (VDATA_WEIGHT, FALSE); }
void freeVertexWeights () { freeVData (VDATA_WEIGHT); }
float *getVSelectionWeights () { return vertexFloat(VDATA_SELECT); }
void SupportVSelectionWeights () { setVDataSupport (VDATA_SELECT); }
void ClearVSelectionWeights() { setVDataSupport (VDATA_SELECT, FALSE); }
void freeVSelectionWeights () { freeVData (VDATA_SELECT); }
// these flags are restricted to 4 bits and force the topology (strips & edges)
// to be invalidated when they change. Used by primitives with smoothing checkboxes
DllExport void setSmoothFlags(int f);
DllExport int getSmoothFlags();
void setVert(int i, const Point3 &xyz) { verts[i] = xyz; }
void setVert(int i, float x, float y, float z) { verts[i].x=x; verts[i].y=y; verts[i].z=z; }
void setTVert(int i, const UVVert &xyz) { tVerts[i] = xyz; }
void setTVert(int i, float x, float y, float z) { tVerts[i].x=x; tVerts[i].y=y; tVerts[i].z=z; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -