203 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
/**********************************************************************
 | 
						|
 *<
 | 
						|
	FILE: polyobj.h
 | 
						|
 | 
						|
	DESCRIPTION:  Defines Polygon Mesh Object
 | 
						|
 | 
						|
	CREATED BY: Steve Anderson
 | 
						|
 | 
						|
	HISTORY: created June 1998
 | 
						|
 | 
						|
 *>	Copyright (c) 1998, All Rights Reserved.
 | 
						|
 **********************************************************************/
 | 
						|
 | 
						|
#ifndef __POLYOBJ__ 
 | 
						|
 | 
						|
#define __POLYOBJ__
 | 
						|
 | 
						|
#include "meshlib.h"
 | 
						|
#include "mnmath.h"
 | 
						|
#include "snap.h"
 | 
						|
 | 
						|
#ifdef POLY_LIB_EXPORTING
 | 
						|
#define PolyLibExport __declspec( dllexport )
 | 
						|
#else
 | 
						|
#define PolyLibExport __declspec( dllimport )
 | 
						|
#endif
 | 
						|
 | 
						|
#define POLY_MULTI_PROCESSING TRUE
 | 
						|
 | 
						|
extern PolyLibExport Class_ID polyObjectClassID;
 | 
						|
 | 
						|
class PolyObject: public GeomObject {
 | 
						|
private:
 | 
						|
	// Displacement approximation stuff:
 | 
						|
	TessApprox mDispApprox;
 | 
						|
	bool mSubDivideDisplacement;
 | 
						|
	bool mDisableDisplacement;
 | 
						|
	bool mSplitMesh;
 | 
						|
 | 
						|
protected:
 | 
						|
	Interval geomValid;
 | 
						|
	Interval topoValid;
 | 
						|
	Interval texmapValid;
 | 
						|
	Interval selectValid;
 | 
						|
	Interval vcolorValid;
 | 
						|
	DWORD validBits; // for the remaining constant channels
 | 
						|
	PolyLibExport void CopyValidity(PolyObject *fromOb, ChannelMask channels);
 | 
						|
	//  inherited virtual methods for Reference-management
 | 
						|
	PolyLibExport RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message );
 | 
						|
public:
 | 
						|
	MNMesh mm;
 | 
						|
 | 
						|
	PolyLibExport PolyObject();
 | 
						|
	PolyLibExport ~PolyObject();
 | 
						|
 | 
						|
	//  inherited virtual methods:
 | 
						|
 | 
						|
	// From BaseObject
 | 
						|
	PolyLibExport int HitTest(TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt);
 | 
						|
	PolyLibExport int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags);
 | 
						|
	PolyLibExport void Snap(TimeValue t, INode* inode, SnapInfo *snap, IPoint2 *p, ViewExp *vpt);
 | 
						|
	PolyLibExport CreateMouseCallBack* GetCreateMouseCallBack() { return NULL; }
 | 
						|
	PolyLibExport RefTargetHandle Clone(RemapDir& remap = NoRemap());
 | 
						|
 | 
						|
	// From Object			 
 | 
						|
	PolyLibExport ObjectState Eval(TimeValue time);
 | 
						|
	PolyLibExport Interval ObjectValidity(TimeValue t);
 | 
						|
	PolyLibExport BOOL HasUVW();
 | 
						|
	PolyLibExport BOOL HasUVW(int mapChannel);
 | 
						|
	PolyLibExport Object *CollapseObject();
 | 
						|
	// get and set the validity interval for the nth channel
 | 
						|
	PolyLibExport Interval ChannelValidity (TimeValue t, int nchan);
 | 
						|
	PolyLibExport Interval PartValidity (DWORD partIDs);
 | 
						|
	PolyLibExport void SetChannelValidity (int i, Interval v);
 | 
						|
	PolyLibExport void SetPartValidity (DWORD partIDs, Interval v);
 | 
						|
	PolyLibExport void InvalidateChannels (ChannelMask channels);
 | 
						|
 | 
						|
	// Convert-to-type validity
 | 
						|
	PolyLibExport Interval ConvertValidity(TimeValue t);
 | 
						|
 | 
						|
	// Deformable object procs	
 | 
						|
	int IsDeformable() { return 1; }  
 | 
						|
	PolyLibExport int NumPoints();
 | 
						|
	PolyLibExport Point3 GetPoint(int i);
 | 
						|
	PolyLibExport void SetPoint(int i, const Point3& p);
 | 
						|
	PolyLibExport void PointsWereChanged();
 | 
						|
	PolyLibExport void Deform (Deformer *defProc, int useSel=0);
 | 
						|
 | 
						|
