/********************************************************************** *< FILE: IProjectionMod.h DESCRIPTION: Interface for Projection Modifier CREATED BY: Michael Russo HISTORY: 02-23-2004 *> Copyright (c) 2004, All Rights Reserved. **********************************************************************/ #ifndef __IPROJECTIONMOD__H #define __IPROJECTIONMOD__H #include "ObjectWrapper.h" #define PROJECTIONMOD_CLASS_ID Class_ID(0x166c301c, 0x19f90c49) #define IPROJECTIONMOD_INTERFACE_ID Interface_ID(0x6b231b96, 0xb26a72) #define IPROJECTIONMODDATA_INTERFACE_ID Interface_ID(0x341e47bc, 0x1f923a2f) class IProjectionModData; //============================================================================= // // Class IProjectionMod // //============================================================================= class IProjectionMod : public FPMixinInterface { public: // IProjectionMod // Geometry Selection Methods enum { PM_SL_OBJECT, PM_SL_VERT, PM_SL_FACE, PM_SL_ELEM }; // Access to Geom Selections by Node/Object Index virtual int NumObjects() = 0; virtual INode* GetObjectNode(int iIndex) = 0; virtual TCHAR* GetObjectName(int iIndex) = 0; virtual int GetObjectSelLevel(int iIndex) = 0; virtual void DeleteObjectNode(int iIndex) = 0; // Access to Geom Selections by Geom Selections virtual int NumGeomSels() = 0; virtual TCHAR* GetGeomSelName( int iSelIndex ) = 0; virtual int GetGeomSelSelLevel( int iSelIndex ) = 0; virtual int NumGeomSelNodes( int iSelIndex ) = 0; virtual INode* GetGeomSelNode( int iSelIndex, int iNodeIndex ) = 0; virtual void SetGeomSelMapProportion( int iSelIndex, float fProportion ) = 0; virtual float GetGeomSelMapProportion( int iSelIndex ) = 0; virtual void DeleteGeomSel( int iSelIndex ) = 0; virtual void DeleteGeomSelNode( int iSelIndex, int iNodeIndex ) = 0; virtual IProjectionModData* GetProjectionModData(INode *pNode) = 0; // Modifier Access virtual bool IsValidObject( INode *pNode ) = 0; virtual bool AddObjectNode( INode *pNode ) = 0; virtual void DeleteAll() = 0; virtual void SetGeomSelNodesVisibility( bool bVisible ) = 0; virtual bool GetGeomSelNodesVisibility() = 0; virtual void UpdateProjectionTypeList() = 0; virtual void AutoWrapCage() = 0; virtual void ResetCage() = 0; virtual void PushCage(float fAmount) = 0; virtual int fpGetObjectSelMtlIDs(INode *pNode, int iIndex, Tab &mtlIDs) = 0; virtual int fpGetGeomSelMtlIDs(INode *pNode, int iSelIndex, Tab &mtlIDs) = 0; virtual float fpGetGeomSelFaceArea(INode *pNode, int iSelIndex) = 0; virtual int fpCheckDuplicateMatIDs( INode *pNode, BitArray &bitFaceDups ) = 0; virtual int fpCheckDuplicateSels( INode *pNode, BitArray &bitFaceDups ) = 0; virtual void fpSelectByMtlID( int iMtlID ) = 0; virtual void fpSelectBySG( int iSG ) = 0; virtual int fpGetNumProjectionTypes() = 0; virtual ReferenceTarget* fpGetProjectionType(int iIndex) = 0; virtual void fpRemoveProjectionType(int iIndex) = 0; virtual void fpProject(int iIndex) = 0; virtual void fpProjectAll() = 0; virtual int fpGetNumRegisteredProjectionTypes() = 0; virtual void fpAddRegisteredProjectionType(int iIndex) = 0; virtual void fpGetRegisteredProjectionTypeClassID(int iIndex, Tab &classid) = 0; virtual void fpShowAlignment() = 0; virtual void fpClearAlignment() = 0; }; //============================================================================= // // Class IProjectionModData // //============================================================================= class IProjectionModData : public BaseInterface { public: // GenericInterface virtual Interface_ID GetID() { return IPROJECTIONMODDATA_INTERFACE_ID; } // IProjectionModData virtual ObjectWrapper &GetBaseObject() = 0; // Object with Projection Modifier virtual ObjectWrapper &GetCage() = 0; // Cage mesh // Access to Geom Selections by Node/Object Index virtual bool GetObjectSel(int iIndex, BitArray& sel) = 0; virtual int GetObjectSelMtlIDs(int iIndex, Tab &mtlIDs) = 0; // Access to Geom Selections by Geom Selections virtual bool GetGeomSel(int iSelIndex, BitArray& sel) = 0; virtual int GetGeomSelMtlIDs(int iSelIndex, Tab &mtlIDs) = 0; virtual float GetGeomSelFaceArea(int iSelIndex) = 0; // Returns number of material ids that conflict within SO Geometry selections. // bitFaceDups is a bitarray of the faces containing the conflict. virtual int CheckDuplicateMatIDs( BitArray &bitFaceDups ) = 0; // Returns number of face selections conflict within SO Geometry selections. // bitFaceDups is a bitarray of the faces containing the conflict. virtual int CheckDuplicateSels( BitArray &bitFaceDups ) = 0; }; //============================================================================= // // Class IProjectionModType // // Class Category: ProjectionModType // //============================================================================= class IProjectionModType : public ReferenceTarget { public: virtual void SetIProjectionMod( IProjectionMod *pPMod ) {} virtual bool CanProject(Tab &tabSourceNodes, int iSelIndex, int iNodeIndex) { return false; } virtual void Project(Tab &tabSourceNodes, int iSelIndex, int iNodeIndex) {} virtual void SetInitialName(int iIndex) {} virtual TCHAR *GetName(){return NULL;} virtual void SetName(TCHAR *name) {} virtual void Enable(bool enable) {} virtual bool IsEditing() { return false; } virtual void EndEditing() {} virtual void EnableEditing(bool enable) {} virtual RefResult NotifyRefChanged( Interval changeInt,RefTargetHandle hTarget, PartID& partID, RefMessage message ) { return REF_SUCCEED; } virtual IOResult Load(ILoad *iload) {return IO_OK;} virtual IOResult Save(ISave *isave) {return IO_OK;} virtual void ModifyObject(TimeValue t, ModContext &mc, ObjectState * os, INode *inode, IProjectionModData *pPModData) {} virtual void BeginEditParams(IObjParam *ip, ULONG flags,Animatable *prev) {} virtual void EndEditParams(IObjParam *ip,ULONG flags,Animatable *next) {} virtual void NotifyInputChanged(Interval changeInt, PartID partID, RefMessage message, ModContext *mc, IProjectionModData *pPModData) {} virtual void GetWorldBoundBox(TimeValue t,INode* inode, ViewExp *vpt, Box3& box, ModContext *mc){} virtual int Display(TimeValue t, GraphicsWindow *gw, Matrix3 tm ) { return 1;} virtual int HitTest(TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc, Matrix3 tm) {return 0;} virtual void SelectSubComponent(HitRecord *hitRec, BOOL selected, BOOL all, BOOL invert=FALSE) {} virtual void Move( TimeValue t, Matrix3& partm, Matrix3& tmAxis, Point3& val, Matrix3 tm, BOOL localOrigin=FALSE ) {} virtual void GetSubObjectCenters(SubObjAxisCallback *cb,TimeValue t,INode *node, Matrix3 tm) {} virtual void GetSubObjectTMs(SubObjAxisCallback *cb,TimeValue t,INode *node, Matrix3 tm) {} virtual void ClearSelection(int selLevel) {} virtual void SelectAll(int selLevel) {} virtual void InvertSelection(int selLevel) {} }; //============================================================================= // // Class IProjectionIntersector // // Ray-intersection for projection mapping // //============================================================================= class IProjectionIntersector { public: IProjectionIntersector() {} virtual ~IProjectionIntersector() {} virtual void DeleteThis() {} // The root is normally the object on which the projection modifier is applied. // The cage is optional, it may be NULL or empty; // if supplied, the cage must have the same topology as the root. virtual BOOL InitRoot( MNMesh* root, MNMesh* cage, Matrix3& objectToWorldTM ) = 0; virtual BOOL InitRoot( ObjectWrapper& root, ObjectWrapper& cage, Matrix3& objectToWorldTM ) = 0; virtual BOOL RootValid() = 0; //true if initialized, false when free'd // A leaf is normally one of the objects targeted by the projection modifier. virtual BOOL InitLeaf( MNMesh* leaf, Matrix3& objectToWorldTM ) = 0; virtual BOOL InitLeaf( ObjectWrapper& leaf, Matrix3& objectToWorldTM ) = 0; virtual BOOL LeafValid() = 0; //true if initialized, false when free'd // releases memory allocated by the Init functions virtual void Free() = 0; // --- Root functions: Require the root be initialized first //Given a point in root object space, and a normal for the point (optional - may be zero), //find the closest face, and barycentric coordinates of the point as projected onto the face enum {FINDCLOSEST_CAGED=1, FINDCLOSEST_IGNOREBACKFACING=2}; virtual BOOL RootClosestFace( Ray& pointAndNormal, int flags, float& dist, DWORD& rootFaceIndex, Tab& rootFaceBary ) = 0; // --- Leaf functions: Require a leaf be initialized first //Find an intersection on a leaf, given a ray virtual BOOL LeafIntersectRay( Ray& ray, float& dist, DWORD& leafFaceIndex, Tab& leafFaceBary ) = 0; // --- General functions: Require that BOTH the root and a leaf are initialized //Find an intersection on a leaf, given a point on the root mesh virtual BOOL LeafIntersectRay( DWORD rootFaceIndex, Point3& rootFaceBary, float& dist, DWORD& leafFaceIndex, Tab& leafFaceBary ) = 0; }; // Manager class, creates instances of IProjectionIntersector class IProjectionIntersectorMgr : public FPStaticInterface { public: virtual IProjectionIntersector* CreateProjectionIntersector() = 0; }; #define IPROJECTIONINTERSECTORMGR_INTERFACE_ID Interface_ID(0x457d402d, 0x36e81f43) #define GetIProjectionIntersectorMgr() \ ((IProjectionIntersectorMgr*)GetCOREInterface(IPROJECTIONINTERSECTORMGR_INTERFACE_ID)) #endif // __IPROJECTIONMOD__H