/********************************************************************** *< FILE: triobjed.h DESCRIPTION: Editable Triangle Mesh Object CREATED BY: Rolf Berteig HISTORY: created 4 March 1996 *> Copyright (c) 1996, All Rights Reserved. **********************************************************************/ #ifndef __TRIOBJED__ #define __TRIOBJED__ #include "meshadj.h" typedef Tab Point3Tab; #ifdef _SUBMTLASSIGNMENT #include "sbmtlapi.h" #endif // Selection levels #define SL_OBJECT 0 #define SL_VERTEX 1 #define SL_FACE 2 #define SL_EDGE 3 #define ALIGN_CONST 0 #define ALIGN_VIEW 1 #define DEF_PICKBOX_SIZE 4 class WeldVertCMode; class CreateVertCMode; class BuildFaceCMode; class DivideEdgeCMode; class TurnEdgeCMode; class AttachPickMode; class ExtrudeCMode; class AlignFaceCMode; class FlipNormCMode; class CutEdgeCMode; // SCA #define CID_CREATEVERT CID_USER + 973 #define CID_BUILDFACE CID_USER + 975 #define CID_WELDVERT CID_USER + 978 #define CID_DIVIDEEDGE CID_USER + 979 #define CID_TURNEDGE CID_USER + 980 #define CID_EXTRUDE CID_USER + 990 #define CID_ALIGNFACE CID_USER + 1000 #define CID_FLIPNORM CID_USER + 1010 #define CID_CUTEDGE CID_USER + 1020 // SCA #define SELTYPE_SINGLE 1 #define SELTYPE_POLY 2 #define SELTYPE_ELEMENT 3 #define IDC_SELSINGLE 0x4010 #define IDC_SELPOLY 0x4011 #define IDC_SELELEMENT 0x4012 #define MAX_MATID 0xffff class NamedSelSetList { public: Tab sets; Tab names; ~NamedSelSetList(); BitArray &operator[](int i) {return *sets[i];} int Count() {return sets.Count();} void AppendSet(BitArray &nset,TSTR &name); void DeleteSet(int i); IOResult Load(ILoad *iload); IOResult Save(ISave *isave); void SetSize(int size); NamedSelSetList& operator=(NamedSelSetList& from); void DeleteSetElements(BitArray &set,int m=1); int FindSet(TSTR &name); }; #ifdef _SUBMTLASSIGNMENT class EditTriObject : public TriObject, public EventUser, public ISubMtlAPI { #else class EditTriObject : public TriObject, public EventUser { #endif public: // Class vars static HWND hParams1; static HWND hParams2; static HACCEL hAccel; static Interface *ip; static MoveModBoxCMode *moveMode; static RotateModBoxCMode *rotMode; static UScaleModBoxCMode *uscaleMode; static NUScaleModBoxCMode *nuscaleMode; static SquashModBoxCMode *squashMode; static SelectModBoxCMode *selectMode; static WeldVertCMode *weldVertMode; static CreateVertCMode *createVertMode; static BuildFaceCMode* buildFaceMode; static TurnEdgeCMode* turnEdgeMode; static DivideEdgeCMode* divideEdgeMode; static AttachPickMode* attachPickMode; static ExtrudeCMode* extrudeMode; static AlignFaceCMode* alignFaceMode; static FlipNormCMode* flipMode; static CutEdgeCMode * cutEdgeMode; // SCA static float falloff, pinch, bubble; static int selType; static float normScale; static BOOL selByVert; static BOOL inBuildFace; static BOOL faceUIValid; static BOOL inNormalMove; static BOOL ignoreBackfaces, ignoreBackedges; static BOOL ignoreVisEdge; static int pickBoxSize; static int weldBoxSize; static int attachMat; static BOOL condenseMat; static bool sliceSplit, cutQuadSafe, cutRefine; static Quat sliceRot; static Point3 sliceCenter; static float sliceSize; static bool sliceMode; // Cache for computing coord. systems static FaceClusterList *clust; static Point3Tab *centers; static Point3Tab *normals; static DWORDTab *vclust; static Tab *distTab; Point3Tab &CoordCenters(); Point3Tab &CoordNormals(); DWORDTab &VertClusters(); Tab *EdgeDistTab(int iterations); void FreeDistTab(); void FreeCoordCaches(); void MakeClusterList(); void InvalidateCoordCaches(BOOL selChange=FALSE); NamedSelSetList vselSet; NamedSelSetList fselSet; NamedSelSetList eselSet; Tab cont; EditTriObject(); // Animatable methods void DeleteThis() {delete this;} Class_ID ClassID() {return Class_ID(EDITTRIOBJ_CLASS_ID,0);} void GetClassName(TSTR& s) ;//{s = GetString(IDS_RB_EDITABLEMESH);} void BeginEditParams(IObjParam *ip, ULONG flags,Animatable *prev); void EndEditParams(IObjParam *ip, ULONG flags,Animatable *next); int NumSubs() {return cont.Count();} Animatable* SubAnim(int i); TSTR SubAnimName(int i); BOOL AssignController(Animatable *control,int subAnim); int SubNumToRefNum(int subNum) {return subNum;} BOOL SelectSubAnim(int subNum); // Reference methods int NumRefs() {return cont.Count();} RefTargetHandle GetReference(int i); void SetReference(int i, RefTargetHandle rtarg); void CreateContArray(); void SynchContArray(); //BOOL BypassTreeView(); void DeletePointConts(BitArray &set); void PlugControllersSel(TimeValue t,BitArray &set); BOOL PlugControl(TimeValue t,int i); void SetPointAnim(TimeValue t, int i, Point3 pt); BOOL CloneVertCont(int from, int to); RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message); // BaseObject methods ObjectState Eval(TimeValue time); void Transform(TimeValue t, Matrix3& partm, Matrix3 tmAxis, BOOL localOrigin, Matrix3 xfrm, BOOL ar, int type); void Move(TimeValue t, Matrix3& partm, Matrix3& tmAxis, Point3& val, BOOL localOrigin=FALSE); void Rotate(TimeValue t, Matrix3& partm, Matrix3& tmAxis, Quat& val, BOOL localOrigin=FALSE); void Scale(TimeValue t, Matrix3& partm, Matrix3& tmAxis, Point3& val, BOOL localOrigin=FALSE); void TransformStart(TimeValue t) {if (ip) ip->LockAxisTripods(TRUE);} void TransformFinish(TimeValue t) {if (ip) ip->LockAxisTripods(FALSE); InvalidateCoordCaches(); FreeDistTab();} void TransformCancel(TimeValue t) {if (ip) ip->LockAxisTripods(FALSE); FreeDistTab();} int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags); void GetWorldBoundBox (TimeValue t, INode * inode, ViewExp* vp, Box3& box); void GetLocalBoundBox (TimeValue t, INode* inode, ViewExp* vp, Box3& box); int HitTest(TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc); void CloneSelSubComponents(TimeValue t); void AcceptCloneSelSubComponents(TimeValue t); void SelectSubComponent( HitRecord *hitRec, BOOL selected, BOOL all, BOOL invert=FALSE); void ClearSelection(int selLevel); void SelectAll(int selLevel); void InvertSelection(int selLevel); void ActivateSubobjSel(int level, XFormModes& modes ); void GetSubObjectCenters(SubObjAxisCallback *cb,TimeValue t,INode *node,ModContext *mc); void GetSubObjectTMs(SubObjAxisCallback *cb,TimeValue t,INode *node,ModContext *mc); // Object methods TCHAR *GetObjectName() ;//{ return GetString(IDS_RB_EDITABLEMESH);} BOOL IsSubClassOf(Class_ID classID); BOOL SupportsNamedSubSels() {return TRUE;} void ActivateSubSelSet(TSTR &setName); void NewSetFromCurSel(TSTR &setName); void RemoveSubSelSet(TSTR &setName); void SetupNamedSelDropDown(); int NumNamedSelSets(); TSTR GetNamedSelSetName(int i); void SetNamedSelSetName(int i,TSTR &newName); void NewSetByOperator(TSTR &newName,Tab &sets,int op); // Reference methods RefTargetHandle Clone(RemapDir& remap = NoRemap()); IOResult Load(ILoad *iload); IOResult Save(ISave *isave); // From EventUser void Notify() {DeleteSelected();/*delete key was pressed*/} // Local methods void VertsHaveBeenDeleted(BitArray &set); NamedSelSetList &GetSelSet(); void KeyboardAccelerator(int id); void RemoveRollupPages(); void SetRollupPages(); int GetSubobjectLevel(); void SetSubobjectLevel(int level); void SetSelType(int type); void HoldVerts(); void HoldTopology(); void DeleteSelected(); Point3 CalcRegionAffect(Point3 v,Point3 center,Point3 delta); Point3 CalcRegionAffect(float dist,Point3 delta); void DeleteVertSet(BitArray set); void DeleteFaceSet(BitArray set, BitArray *isoVert); void HideSelectedVerts(); void UnhideAllVerts(); void HideSelectedFaces(); void UnhideAllFaces(); BOOL WeldSelectedVerts(float thresh); void WeldSelectedVerts(Point3 pt); void CollapseSelectedVerts(); void CollapseSelFaces(); void CollapseSelEdges(); void WeldVertSet(BitArray set,Point3 *weldPoint=NULL); void AddNewVertex(Point3 pt); void BuildNewFace(int *v); void MakePlanar(); float GetPolyFaceThesh(); HitRecord *VertHitsToFaceHits(HitRecord *hitRec,BOOL all); DWORD GetSelSmoothBits(DWORD &invalid); void SetSelSmoothBits(DWORD bits,DWORD which); void SelectBySmoothGroup(DWORD bits,BOOL clear); void AutoSmooth(float thresh); DWORD GetUsedSmoothBits(); int GetSelMatIndex(); void SetSelMatIndex(int index); void SelectByMat(int index,BOOL clear); void InvalidateSurfaceUI(); void FlipSelNormals(); void FlipANormal(int ix); void UnifySelNormals(); void DetachVertFaces(TSTR &name,BOOL doFaces,BOOL del=TRUE,BOOL elem=FALSE); void ShowNormals(); void SetSelEdgeVis(BOOL onOff); void AutoEdge(float angle); void AttachObject(INode *node); void MultiAttachObject(INodeTab &nodeTab); void TesselateFaces(float tens,BOOL edge); void ExplodeFaces(float thresh, BOOL objs, TSTR &name); void DoExtrude(); void StartExtrudeMode(); void BeginNormalMove(TimeValue t); void EndNormalMove(TimeValue t,BOOL accept); void NormalMove(TimeValue t, float amount); void CloneSelVerts(); void CloneSelFaces(BitArray &set); void BreakVerts(); void RemoveIsoVerts(); void AlignVertsTo(int which); void AlignFacesTo(int which,DWORD f); Matrix3 ComputeAlignTM(int which, float &zcent); void SetEdgeVisCheckState(); void NSCopy(); void NSPaste(); BOOL GetUniqueSetName(TSTR &name); int SelectNamedSet(); void SelectByNormal(BOOL front); void SetNumSelLabel(); Color GetSelVertColor(); void SetSelVertColor(Color c); void SelectVertByColor(Point3 selcol,int selDeltaR,int selDeltaG,int selDeltaB,BOOL add,BOOL sub); BOOL AllocateVertColor(); BOOL SplitSharedVertCol(); void CreateCurveFromEdge(TSTR name,int curveType,BOOL ignoreHiddenEdges); void SelectOpenEdges(); BOOL DoAttachMatOptionDialog(); int DoCut (Point3 & viewNorm, DWORD e1, float prop1, DWORD e2, float prop2); // SCA void Slice (); void EnterSliceMode (HWND hwnd); void ExitSliceMode (HWND hwnd); #ifdef _SUBMTLASSIGNMENT void* GetInterface(ULONG id); MtlID GetNextAvailMtlID(); BOOL HasFaceSelection(); void SetSelFaceMtlID(MtlID id, BOOL bResetUnsel = FALSE); int GetSelFaceUniqueMtlID(); int GetSelFaceAnyMtlID(); int GetMaxMtlID(); #endif }; // --- Command Modes ----------------------------------------------- class ExtrudeMouseProc : public MouseCallBack { private: MoveTransformer moveTrans; EditTriObject *eo; Interface *ip; IPoint2 om; public: ExtrudeMouseProc(EditTriObject* o, IObjParam *i) : moveTrans(i) {eo=o;ip=i;} int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); }; class ExtrudeSelectionProcessor : public GenModSelectionProcessor { protected: HCURSOR GetTransformCursor(); public: ExtrudeSelectionProcessor(ExtrudeMouseProc *mc, EditTriObject *o, IObjParam *i) : GenModSelectionProcessor(mc,o,i) {} }; class ExtrudeCMode : public CommandMode { private: ChangeFGObject fgProc; ExtrudeSelectionProcessor mouseProc; ExtrudeMouseProc eproc; EditTriObject* eo; public: ExtrudeCMode(EditTriObject* o, IObjParam *i) : fgProc(o), mouseProc(&eproc,o,i), eproc(o,i) {eo=o;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_EXTRUDE; } MouseCallBack *MouseProc(int *numPoints) { *numPoints=2; return &mouseProc; } ChangeForegroundCallback *ChangeFGProc() { return &fgProc; } BOOL ChangeFG( CommandMode *oldMode ) { return oldMode->ChangeFGProc() != &fgProc; } void EnterMode(); void ExitMode(); }; class AttachPickMode : public PickModeCallback, public PickNodeCallback { public: EditTriObject* eo; IObjParam *ip; AttachPickMode(EditTriObject* o, IObjParam *i) {eo=o;ip=i;} BOOL HitTest(IObjParam *ip,HWND hWnd,ViewExp *vpt,IPoint2 m,int flags); BOOL Pick(IObjParam *ip,ViewExp *vpt); void EnterMode(IObjParam *ip); void ExitMode(IObjParam *ip); BOOL Filter(INode *node); BOOL RightClick(IObjParam *ip,ViewExp *vpt) {return TRUE;} PickNodeCallback *GetFilter() {return this;} }; class WeldVertMouseProc : public MoveModBox { private: EditTriObject *et; IObjParam *ip; public: WeldVertMouseProc(EditTriObject* e, IObjParam *i) : MoveModBox(e,i) {et=e;ip=i;} BOOL HitTestVerts(IPoint2 &m, ViewExp *vpt,int &v); int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); }; class WeldVertSelectionProcessor : public GenModSelectionProcessor { protected: HCURSOR GetTransformCursor(); public: WeldVertSelectionProcessor(WeldVertMouseProc *mc, Object *o, IObjParam *i) : GenModSelectionProcessor(mc,o,i) {} }; class WeldVertCMode : public CommandMode { private: ChangeFGObject fgProc; WeldVertSelectionProcessor mouseProc; WeldVertMouseProc eproc; EditTriObject* et; public: WeldVertCMode(EditTriObject* mod, IObjParam *i) : fgProc(mod), mouseProc(&eproc,mod,i), eproc(mod,i) {et=mod;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_WELDVERT; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=2; return &mouseProc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc; } BOOL ChangeFG( CommandMode *oldMode ) {return oldMode->ChangeFGProc() != &fgProc;} void EnterMode(); void ExitMode(); }; class CreateVertMouseProc : public MouseCallBack { private: EditTriObject *et; IObjParam *ip; public: CreateVertMouseProc(EditTriObject* mod, IObjParam *i) {et=mod;ip=i;} int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); }; class CreateVertCMode : public CommandMode { private: ChangeFGObject fgProc; CreateVertMouseProc proc; EditTriObject* et; public: CreateVertCMode(EditTriObject* mod, IObjParam *i) : fgProc(mod), proc(mod,i) {et=mod;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_CREATEVERT; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=1; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; class BuildFaceMouseProc : public MouseCallBack { private: EditTriObject *et; IObjParam *ip; int vts[3]; IPoint3 mpts[3]; int pt; IPoint2 lm; public: BuildFaceMouseProc(EditTriObject* e, IObjParam *i); void DrawFace(HWND hWnd,IPoint2 &m); BOOL HitTestVerts(IPoint2 &m, ViewExp *vpt,int &v); int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); }; class BuildFaceCMode : public CommandMode { private: ChangeFGObject fgProc; BuildFaceMouseProc proc; EditTriObject *et; public: BuildFaceCMode(EditTriObject* e, IObjParam *i) : fgProc(e), proc(e,i) {et=e;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_BUILDFACE; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=999999; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; class AlignFaceMouseProc : public MouseCallBack { public: EditTriObject *et; IObjParam *ip; int which; AlignFaceMouseProc(EditTriObject* e, IObjParam *i) {et=e;ip=i;which=ALIGN_CONST;} HitRecord *HitTestFaces(IPoint2 &m, ViewExp *vpt); int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); }; class AlignFaceCMode : public CommandMode { public: ChangeFGObject fgProc; AlignFaceMouseProc proc; EditTriObject* et; AlignFaceCMode(EditTriObject* e, IObjParam *i) : fgProc(e), proc(e,i ) {et=e;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_ALIGNFACE; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=1; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; class FlipNormMouseProc : public MouseCallBack { public: EditTriObject *et; IObjParam *ip; FlipNormMouseProc(EditTriObject* e, IObjParam *i) {et=e;ip=i;} HitRecord *HitTestFaces(IPoint2 &m, ViewExp *vpt); int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); }; class FlipNormCMode : public CommandMode { public: ChangeFGObject fgProc; FlipNormMouseProc proc; EditTriObject* et; FlipNormCMode(EditTriObject* e, IObjParam *i) : fgProc(e), proc(e,i ) {et=e;} int Class() {return MODIFY_COMMAND;} int ID() {return CID_FLIPNORM;} MouseCallBack *MouseProc(int *numPoints) {*numPoints=1; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; class PickEdgeMouseProc : public MouseCallBack { public: EditTriObject *et; IObjParam *ip; PickEdgeMouseProc(EditTriObject* e, IObjParam *i) {et=e;ip=i;} HitRecord *HitTestEdges(IPoint2 &m, ViewExp *vpt); int proc( HWND hwnd, int msg, int point, int flags, IPoint2 m ); virtual void EdgePick(DWORD edge)=0; }; class DivideEdgeProc : public PickEdgeMouseProc { public: DivideEdgeProc(EditTriObject* e, IObjParam *i) : PickEdgeMouseProc(e,i) {} void EdgePick(DWORD edge); }; class TurnEdgeProc : public PickEdgeMouseProc { public: TurnEdgeProc(EditTriObject* e, IObjParam *i) : PickEdgeMouseProc(e,i) {} void EdgePick(DWORD edge); }; class DivideEdgeCMode : public CommandMode { private: ChangeFGObject fgProc; DivideEdgeProc proc; EditTriObject* et; public: DivideEdgeCMode(EditTriObject* e, IObjParam *i) : fgProc(e), proc(e,i) {et=e;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_DIVIDEEDGE; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=1; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; class TurnEdgeCMode : public CommandMode { private: ChangeFGObject fgProc; TurnEdgeProc proc; EditTriObject* et; public: TurnEdgeCMode(EditTriObject* e, IObjParam *i) : fgProc(e), proc(e,i) {et=e;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_TURNEDGE; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=1; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; class CutEdgeProc : public MouseCallBack { // SCA -- derived from DivideEdgeProc. public: EditTriObject *et; IObjParam *ip; DWORD e1; bool e1set; float prop1; IPoint2 m1, oldm2; CutEdgeProc(EditTriObject* e, IObjParam *i) { et=e; ip=i; e1set = FALSE;} HitRecord *HitTestEdges(IPoint2 &m, ViewExp *vpt); int proc(HWND hwnd, int msg, int point, int flags, IPoint2 m ); void DrawCutter (HWND hWnd,IPoint2 &m); }; class CutEdgeCMode : public CommandMode { // SCA private: ChangeFGObject fgProc; CutEdgeProc proc; EditTriObject* et; public: CutEdgeCMode(EditTriObject* e, IObjParam *i) : fgProc(e), proc(e,i) {et=e;} int Class() { return MODIFY_COMMAND; } int ID() { return CID_CUTEDGE; } MouseCallBack *MouseProc(int *numPoints) {*numPoints=20; return &proc;} ChangeForegroundCallback *ChangeFGProc() {return &fgProc;} BOOL ChangeFG(CommandMode *oldMode) {return oldMode->ChangeFGProc()!= &fgProc;} void EnterMode(); void ExitMode(); }; // --- Restore objects --------------------------------------------- class MeshSelRestore : public RestoreObj { public: BitArray undo, redo; EditTriObject *et; int level; MeshSelRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); TSTR Description() {return TSTR(_T("Mesh Sel"));} }; class MeshVertRestore : public RestoreObj { public: Tab undo, redo; EditTriObject *et; MeshVertRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); void EndHold() {et->ClearAFlag(A_HELD);} TSTR Description() {return TSTR(_T("Mesh Vert"));} }; class MeshVertColorRestore : public RestoreObj { public: Tab undo, redo; EditTriObject *et; MeshVertColorRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); void EndHold() {et->ClearAFlag(A_HELD);} TSTR Description() {return TSTR(_T("Mesh Vert Color"));} }; class MeshTopoRestore : public RestoreObj { public: EditTriObject *et; Tab uverts, rverts; Tab uTverts, rTverts; Tab ufaces, rfaces; Tab utvFaces, rtvFaces; Tab uvertCol, rvertCol; Tab uvcFaces, rvcFaces; BitArray uvertSel, ufaceSel, uedgeSel, uvertHide; BitArray rvertSel, rfaceSel, redgeSel, rvertHide; BOOL undone; Tab ucont, rcont; MeshTopoRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); void EndHold() {et->ClearAFlag(A_HELD);} TSTR Description() {return TSTR(_T("Mesh Topo"));} }; class MeshVertHideRestore : public RestoreObj { public: BitArray undo, redo; EditTriObject *et; MeshVertHideRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); TSTR Description() {return TSTR(_T("Mesh Vert Hide"));} }; class MeshFaceHideRestore : public RestoreObj { public: BitArray undo, redo; EditTriObject *et; MeshFaceHideRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); TSTR Description() {return TSTR(_T("Mesh Face Hide"));} }; class MeshFaceMatRestore : public RestoreObj { public: Tab undo, redo; EditTriObject *et; MeshFaceMatRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); void EndHold() {et->ClearAFlag(A_HELD);} TSTR Description() {return TSTR(_T("Mesh Face Mat"));} }; class MeshFaceSmoothRestore : public RestoreObj { public: Tab undo, redo; EditTriObject *et; MeshFaceSmoothRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); void EndHold() {et->ClearAFlag(A_HELD);} TSTR Description() {return TSTR(_T("Mesh Face Smooth"));} }; class MeshEdgeVisRestore : public RestoreObj { public: Tab undo, redo; EditTriObject *et; MeshEdgeVisRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); void EndHold() {et->ClearAFlag(A_HELD);} TSTR Description() {return TSTR(_T("Mesh Edge Vis"));} }; class FaceIndexRec { public: DWORD v[3], flags; }; class UVFaceIndexRec { public: DWORD v[3]; }; class MeshFaceIndexRestore : public RestoreObj { public: Tab undo, redo; Tab tundo, tredo; EditTriObject *et; MeshFaceIndexRestore(EditTriObject *et); void Restore(int isUndo); void Redo(); TSTR Description() {return TSTR(_T("Mesh Face Index"));} }; class AppendSetRestore : public RestoreObj { public: BitArray set; TSTR name; NamedSelSetList *setList; EditTriObject *et; AppendSetRestore(NamedSelSetList *sl,EditTriObject *e) { setList = sl; et = e; } void Restore(int isUndo) { set = *setList->sets[setList->Count()-1]; name = *setList->names[setList->Count()-1]; setList->DeleteSet(setList->Count()-1); if (et->ip) et->ip->NamedSelSetListChanged(); } void Redo() { setList->AppendSet(set,name); if (et->ip) et->ip->NamedSelSetListChanged(); } TSTR Description() {return TSTR(_T("Append Set"));} }; class DeleteSetRestore : public RestoreObj { public: BitArray set; TSTR name; int index; NamedSelSetList *setList; EditTriObject *et; DeleteSetRestore(int i,NamedSelSetList *sl,EditTriObject *e) { setList = sl; et = e; index = i; set = *setList->sets[index]; name = *setList->names[index]; } void Restore(int isUndo) { BitArray *n = new BitArray(set); TSTR *nm = new TSTR(name); setList->sets.Insert(index,1,&n); setList->names.Insert(index,1,&nm); if (et->ip) et->ip->NamedSelSetListChanged(); } void Redo() { setList->DeleteSet(index); if (et->ip) et->ip->NamedSelSetListChanged(); } TSTR Description() {return TSTR(_T("Delete Set"));} }; class SetNameRestore : public RestoreObj { public: TSTR undo, redo; int index; NamedSelSetList *setList; EditTriObject *et; SetNameRestore(int i,NamedSelSetList *sl,EditTriObject *e) { index = i; setList = sl; et = e; undo = *setList->names[index]; } void Restore(int isUndo) { redo = *setList->names[index]; *setList->names[index] = undo; if (et->ip) et->ip->NamedSelSetListChanged(); } void Redo() { *setList->names[index] = redo; if (et->ip) et->ip->NamedSelSetListChanged(); } TSTR Description() {return TSTR(_T("Set Name"));} }; class AttachHitByName : public HitByNameDlgCallback { public: EditTriObject *eo; AttachHitByName(EditTriObject *e) {eo=e;} TCHAR *dialogTitle();// {return GetString(IDS_RB_MULTIATTACH);} TCHAR *buttonText();// {return GetString(IDS_RB_ATTACH);} int filter(INode *node); void proc(INodeTab &nodeTab); }; // --- tridata.cpp functions --------------------------------------- float AffectRegionFunction(float dist,float falloff,float pinch,float bubble); Point3 FaceNormal(Mesh &mesh, DWORD fi); Point3 FaceCenter(Mesh &mesh, DWORD fi); BOOL AnyFaceVertSelected(Mesh &mesh, DWORD fi); Point3 AverageSelVertNormal(Mesh& mesh); Point3 AverageSelVertCenter(Mesh& mesh); void BuildAverageNormals(Mesh& mesh, Point3Tab& normals); void MatrixFromNormal(Point3& normal, Matrix3& mat); void BitArrayDeleteSet(BitArray &ba,BitArray &set,int m=1); void MeshDeleteVertices(Mesh &mesh,BitArray& set); void MeshDeleteFaces(Mesh &mesh,BitArray& set); void PolyFromFace(Mesh& mesh,AdjFaceList &al,DWORD f,BitArray &set,float thresh,BOOL ignoreVisEdge); void ElementFromFace(Mesh &mesh, AdjFaceList &al,DWORD f, BitArray &set); AdjFaceList *BuildAdjFaceList(Mesh &mesh); int GetEdgeIndex(Face &f,DWORD v0,DWORD v1); DWORD GetOtherIndex(Face *f,DWORD v0,DWORD v1); float AngleBetweenFaces(Mesh *mesh,DWORD f0, DWORD f1); void FaceCenterTessellate(Mesh *mesh); void EdgeTessellate(Mesh *mesh, AdjEdgeList *ae, AdjFaceList *af, float tens); BOOL IsEdgeSelected(MEdge edge,Face *faces,BitArray &esel); BOOL IsFaceSelected(MEdge edge,BitArray &fsel); BOOL IsEdgeVisible(MEdge edge,Face *faces); Point3 ButterFlySubdivide(MEdge edg,Mesh *mesh,AdjFaceList *af,float tens); Point3 EdgeCenter(MEdge edge,Point3 *verts); void ElemExplodeFaces(Mesh *mesh, float thresh, AdjFaceList *af); void ObjExplodeFaces(EditTriObject *eo, INode *node, TSTR &name, Interface *ip, Mesh *mesh, float thresh, AdjFaceList *af); void SwapEdgeVerts(Face *f,DWORD& v1,DWORD& v2); DWORD GetFaceVertIndex(Face &f,DWORD v); void EdgeTessellate(Mesh *mesh, AdjEdgeList *ae, AdjFaceList *af, float tens); void ExtrudeFaces(EditTriObject *eo, Mesh& mesh, BitArray& sel, AdjEdgeList& el, BOOL doFace); BOOL GetDetachObjectName(HWND hDlg,TSTR &name, BOOL &elem); void DeselectHiddenFaces(Mesh &mesh); void SyncSelectionSets(Mesh &mesh); #endif //__TRIOBJED__