// The following members have been added
 | 
						|
// in 3ds max 4.2.  If your plugin utilizes this new
 | 
						|
// mechanism, be sure that your clients are aware that they
 | 
						|
// must run your plugin with 3ds max version 4.2 or higher.
 | 
						|
	BOOL IsPointSelected (int i) {
 | 
						|
		if ((i<0) || (i>=mm.numv)) return false;
 | 
						|
		return mm.v[i].FlagMatch (MN_DEAD|MN_SEL, MN_SEL);
 | 
						|
	}
 | 
						|
	float PointSelection (int i) {
 | 
						|
		if ((i<0) || (i>=mm.numv)) return 0.0f;
 | 
						|
		if (mm.v[i].GetFlag (MN_DEAD)) return 0.0f;
 | 
						|
		if (mm.v[i].GetFlag (MN_SEL)) return 1.0f;
 | 
						|
		float *vssel = mm.getVSelectionWeights();
 | 
						|
		if (vssel) return vssel[i];
 | 
						|
		else return 0.0f;
 | 
						|
	}
 | 
						|
	BOOL PolygonCount(TimeValue t, int& numFaces, int& numVerts) {
 | 
						|
		numFaces = 0;
 | 
						|
		numVerts = 0;
 | 
						|
		for (int i=0; i<mm.numf; i++) if (!mm.f[i].GetFlag (MN_DEAD)) numFaces++;
 | 
						|
		for (int i=0; i<mm.numv; i++) if (!mm.v[i].GetFlag (MN_DEAD)) numVerts++;
 | 
						|
		return TRUE;
 | 
						|
	}
 | 
						|
// End of 3ds max 4.2 Extension
 | 
						|
 | 
						|
	// Mappable object procs
 | 
						|
	int IsMappable() { return 1; }
 | 
						|
	int NumMapChannels () { return MAX_MESHMAPS; }
 | 
						|
	int NumMapsUsed () { return mm.numm; }
 | 
						|
	PolyLibExport void ApplyUVWMap(int type, float utile, float vtile, float wtile,
 | 
						|
		int uflip, int vflip, int wflip, int cap,const Matrix3 &tm,int channel=1);
 | 
						|
 | 
						|
	PolyLibExport void GetDeformBBox(TimeValue t, Box3& box, Matrix3 *tm=NULL,BOOL useSel=FALSE );
 | 
						|
 | 
						|
	PolyLibExport int CanConvertToType(Class_ID obtype);
 | 
						|
	PolyLibExport Object* ConvertToType(TimeValue t, Class_ID obtype);
 | 
						|
	PolyLibExport void FreeChannels(ChannelMask chan);
 | 
						|
	PolyLibExport Object *MakeShallowCopy(ChannelMask channels);
 | 
						|
	PolyLibExport void ShallowCopy(Object* fromOb, ChannelMask channels);
 | 
						|
	PolyLibExport void NewAndCopyChannels(ChannelMask channels);
 | 
						|
 | 
						|
	PolyLibExport DWORD GetSubselState();
 | 
						|
	PolyLibExport void SetSubSelState(DWORD s);
 | 
						|
 | 
						|
	PolyLibExport BOOL CheckObjectIntegrity();
 | 
						|
 | 
						|
	// From GeomObject
 | 
						|
	PolyLibExport int IntersectRay(TimeValue t, Ray& ray, float& at, Point3& norm);
 | 
						|
	PolyLibExport ObjectHandle CreateTriObjRep(TimeValue t);  // obselete, do not use!!!  (Returns NULL.)
 | 
						|
	PolyLibExport void GetWorldBoundBox(TimeValue t, INode *inode, ViewExp* vpt, Box3& box );
 | 
						|
	PolyLibExport void GetLocalBoundBox(TimeValue t, INode *inode, ViewExp* vpt, Box3& box );
 | 
						|
	PolyLibExport Mesh* GetRenderMesh(TimeValue t, INode *inode, View &view,  BOOL& needDelete);
 | 
						|
 | 
						|
	PolyLibExport void TopologyChanged();
 | 
						|
 | 
						|
	MNMesh& GetMesh() { return mm; }
 | 
						|
 | 
						|
	// Animatable methods
 | 
						|
 | 
						|
	void DeleteThis() { delete this; }
 | 
						|
	void FreeCaches() {mm.InvalidateGeomCache(); }
 | 
						|
	Class_ID ClassID() { return Class_ID(POLYOBJ_CLASS_ID,0); }
 | 
						|
	void GetClassName(TSTR& s) { s = TSTR(_T("PolyMeshObject")); }
 | 
						|
	void NotifyMe(Animatable *subAnim, int message) {}
 | 
						|
	int IsKeyable() { return 0;}
 | 
						|
	int Update(TimeValue t) { return 0; }
 | 
						|
	//BOOL BypassTreeView() { return TRUE; }
 | 
						|
	// This is the name that will appear in the history browser.
 | 
						|
	TCHAR *GetObjectName() { return _T("PolyMesh"); }
 | 
						|
	PolyLibExport void RescaleWorldUnits(float f);
 | 
						|
 | 
						|
	// IO
 | 
						|
	PolyLibExport IOResult Save(ISave *isave);
 | 
						|
	PolyLibExport IOResult Load(ILoad *iload);
 | 
						|
 | 
						|
	// Displacement mapping parameter access.
 | 
						|
	// (PolyObjects don't do displacement mapping directly, but they
 | 
						|
	// pass their settings on to TriObjects.)
 | 
						|
	PolyLibExport BOOL CanDoDisplacementMapping();
 | 
						|
	PolyLibExport void SetDisplacementApproxToPreset(int preset);
 | 
						|
 | 
						|
	// Accessor methods:
 | 
						|
	void SetDisplacementDisable (bool disable) { mDisableDisplacement = disable; }
 | 
						|
	void SetDisplacementParameters (TessApprox & params) { mDispApprox = params; }
 | 
						|
	void SetDisplacementSplit (bool split) { mSplitMesh = split; }
 | 
						|
	void SetDisplacement (bool displace) { mSubDivideDisplacement = displace; }
 | 
						|
 | 
						|
	bool GetDisplacementDisable () const { return mDisableDisplacement; }
 | 
						|
	TessApprox GetDisplacementParameters () const { return mDispApprox; }
 | 
						|
	bool GetDisplacementSplit () const { return mSplitMesh; }
 | 
						|
	bool GetDisplacement () const { return mSubDivideDisplacement; }
 | 
						|
 | 
						|
	TessApprox &DispParams() { return mDispApprox; }
 | 
						|
};
 | 
						|
 | 
						|
// Regular PolyObject
 | 
						|
PolyLibExport ClassDesc* GetPolyObjDescriptor();
 | 
						|
 | 
						|
// A new descriptor can be registered to replace the default
 | 
						|
// tri object descriptor. This new descriptor will then
 | 
						|
// be used to create tri objects.
 | 
						|
 | 
						|
PolyLibExport void RegisterEditPolyObjDesc(ClassDesc* desc);
 | 
						|
PolyLibExport ClassDesc* GetEditPolyObjDesc(); // Returns default of none have been registered
 | 
						|
 | 
						|
// Use this instead of new PolyObject. It will use the registered descriptor
 | 
						|
// if one is registered, otherwise you'll get a default poly-object.
 | 
						|
PolyLibExport PolyObject *CreateEditablePolyObject();
 | 
						|
 | 
						|
// Inter-object conversions:
 | 
						|
PolyLibExport void ConvertPolyToPatch (MNMesh & from, PatchMesh & to, DWORD flags=0);
 | 
						|
PolyLibExport void ConvertPatchToPoly (PatchMesh & from, MNMesh & to, DWORD flags=0);
 | 
						|
 | 
						|
#endif
 |