📄 mesh.h
字号:
DllExport void setNormal(int i, const Point3 &xyz);
DllExport Point3 & getNormal(int i) const; // mjm - made const - 2.16.99
void setFaceNormal(int i, const Point3 &xyz) { faceNormal[i] = xyz; }
Point3 & getFaceNormal(int i) { return faceNormal[i]; }
Point3 & getVert(int i) { return verts[i]; }
Point3 * getVertPtr(int i) { return verts+i; }
UVVert & getTVert(int i) { return tVerts[i]; }
UVVert * getTVertPtr(int i) { return tVerts+i; }
RVertex & getRVert(int i) { return rVerts[i]; }
RVertex * getRVertPtr(int i) { return rVerts+i; }
void setMtlIndex(MtlID i) { mtlIndex = i; }
MtlID getMtlIndex(void) { return mtlIndex; }
// Face MtlIndex access methods;
DllExport MtlID getFaceMtlIndex(int i);
DllExport void setFaceMtlIndex(int i, MtlID id);
DllExport void buildNormals(); // calcs face and vertex normals
DllExport void buildRenderNormals(); // like buildNormals, but ignores mtlIndex
// checkNormals can be used to build the normals and allocate RVert space
// only if necessary. This is a very cheap call if the normals are already calculated.
// When illum is FALSE, only the RVerts allocation is checked (since normals aren't
// needed for non-illum rendering). When illum is TRUE, normals will also be built, if
// they aren't already. So, to make sure normals are built, call this with illum=TRUE.
DllExport void checkNormals(BOOL illum);
DllExport void render(GraphicsWindow *gw, Material *ma, RECT *rp, int compFlags, int numMat=1);
DllExport BOOL select(GraphicsWindow *gw, Material *ma, HitRegion *hr, int abortOnHit = FALSE, int numMat=1);
DllExport void snap(GraphicsWindow *gw, SnapInfo *snap, IPoint2 *p, Matrix3 &tm);
DllExport BOOL SubObjectHitTest(GraphicsWindow *gw, Material *ma, HitRegion *hr,
DWORD flags, SubObjHitList& hitList, int numMat=1 );
void displayNormals(int b, float sc) { dspNormals = b; if(sc != (float)0.0) norScale = sc; }
void displayAllEdges(int b) { dspAllEdges = b; }
DllExport void buildBoundingBox(void);
DllExport Box3 getBoundingBox(Matrix3 *tm=NULL); // RB: optional TM allows the box to be calculated in any space.
// NOTE: this will be slower becuase all the points must be transformed.
// Cache invalidation
DllExport void InvalidateGeomCache();
DllExport void InvalidateTopologyCache();
DllExport void FreeAll(); //DS
DllExport void ZeroTopologyCache(); // RB set pointers to NULL but don't delete from mem.
// edge list functions
DllExport void EnableEdgeList(int e);
DllExport void BuildVisEdgeList();
DllExport void DrawVisEdgeList(GraphicsWindow *gw, DWORD flags);
DllExport void Draw3DVisEdgeList(GraphicsWindow *gw, DWORD flags);
DllExport void HitTestVisEdgeList(GraphicsWindow *gw, int abortOnHit ); // RB
DllExport void InvalidateEdgeList(); // RB
// strip functions
DllExport BOOL BuildStrips();
DllExport void Stripify(Strip *s, StripData *sd, int vtx);
DllExport void getStripVertColor(GraphicsWindow *gw, int cv, int flipped, MtlID mID, DWORD smGroup, Point3 &rgb);
DllExport void getStripNormal(int cv, MtlID mID, DWORD smGroup, Point3 &nor);
DllExport int getStripNormalIndex(int cv, MtlID mID, DWORD smGroup);
DllExport BOOL getStripTVert(GraphicsWindow *gw, int cv, int ctv, Point3 &uvw);
DllExport void DrawStrips(GraphicsWindow *gw, Material *ma, int numMat);
DllExport void Draw3DStrips(GraphicsWindow *gw, Material *ma, int numMat);
DllExport void Draw3DWireStrips(GraphicsWindow *gw, Material *ma, int numMat);
DllExport void InvalidateStrips();
DllExport void BuildStripsAndEdges();
// functions for use in data flow evaluation
DllExport void ShallowCopy(Mesh *amesh, unsigned long channels);
DllExport void DeepCopy(Mesh *amesh, unsigned long channels);
DllExport void NewAndCopyChannels(unsigned long channels);
DllExport void FreeChannels( unsigned long channels, int zeroOthers=1);
// Mesh flags
void SetFlag(DWORD f) { flags |= f; }
DWORD GetFlag(DWORD f) { return flags & f; }
void ClearFlag(DWORD f) { flags &= ~f; }
// Display flags
void SetDispFlag(DWORD f) { dispFlags |= f; }
DWORD GetDispFlag(DWORD f) { return dispFlags & f; }
void ClearDispFlag(DWORD f) { dispFlags &= ~f; }
// Selection access
BitArray& VertSel() { return vertSel; }
BitArray& FaceSel() { return faceSel; }
// Constructs a vertex selection list based on the current selection level.
DllExport BitArray VertexTempSel();
DllExport IOResult Save(ISave* isave);
DllExport IOResult Load(ILoad* iload);
// RB: added so all objects can easily support the GeomObject method of the same name.
DllExport int IntersectRay(Ray& ray, float& at, Point3& norm);
DllExport int IntersectRay(Ray& ray, float& at, Point3& norm, DWORD &fi, Point3 &bary);
// RB: I couldn't resist adding these <g>
DllExport Mesh operator+(Mesh &mesh); // Union
DllExport Mesh operator-(Mesh &mesh); // Difference
DllExport Mesh operator*(Mesh &mesh); // Intersection
DllExport void MyDebugPrint ();
DllExport void WeldCollinear(BitArray &set);
DllExport void Optimize(
float normThresh, float edgeThresh,
float bias, float maxEdge, DWORD flags,
MeshOpProgress *prog=NULL);
DllExport void ApplyUVWMap(int type,
float utile, float vtile, float wtile,
int uflip, int vflip, int wflip, int cap,
const Matrix3 &tm, int channel=1);
DllExport void ApplyMapper (UVWMapper & map, int channel=1);
DllExport void FlipNormal(int i);
DllExport void UnifyNormals(BOOL selOnly);
DllExport void AutoSmooth(float angle,BOOL useSel,BOOL preventIndirectSmoothing=FALSE);
DllExport Edge *MakeEdgeList(int *edgeCount, int flagdbls=0);
DllExport int DeleteFlaggedFaces(); // deletes all faces with FACE_WORK flag set
// deletes all seleted elements of the current selection level
DllExport void DeleteSelected();
// Deletes vertices as specified by the bit array
DllExport void DeleteVertSet(BitArray set);
// Deletes faces as specified by the bit array. If isoVert is non
// null then it will be setup to flag vertices that were isolated
// by the face deletetion. This set can then be passed to
// DeleteVertSet to delete isolated vertices.
DllExport void DeleteFaceSet(BitArray set, BitArray *isoVert=NULL);
// Returns TRUE if an equivalent face already exists.
DllExport BOOL DoesFaceExist(DWORD v0, DWORD v1, DWORD v2);
// Removes faces that have two or more equal indices.
// Returns TRUE if any degenerate faces were found
DllExport BOOL RemoveDegenerateFaces();
// Removes faces that have indices that are out of range
// Returns TRUE if any illegal faces were found
DllExport BOOL RemoveIllegalFaces();
DllExport Point3 FaceNormal (DWORD fi, BOOL nrmlize=FALSE);
DllExport Point3 FaceCenter (DWORD fi);
DllExport float AngleBetweenFaces(DWORD f0, DWORD f1);
// Compute the barycentric coords of a point in the plane of
// a face relative to that face.
DllExport Point3 BaryCoords(DWORD face, Point3 p);
// Some edge operations
DllExport void DivideEdge(DWORD edge, float prop=.5f, bool visDiag1=TRUE,
bool fixNeighbors=TRUE, bool visDiag2=TRUE);
DllExport void DivideFace(DWORD face, DWORD e1, DWORD e2,
float prop1=.5f, float prop2=.5f, bool fixNeighbors=TRUE, bool split=FALSE);
DllExport void TurnEdge (DWORD edge, DWORD *otherEdge=NULL);
// Tessellation
DllExport void FaceCenterTessellate(BOOL ignoreSel=FALSE, MeshOpProgress *mop=NULL);
DllExport void EdgeTessellate(float tens,BOOL ignoreSel=FALSE, MeshOpProgress *mop=NULL);
// Extrudes selected faces. Note that this is just a topological
// change. The new extruded faces do not change position but
// are left on top of the original faces.
// If doFace is FALSE then selected edges are extruded.
DllExport void ExtrudeFaces(BOOL doFace=TRUE);
// Indents selected faces, in a manner consistent with the outlining used in Bevel.
// Added by SteveA for Shiva, 6/98
DllExport void IndentSelFaces (float amount);
// Splits verts specified in bitarray so that they are only
// used by a single face
DllExport void BreakVerts(BitArray set);
// Deletes verts that aren't used by any faces
DllExport BitArray GetIsoVerts ();
DllExport void DeleteIsoVerts ();
// Clone faces (and verts used by those faces)
DllExport void CloneFaces(BitArray fset);
DllExport void PolyFromFace (DWORD f, BitArray &set, float thresh, BOOL ignoreVisEdges, AdjFaceList *af=NULL);
DllExport void ElementFromFace (DWORD f, BitArray &set, AdjFaceList *af=NULL);
DllExport void FindVertsUsedOnlyByFaces (BitArray & fset, BitArray & vset);
DllExport void FindOpenEdges (BitArray & edges);
DllExport void FindVertexAngles (float *vang, BitArray *set=NULL);
// used by the renderer
void SetRenderData(MeshRenderData *p) {renderData = p; }
MeshRenderData * GetRenderData() { return renderData; }
};
class ImbMesh: public Mesh {
public:
~ImbMesh();
};
// Mapping types passed to ApplyUVWMap()
#define MAP_PLANAR 0
#define MAP_CYLINDRICAL 1
#define MAP_SPHERICAL 2
#define MAP_BALL 3
#define MAP_BOX 4
#define MAP_FACE 5
// Optimize flags
#define OPTIMIZE_SAVEMATBOUNDRIES (1<<0)
#define OPTIMIZE_SAVESMOOTHBOUNDRIES (1<<1)
#define OPTIMIZE_AUTOEDGE (1<<2)
void DllExport setUseVisEdge(int b);
int DllExport getUseVisEdge();
#define SMALL_VERTEX_DOTS 0
#define LARGE_VERTEX_DOTS 1
void DllExport setUseVertexDots(int b);
int DllExport getUseVertexDots();
void DllExport setVertexDotType(int t);
int DllExport getVertexDotType();
// a callback to update progress UI while doing a
// lengthy operation to a mesh
class MeshOpProgress {
public:
// called once with the total increments
virtual void Init(int total)=0;
// Called to update progress. % done = p/total
virtual BOOL Progress(int p)=0;
};
// Boolean operations for meshes:
#define MESHBOOL_UNION 1
#define MESHBOOL_INTERSECTION 2
#define MESHBOOL_DIFFERENCE 3
//
// mesh = mesh1 op mesh2
// If tm1 or tm2 are non-NULL, the points of the corresponding
// mesh will be transformed by these tm before the bool op
// The mesh will be transformed back by either Inverse(tm1) or
// Inverse(tm2) depending whichInv (0=>tm1, 1=>tm2)
// unless whichInv is -1 in which case it will not be transformed
// back.
//
int DllExport CalcBoolOp(
Mesh &mesh, Mesh &mesh1, Mesh &mesh2, int op,
MeshOpProgress *prog = NULL,
Matrix3 *tm1 = NULL,
Matrix3 *tm2 = NULL,
int whichInv = 0,
int weld = TRUE);
// Combines two meshes. The matrix and whichInv parameters have
// the same meaning as they do for the CalcBoolOp above.
void DllExport CombineMeshes(
Mesh &mesh,Mesh &mesh1,Mesh &mesh2,
Matrix3 *tm1=NULL, Matrix3 *tm2=NULL, int whichInv=0);
// Slices a single mesh. The Point3 N and the float offset define a
// slicing plane (by DotProd (N,X) = offset). Default behavior is to
// split faces that cross the plane, producing 1-2 new faces on each side
// and a new vert in the middle of each edge crossing the plane. split
// means to add 2 different but coincident points to the top and bottom
// sets of faces, splitting the mesh into two meshes. remove means to
// delete all faces & verts below the plane.
void DllExport SliceMesh (Mesh & mesh,
Point3 N, float off, bool split=FALSE, bool remove=FALSE);
// Handy utilities to go with meshes:
// Translates map type into 3d location -> uvw coord mapper:
class UVWMapper {
public:
int type, cap;
float utile, vtile, wtile;
int uflip, vflip, wflip;
Matrix3 tm;
DllExport UVWMapper();
DllExport UVWMapper(int type, const Matrix3 &tm, int cap=FALSE,
float utile=1.0f, float vtile=1.0f, float wtile=1.0f,
int uflip=FALSE, int vflip=FALSE, int wflip=FALSE);
DllExport UVWMapper(UVWMapper& m);
DllExport UVVert MapPoint(Point3 p, const Point3 & norm, int *nan=NULL);
DllExport UVVert TileFlip (UVVert uvw);
DllExport int MainAxis (const Point3 & n);
bool NormalMatters () { return ((type==MAP_BOX)||((type==MAP_CYLINDRICAL)&&cap)) ? TRUE:FALSE; }
};
DllExport Mesh * CreateNewMesh();
#endif // _MESH_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -