📄 mesh.h
字号:
/**********************************************************************
*<
FILE: mesh.h
DESCRIPTION: Main include file for triangle meshes.
CREATED BY: Don Brittain
HISTORY:
*> Copyright (c) 1994, All Rights Reserved.
**********************************************************************/
#ifndef _MESH_H_
#define _MESH_H_
#include "channels.h"
#include "snap.h"
#include <ioapi.h>
#include "export.h"
#include "vedge.h" //DS
#include "utillib.h"
#include "tab.h"
#if 0 // moved to gfx.h
typedef Tab<DWORD> DWTab;
typedef unsigned short MtlID;
#endif
// This a UV coordinate. These cound be Point2s
typedef Point3 UVVert;
// We may want these to by 24bit RGBs instead of floats
typedef Point3 VertColor;
#define MESH_MULTI_PROCESSING TRUE // TRUE turns on mp vertex transformation
class ISave;
class ILoad;
#define NEWMESH
class RNormal {
public:
RNormal() { smGroup = mtlIndex = 0; }
void setNormal(const Point3 &nor) { normal = nor; }
void addNormal(const Point3 &nor) { normal += nor; }
void normalize(void) { normal = Normalize(normal); }
Point3 & getNormal(void) { return normal; }
void setSmGroup(DWORD g) { smGroup = g; }
void addSmGroup(DWORD g) { smGroup |= g; }
DWORD getSmGroup(void) { return smGroup; }
void setMtlIndex(MtlID i){ mtlIndex = i; }
MtlID getMtlIndex(void) { return mtlIndex; }
void setRGB(Point3 &clr) { rgb = clr; };
Point3 & getRGB(void) { return rgb; }
private:
Point3 normal;
DWORD smGroup;
MtlID mtlIndex;
Point3 rgb;
};
// RVertex flags: contain clip flags, number of normals at the vertex
// and the number of normals that have already been rendered.
// fine PLANE_MASK 0x00003f00UL -- now in gfx.h
#define NORCT_MASK 0x000000ffUL
#define SPECIFIED_NORMAL 0x00004000UL
#define OUT_LEFT 0x00010000UL
#define OUT_RIGHT 0x00020000UL
#define OUT_TOP 0x00040000UL
#define OUT_BOTTOM 0x00080000UL
#define RECT_MASK 0x000f0000UL
#define RND_MASK 0xfff00000UL
#define RND_NOR0 0x00100000UL
#define RND_NOR(n) (RND_NOR0 << (n))
class RVertex {
public:
RVertex() { rFlags = 0; ern = NULL; }
DllExport ~RVertex();
DWORD rFlags;
int pos[3];
RNormal rn;
RNormal *ern;
};
// Face Flags:
// 3 LSBs hold the edge visibility flags
// Bit 3 indicates the presence of texture verticies
// if bit is 1, edge is visible
#define EDGE_VIS 1
#define EDGE_INVIS 0
// first edge-visibility bit field
#define VIS_BIT 0x0001
#define VIS_MASK 0x0007
#define EDGE_A (1<<0)
#define EDGE_B (1<<1)
#define EDGE_C (1<<2)
#define EDGE_ALL (EDGE_A|EDGE_B|EDGE_C)
#define FACE_HIDDEN (1<<3)
#define HAS_TVERTS (1<<4)
#define FACE_WORK (1<<5) // used in various algorithms
#define FACE_STRIP (1<<6)
// The mat ID is stored in the HIWORD of the face flags
#define FACE_MATID_SHIFT 16
#define FACE_MATID_MASK 0xFFFF
class Face {
public:
DWORD v[3];
DWORD smGroup;
DWORD flags;
Face() { smGroup = flags = 0; }
MtlID getMatID() {return (int)((flags>>FACE_MATID_SHIFT)&FACE_MATID_MASK);}
void setMatID(MtlID id) {flags &= 0xFFFF; flags |= (DWORD)(id<<FACE_MATID_SHIFT);}
void setSmGroup(DWORD i) { smGroup = i; }
DWORD getSmGroup(void) { return smGroup; }
void setVerts(DWORD *vrt){ memcpy(v, vrt, 3*sizeof(DWORD)); }
void setVerts(int a, int b, int c) { v[0]=a; v[1]=b; v[2]=c; }
DllExport void setEdgeVis(int edge, int visFlag);
DllExport void setEdgeVisFlags(int va, int vb, int vc);
int getEdgeVis(int edge){ return flags & (VIS_BIT << edge); }
DWORD getVert(int index) { return v[index]; }
DWORD * getAllVerts(void) { return v; }
BOOL Hidden() {return flags&FACE_HIDDEN?TRUE:FALSE;}
void Hide() {flags|=FACE_HIDDEN;}
void Show() {flags&=~FACE_HIDDEN;}
void SetHide(BOOL hide) {if (hide) Hide(); else Show();}
DllExport DWORD GetOtherIndex (DWORD v0, DWORD v1);
DllExport DWORD GetEdgeIndex (DWORD v0, DWORD v1);
DllExport int Direction (DWORD v0, DWORD v1);
DllExport DWORD GetVertIndex (DWORD v0);
DllExport void OrderVerts (DWORD & v0, DWORD & v1); // switches v0,v1 if needed to put them in face-order.
};
// This is used both for UVWs and color verts
class TVFace {
public:
DWORD t[3]; // indices into tVerts
TVFace() {}
TVFace(DWORD a, DWORD b, DWORD c) {t[0]=a; t[1]=b; t[2]=c;}
void setTVerts(DWORD *vrt){ memcpy(t, vrt, 3*sizeof(DWORD)); }
void setTVerts(int a, int b, int c) { t[0]=a; t[1]=b; t[2]=c; }
DWORD getTVert(int index) { return t[index]; }
DWORD * getAllTVerts(void) { return t; }
DllExport DWORD GetVertIndex (DWORD v0);
DllExport DWORD GetOtherIndex (DWORD v0, DWORD v1);
DllExport int Direction (DWORD v0, DWORD v1);
DllExport void OrderVerts (DWORD & v0, DWORD & v1); // switches v0,v1 if needed to put them in face-order.
};
// MeshMap stuff:
#define MAX_MESHMAPS 100
#define MESHMAP_USED 0x0001
#define MESHMAP_TEXTURE 0x0002
#define MESHMAP_VERTCOLOR 0x0004
#define MESHMAP_USER 0x0100
class MeshMap {
public:
DWORD flags;
UVVert *tv;
TVFace *tf;
int vnum, fnum;
MeshMap () { flags=0x0; tv=NULL; tf=NULL; vnum = fnum = 0; }
~MeshMap () { if (tv) delete [] tv; if (tf) delete [] tf; }
int getNumVerts () { return vnum; }
DllExport void setNumVerts (int vn, BOOL keep=FALSE);
int getNumFaces () { return fnum; }
DllExport void setNumFaces (int fn, BOOL keep=FALSE, int oldCt=0);
void Clear () { if (tv) delete [] tv; if (tf) delete [] tf; tv=NULL; tf=NULL; vnum = fnum = 0; }
DllExport BitArray GetIsoVerts ();
DllExport void DeleteVertSet (BitArray set, BitArray *delFace=NULL);
DllExport void DeleteFaceSet (BitArray set, BitArray *isoVert=NULL);
void SetFlag (DWORD fl) { flags |= fl; }
void ClearFlag (DWORD fl) { flags &= ~fl; }
BOOL GetFlag (DWORD fl) { return (flags & fl) ? TRUE : FALSE; }
BOOL IsUsed () { return (flags & MESHMAP_USED) ? TRUE : FALSE; }
DllExport void SwapContents (MeshMap & from);
DllExport MeshMap & operator= (MeshMap & from);
};
// Following is used for arbitrary per-element info in meshes, such as weighted verts
// or weighted vert selections. Methods are deliberately made to look like Tab<> methods.
// For per-vertex info: set a maximum, and reserve first ten channels
// for Discreet's use only.
#define MAX_VERTDATA 100
#define VDATA_USER 10 // Third parties should use this channel or higher.
// Indices of important per-vertex data
#define VDATA_SELECT 0 // Soft Selection
#define VDATA_WEIGHT 1 // Vertex weights (for NURMS MeshSmooth)
#define VDATA_ALPHA 2 // Vertex Alpha values
// Related constants:
#define MAX_WEIGHT ((float)1e5)
#define MIN_WEIGHT ((float)1e-5)
// Types of data
#define PERDATA_TYPE_FLOAT 0
// Vertex-specific methods:
DllExport int VertexDataType (int vdID);
DllExport void *VertexDataDefault (int vdID);
class PerData {
public:
int dnum, type, alloc;
void *data;
PerData () { data=NULL; dnum=0; alloc=0; type=0; }
PerData (int n, int tp) { data=NULL; dnum=0; alloc=0; type=tp; setAlloc (n, FALSE); }
~PerData () { Clear (); }
// Following only depend on type:
DllExport void *AllocData (int num);
DllExport void FreeData (void *addr);
DllExport int DataSize ();
void *Addr (void *ptr, int at) { BYTE *vd=(BYTE *)ptr; return (void *)(vd+at*DataSize()); }
void *Addr (int at) { return Addr(data,at); }
DllExport void CopyData (void *to, void *from, int num=1);
void CopyData ( int to, int from, int num=1) { CopyData (Addr(to), Addr(from), num); }
DllExport void WeightedSum (void *to, void *fr1, float prop1, void *fr2, float prop2);
void WeightedSum (int to, int fr1, float prop1, int fr2, float prop2) { WeightedSum (Addr(to), Addr(fr1), prop1, Addr(fr2), prop2); }
DllExport void setAlloc (int num, BOOL keep=TRUE);
void SetCount (int num, BOOL keep = FALSE) { setAlloc (num, keep); dnum=num; }
void Shrink () { if (alloc>dnum) setAlloc(dnum); }
int Count () { return dnum; }
DllExport void Clear ();
DllExport void DeleteSet (BitArray del);
DllExport void Delete (int at, int num);
DllExport void Insert (int at, int num, void *el);
DllExport void Append (int num, void *el);
DllExport void InsertCopies (int at, int num, void *el);
DllExport void AppendCopies (int num, void *el);
DllExport void SwapContents (PerData & from);
DllExport PerData & operator= (const PerData & from);
DllExport void MyDebugPrint ();
};
// Mesh::flags definitions
#define MESH_EDGE_LIST (1<<1)
// Set this to prevent renderData from being deleted (except when mesh is deleted)
#define MESH_LOCK_RENDDATA (1<<2)
#define MESH_SMOOTH_BIT1 (1<<3)
#define MESH_SMOOTH_BIT2 (1<<4)
#define MESH_SMOOTH_BIT3 (1<<5)
#define MESH_SMOOTH_BIT4 (1<<6)
#define MESH_SMOOTH_MASK 0x78 // mask for SMOOTH_BIT's 1 thru 4
#define MESH_BEEN_DSP (1<<9)
#define MESH_SMOOTH_SUBSEL (1<<10)
#define COMP_TRANSFORM 0x0001 // forces recalc of model->screen transform; else will attempt to use cache
#define COMP_IGN_RECT 0x0002 // forces all polys to be rendered; else only those intersecting the box will be
#define COMP_LIGHTING 0x0004 // forces re-lighting of all verts (as when a light moves); else only relight moved verts
#define COMP_ALL 0x00ff
// If this bit is set then the node being displayed by this mesh is selected.
// Certain display flags only activate when this bit is set.
#define COMP_OBJSELECTED (1<<8)
#if 0 // moved to gfx.h
// strip-related stuff
class Strip {
public:
MtlID mID;
DWORD smGrp;
DWTab v;
void AddVert(DWORD vtx) { v.Append(1, &vtx); }
DWTab tv;
void AddVert(DWORD vtx, DWORD tvtx) { v.Append(1, &vtx); tv.Append(1, &tvtx); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -