/********************************************************************** *< FILE: polyshp.h DESCRIPTION: Polyline shape methods CREATED BY: Tom Hudson HISTORY: Created 3 October 1995 *> Copyright (c) 1995, All Rights Reserved. **********************************************************************/ #ifndef __POLYSHP_H_ #define __POLYSHP_H_ #include "shphier.h" #include "captypes.h" #include "shpsels.h" // Shape selection classes #include "templt.h" // Display flags #define DISP_VERTTICKS (1<<0) //#define DISP_BEZHANDLES (1<<1) #define DISP_SELVERTS (1<<10) #define DISP_SELSEGMENTS (1<<11) #define DISP_SELPOLYS (1<<13) // Snap flags #define PSHAPE_SNAP_IGNORELAST (1<<0) #define PSHAPE_SNAP_NOEDGES (1<<1) // Selection level bits. #define SHAPE_OBJECT (1<<0) #define SHAPE_SPLINE (1<<1) #define SHAPE_SEGMENT (1<<2) #define SHAPE_VERTEX (1<<3) // Parameter types for shape interpolation (Must match interpolation types in object.h) #define POLYSHP_INTERP_SIMPLE 0 // Parameter space based on segments #define POLYSHP_INTERP_NORMALIZED 1 // Parameter space normalized to curve length // Flags for sub object hit test // NOTE: these are the same bits used for object level. #define SUBHIT_SHAPE_SELONLY (1<<0) #define SUBHIT_SHAPE_UNSELONLY (1<<2) #define SUBHIT_SHAPE_ABORTONHIT (1<<3) #define SUBHIT_SHAPE_SELSOLID (1<<4) #define SUBHIT_SHAPE_VERTS (1<<24) #define SUBHIT_SHAPE_SEGMENTS (1<<25) #define SUBHIT_SHAPE_POLYS (1<<26) #define SUBHIT_SHAPE_TYPEMASK (SUBHIT_SHAPE_VERTS|SUBHIT_SHAPE_SEGMENTS|SUBHIT_SHAPE_POLYS) class Spline3D; //-------------------------------------------------------------- // Capping classes, etc. // CapVert flags #define CAPVERT_VISEDGE (1<<0) class CapVert { public: int vert; DWORD flags; float ang; CapVert *prev,*next; CapVert *smaller,*bigger; CapVert() { vert=0; flags = 0; ang = 0.0f; prev=next=smaller=bigger = NULL; } }; //-------------------------------------------------------------- // Predefined PolyPt flags // Bits 0-7 are available to the user. Bits 8-31 are reserved for internal use // Use these to make capping more efficient // If your class converts to a PolyLine, use them! #define POLYPT_KNOT (1<<8) // A control point #define POLYPT_INTERPOLATED (1<<9) // An interpolated point // If you convert to a PolyLine, use this bit to control smoothing of the resulting shape // If this bit is set, it means that any mesh generated will share smoothing across the edge #define POLYPT_SMOOTH (1<<10) // Point is part of a smooth transition #define POLYPT_SEG_SELECTED (1<<11) // The segment that starts with this point is selected // Used internally by capping code #define POLYPT_BRIDGE (1<<16) // Span between two polygons #define POLYPT_SPLICE (1<<17) // Point is endpoint of a bridge #define POLYPT_VISEDGE (1<<18) // Segment should be visible on mesh #define POLYPT_NO_SPLICE (1<<19) // Don't allow a bridge at this point #define POLYPT_INVIS_EDGE (1<<20) // Force segment to be invisible on capping #define POLYPT_NO_SNAP (1<<21) // Suppress snapping when set // Flags2 field contains material IDs: // The mat ID is stored in the HIWORD of the PolyPt flags2 field #define POLYPT_MATID_SHIFT 16 #define POLYPT_MATID_MASK 0xFFFF class PolyPt { public: Point3 p; DWORD flags; // See above DWORD flags2; // See above int aux; // Auxiliary data attached to this point (usually mesh vertex number for capping) PolyPt() { p = Point3(0,0,0); flags = 0; flags2 = 0; aux = 0; } PolyPt(Point3 ip, DWORD f=0, int a=0, DWORD f2=0) { p = ip; flags = f; aux = a; flags2 = f2;} inline MtlID GetMatID() {return (int)((flags2>>POLYPT_MATID_SHIFT)&POLYPT_MATID_MASK);} inline void SetMatID(MtlID id) {flags2 &= 0xFFFF; flags2 |= (DWORD)(id<=0: Use fixed steps) // NOTE: DO NOT change these defines -- They're also used by ShapeObject (object.h) #define PSHAPE_BUILTIN_STEPS -2 // Use the shape's built-in steps/adaptive settings (default) #define PSHAPE_ADAPTIVE_STEPS -1 // Force adaptive steps class PolyShape { public: int numLines; PolyLine *lines; DWORD flags; Box3 bdgBox; // Selection ShapeVSel vertSel; // selected vertices ShapeSSel segSel; // selected segments ShapePSel polySel; // selected polygons // Selection level DWORD selLevel; // Display attribute flags DWORD dispFlags; // Capping caches MeshCapInfo morphCap; BOOL morphCapCacheValid; MeshCapInfo gridCap; BOOL gridCapCacheValid; PatchCapInfo patchCap; BOOL patchCapCacheValid; // Hierarchy cache ShapeHierarchy cachedHier; BOOL hierCacheValid; CoreExport PolyShape(); CoreExport PolyShape(PolyShape& from); CoreExport ~PolyShape(); CoreExport void Init(); // Used by constructors CoreExport void NewShape(); // Deletes all lines CoreExport BOOL SetNumLines(int count, BOOL keep = TRUE); CoreExport PolyLine* NewLine(); CoreExport void Append(PolyLine &l); CoreExport void Insert(int where, PolyLine& l); CoreExport void Delete(int where); CoreExport PolyShape& operator=(PolyShape& from); CoreExport PolyShape& operator=(BezierShape& from); CoreExport void BuildBoundingBox(void); CoreExport void InvalidateGeomCache(BOOL unused); // Also invalidates capping caches CoreExport void InvalidateCapCache(); CoreExport Box3 GetBoundingBox(Matrix3 *tm=NULL); // RB: optional TM allows the box to be calculated in any space. CoreExport void GetDeformBBox(TimeValue t, Box3& box, Matrix3 *tm, BOOL useSel ); CoreExport void Render(GraphicsWindow *gw, Material *ma, RECT *rp, int compFlags, int numMat); CoreExport BOOL Select(GraphicsWindow *gw, Material *ma, HitRegion *hr, int abortOnHit = FALSE); CoreExport void Snap(GraphicsWindow *gw, SnapInfo *snap, IPoint2 *p, Matrix3 &tm); CoreExport void Snap(GraphicsWindow *gw, SnapInfo *snap, IPoint2 *p, Matrix3 &tm, DWORD flags); CoreExport void Transform(Matrix3 &tm); CoreExport int MakeCap(TimeValue t, MeshCapInfo &capInfo, int capType); CoreExport int MakeCap(TimeValue t, PatchCapInfo &capInfo); CoreExport int Make3DSCap(MeshCapInfo &capInfo, DWORD options = 0); CoreExport int MakeGridCap(MeshCapInfo &capInfo); CoreExport void Dump(TCHAR *title = NULL); CoreExport void UpdateCachedHierarchy(); CoreExport ShapeHierarchy &OrganizeCurves(TimeValue t, ShapeHierarchy *hier = NULL); CoreExport void UpdateSels(); CoreExport void Reverse(int poly, BOOL keepZero=FALSE); CoreExport void Reverse(BitArray &reverse, BOOL keepZero=FALSE); CoreExport MtlID GetMatID(int poly, int piece); // Constructs a vertex selection list based on the current selection level. CoreExport BitArray VertexTempSel(int poly); // functions for use in data flow evaluation CoreExport void ShallowCopy(PolyShape *ashape, ULONG_PTR channels); CoreExport void DeepCopy(PolyShape *ashape, ULONG_PTR channels); CoreExport void NewAndCopyChannels(ULONG_PTR channels); CoreExport void FreeChannels( ULONG_PTR channels, int zeroOthers=1); // IO CoreExport IOResult Save(ISave *isave); CoreExport IOResult Load(ILoad *iload); }; #endif // __POLYSHP_H_