📄 object.h
字号:
// This class may be requested in the pipeline via the GENERIC_SHAPE_CLASS_ID,
// also set up in the Class_ID object genericShapeClassID
// Options for steps in MakePolyShape (>=0: Use fixed steps)
#define PSHAPE_BUILTIN_STEPS -2 // Use the shape's built-in steps/adaptive settings (default)
#define PSHAPE_ADAPTIVE_STEPS -1 // Force adaptive steps
// Parameter types for shape interpolation (Must match types in spline3d.h & polyshp.h)
#define PARAM_SIMPLE 0 // Parameter space based on segments
#define PARAM_NORMALIZED 1 // Parameter space normalized to curve length
class ShapeObject: public GeomObject {
BOOL renderable; // Is it renderable?
float thickness; // Renderable thickness
BOOL generateUVs; // Generate UV coords on renderable shape if TRUE
public:
CoreExport ShapeObject();
CoreExport ~ShapeObject(); // Must call this on destruction
virtual BOOL IsShapeObject() { return TRUE; }
virtual int IntersectRay(TimeValue t, Ray& ray, float& at, Point3& norm) {return FALSE;}
virtual void InitNodeName(TSTR& s) { s = _T("Shape"); }
SClass_ID SuperClassID() { return SHAPE_CLASS_ID; }
virtual int IsRenderable() { return (int)renderable;}
CoreExport virtual void CopyBaseData(ShapeObject &from);
// Access methods
virtual BOOL GetRenderable() { return renderable; }
virtual float GetThickness() { return thickness; }
virtual BOOL GetGenUVs() { return generateUVs; }
CoreExport virtual void SetRenderable(BOOL sw);
CoreExport virtual void SetThickness(float t);
CoreExport virtual void SetGenUVs(BOOL sw);
CoreExport virtual Mesh* GetRenderMesh(TimeValue t, INode *inode, View& view, BOOL& needDelete);
CoreExport virtual void GetRenderMeshInfo(TimeValue t, INode *inode, View& view, int &nverts, int &nfaces); // Get info on the rendering mesh
virtual int NumberOfVertices(TimeValue t, int curve = -1) { return 0; } // Informational only, curve = -1: total in all curves
virtual int NumberOfCurves()=0; // Number of curve polygons in the shape
virtual BOOL CurveClosed(TimeValue t, int curve)=0; // Returns TRUE if the curve is closed
virtual Point3 InterpCurve3D(TimeValue t, int curve, float param, int ptype=PARAM_SIMPLE)=0; // Interpolate from 0-1 on a curve
virtual Point3 TangentCurve3D(TimeValue t, int curve, float param, int ptype=PARAM_SIMPLE)=0; // Get tangent at point on a curve
virtual float LengthOfCurve(TimeValue t, int curve)=0; // Get the length of a curve
virtual int NumberOfPieces(TimeValue t, int curve)=0; // Number of sub-curves in a curve
virtual Point3 InterpPiece3D(TimeValue t, int curve, int piece, float param, int ptype=PARAM_SIMPLE)=0; // Interpolate from 0-1 on a sub-curve
virtual Point3 TangentPiece3D(TimeValue t, int curve, int piece, float param, int ptype=PARAM_SIMPLE)=0; // Get tangent on a sub-curve
virtual MtlID GetMatID(TimeValue t, int curve, int piece) { return 0; }
virtual BOOL CanMakeBezier() { return FALSE; } // Return TRUE if can turn into a bezier representation
virtual void MakeBezier(TimeValue t, BezierShape &shape) {} // Create the bezier representation
virtual ShapeHierarchy &OrganizeCurves(TimeValue t, ShapeHierarchy *hier=NULL)=0; // Ready for lofting, extrusion, etc.
virtual void MakePolyShape(TimeValue t, PolyShape &shape, int steps = PSHAPE_BUILTIN_STEPS, BOOL optimize = FALSE)=0; // Create a PolyShape representation with optional fixed steps & optimization
virtual int MakeCap(TimeValue t, MeshCapInfo &capInfo, int capType)=0; // Generate mesh capping info for the shape
virtual int MakeCap(TimeValue t, PatchCapInfo &capInfo) { return 0; } // Only implement if CanMakeBezier=TRUE -- Gen patch cap info
virtual BOOL AttachShape(TimeValue t, INode *thisNode, INode *attachNode, BOOL weldEnds=FALSE, float weldThreshold=0.0f) { return FALSE; } // Return TRUE if attached
// UVW Mapping switch access
virtual BOOL HasUVW() { return GetGenUVs(); }
virtual void SetGenUVW(BOOL sw) { SetGenUVs(sw); }
// These handle loading and saving the data in this class. Should be called
// by derived class BEFORE it loads or saves any chunks
CoreExport virtual IOResult Save(ISave *isave);
CoreExport virtual IOResult Load(ILoad *iload);
CoreExport virtual Class_ID PreferredCollapseType();
CoreExport virtual BOOL GetExtendedProperties(TimeValue t, TSTR &prop1Label, TSTR &prop1Data, TSTR &prop2Label, TSTR &prop2Data);
CoreExport virtual void RescaleWorldUnits(float f);
private:
};
// Set ShapeObject's global Constant Cross-Section angle threshold (angle in radians) --
// Used for renderable shapes.
CoreExport void SetShapeObjectCCSThreshold(float angle);
/*-------------------------------------------------------------------
WSMObject : This is the helper object for the WSM modifier
---------------------------------------------------------------------*/
class WSMObject: public Object {
public:
SClass_ID SuperClassID() { return WSM_OBJECT_CLASS_ID; }
virtual Modifier *CreateWSMMod(INode *node)=0;
virtual int UsesWireColor() { return FALSE; } // TRUE if the object color is used for display
virtual BOOL NormalAlignVector(TimeValue t,Point3 &pt, Point3 &norm) {pt=Point3(0,0,0);norm=Point3(0,0,-1);return TRUE;}
virtual BOOL SupportsDynamics() { return FALSE; } // TRUE if spacewarp or collision object supports Dynamics
virtual ForceField *GetForceField(INode *node) {return NULL;}
private:
};
//--- Interface to XRef objects ---------------------------------------------------
class IXRefObject: public Object {
public:
Class_ID ClassID() {return Class_ID(XREFOBJ_CLASS_ID,0);}
SClass_ID SuperClassID() {return SYSTEM_CLASS_ID;}
// Initialize a new XRef object
virtual void Init(TSTR &fname, TSTR &oname, Object *ob, BOOL asProxy=FALSE)=0;
virtual void SetFileName(TCHAR *name, BOOL proxy=FALSE, BOOL update=TRUE)=0;
virtual void SetObjName(TCHAR *name, BOOL proxy=FALSE)=0;
virtual void SetUseProxy(BOOL onOff,BOOL redraw=TRUE)=0;
virtual void SetRenderProxy(BOOL onOff)=0;
virtual void SetUpdateMats(BOOL onOff)=0;
virtual void SetIgnoreAnim(BOOL onOff,BOOL redraw=TRUE)=0;
virtual TSTR GetFileName(BOOL proxy=FALSE)=0;
virtual TSTR GetObjName(BOOL proxy=FALSE)=0;
virtual TSTR &GetCurFileName()=0;
virtual TSTR &GetCurObjName()=0;
virtual BOOL GetUseProxy()=0;
virtual BOOL GetRenderProxy()=0;
virtual BOOL GetUpdateMats()=0;
virtual BOOL GetIgnoreAnim()=0;
// Causes browse dialogs to appear
virtual void BrowseObject(BOOL proxy)=0;
virtual void BrowseFile(BOOL proxy)=0;
// Try to reload ref
virtual void ReloadXRef()=0;
};
//---------------------------------------------------------------------------------
class ControlMatrix3;
// Used with EnumModContexts()
class ModContextEnumProc {
public:
virtual BOOL proc(ModContext *mc)=0; // Return FALSE to stop, TRUE to continue.
};
/*-------------------------------------------------------------------
Modifier: these are the ObjectSpace and World Space modifiers: They are
subclassed off of BaseObject so that they can put up a graphical
representation in the viewport.
---------------------------------------------------------------------*/
class Modifier: public BaseObject {
friend class ModNameRestore;
TSTR modName;
public:
CoreExport virtual TSTR GetName();
CoreExport virtual void SetName(TSTR n);
SClass_ID SuperClassID() { return OSM_CLASS_ID; }
// Disables all mod apps that reference this modifier _and_ have a select
// anim flag turned on.
void DisableModApps() { NotifyDependents(FOREVER,PART_OBJ,REFMSG_DISABLE); }
void EnableModApps() { NotifyDependents(FOREVER,PART_OBJ,REFMSG_ENABLE); }
// This disables or enables the mod. All mod apps referencing will be affected.
void DisableMod() {
SetAFlag(A_MOD_DISABLED);
NotifyDependents(FOREVER,PART_ALL|PART_OBJECT_TYPE,REFMSG_CHANGE);
}
void EnableMod() {
ClearAFlag(A_MOD_DISABLED);
NotifyDependents(FOREVER,PART_ALL|PART_OBJECT_TYPE,REFMSG_CHANGE);
}
int IsEnabled() { return !TestAFlag(A_MOD_DISABLED); }
// Same as above but for viewports only
void DisableModInViews() {
SetAFlag(A_MOD_DISABLED_INVIEWS);
NotifyDependents(FOREVER,PART_ALL|PART_OBJECT_TYPE,REFMSG_CHANGE);
}
void EnableModInViews() {
ClearAFlag(A_MOD_DISABLED_INVIEWS);
NotifyDependents(FOREVER,PART_ALL|PART_OBJECT_TYPE,REFMSG_CHANGE);
}
int IsEnabledInViews() { return !TestAFlag(A_MOD_DISABLED_INVIEWS); }
CoreExport virtual Interval LocalValidity(TimeValue t);
virtual ChannelMask ChannelsUsed()=0;
virtual ChannelMask ChannelsChanged()=0;
// this is used to invalidate cache's in Edit Modifiers:
virtual void NotifyInputChanged(Interval changeInt, PartID partID, RefMessage message, ModContext *mc) {}
// These call ChannelsUsed/Changed() but also OR in GFX_DATA_CHANNEL as appropriate.
CoreExport ChannelMask TotalChannelsUsed();
CoreExport ChannelMask TotalChannelsChanged();
// This is the method that is called when the modifier is needed to
// apply its effect to the object. Note that the INode* is always NULL
// for object space modifiers.
virtual void ModifyObject(TimeValue t, ModContext &mc, ObjectState* os, INode *node)=0;
// this should return FALSE for things like edit modifiers
virtual int NeedUseSubselButton() { return 1; }
// Modifiers that place a dependency on topology should return TRUE
// for this method. An example would be a modifier that stores a selection
// set base on vertex indices.
virtual BOOL DependOnTopology(ModContext &mc) {return FALSE;}
// this can return:
// DEFORM_OBJ_CLASS_ID -- not really a class, but so what
// MAPPABLE_OBJ_CLASS_ID -- ditto
// TRIOBJ_CLASS_ID
// BEZIER_PATCH_OBJ_CLASS_ID
virtual Class_ID InputType()=0;
virtual void ForceNotify(Interval& i)
{NotifyDependents(i,ChannelsChanged(),REFMSG_CHANGE );}
virtual IOResult SaveLocalData(ISave *isave, LocalModData *ld) { return IO_OK; }
virtual IOResult LoadLocalData(ILoad *iload, LocalModData **pld) { return IO_OK; }
// These handle loading and saving the modifier name. Should be called
// by derived class BEFORE it loads or saves any chunks
CoreExport IOResult Save(ISave *isave);
CoreExport IOResult Load(ILoad *iload);
// This will call proc->proc once for each application of the modifier.
CoreExport void EnumModContexts(ModContextEnumProc *proc);
// Animatable Overides...
CoreExport SvGraphNodeReference SvTraverseAnimGraph(IGraphObjectManager *gom, Animatable *owner, int id, DWORD flags);
CoreExport TSTR SvGetName(IGraphObjectManager *gom, IGraphNode *gNode, bool isBeingEdited);
CoreExport bool SvCanSetName(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport bool SvSetName(IGraphObjectManager *gom, IGraphNode *gNode, TSTR &name);
CoreExport bool SvHandleDoubleClick(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport COLORREF SvHighlightColor(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport bool SvIsSelected(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport MultiSelectCallback* SvGetMultiSelectCallback(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport bool SvCanSelect(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport bool SvCanInitiateLink(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport bool SvCanConcludeLink(IGraphObjectManager *gom, IGraphNode *gNode, IGraphNode *gNodeChild);
CoreExport bool SvLinkChild(IGraphObjectManager *gom, IGraphNode *gNodeThis, IGraphNode *gNodeChild);
CoreExport bool SvCanRemoveThis(IGraphObjectManager *gom, IGraphNode *gNode);
CoreExport bool SvRemoveThis(IGraphObjectManager *gom, IGraphNode *gNode);
private:
};
class OSModifier: public Modifier {
public:
SClass_ID SuperClassID() { return OSM_CLASS_ID; }
};
class WSModifier: public Modifier {
public:
SClass_ID SuperClassID() { return WSM_CLASS_ID; }
};
void CoreExport MakeHitRegion(HitRegion& hr, int type, int crossing, int epsi, IPoint2 *p);
class PolyLineProc {
public:
virtual int proc(Point3 *p, int n)=0;
virtual void SetLineColor(float r, float g, float b) {}
virtual void SetLineColor(Point3 c) {}
virtual void Marker(Point3 *p,MarkerType type) {}
};
class DrawLineProc:public PolyLineProc {
GraphicsWindow *gw;
public:
DrawLineProc() { gw = NULL; }
DrawLineProc(GraphicsWindow *g) { gw = g; }
int proc(Point3 *p, int n) { gw->polyline(n, p, NULL, NULL, 0, NULL); return 0; }
void SetLineColor(float r, float g, float b) {gw->setColor(LINE_COLOR,r,g,b);}
void SetLineColor(Point3 c) {gw->setColor(LINE_COLOR,c);}
void Marker(Point3 *p,MarkerType type) {gw->marker(p,type);}
};
class BoxLineProc:public PolyLineProc {
Box3 box;
Matrix3 *tm;
public:
BoxLineProc() { box.Init();}
BoxLineProc(Matrix3* m) { tm = m; box.Init(); }
Box3& Box() { return box; }
CoreExport int proc(Point3 *p, int n);
CoreExport void Marker(Point3 *p,MarkerType type);
};
// Apply the PolyLineProc to each edge (represented by an array of Point3's) of the box
// after passing it through the Deformer def.
void CoreExport DoModifiedBox(Box3& box, Deformer &def, PolyLineProc& lp);
void CoreExport DoModifiedLimit(Box3& box, float z, int axis, Deformer &def, PolyLineProc& lp);
void CoreExport DrawCenterMark(PolyLineProc& lp, Box3& box );
// Some functions to draw mapping icons
void CoreExport DoSphericalMapIcon(BOOL sel,float radius, PolyLineProc& lp);
void CoreExport DoCylindricalMapIcon(BOOL sel,float radius, float height, PolyLineProc& lp);
void CoreExport DoPlanarMapIcon(BOOL sel,float width, float length, PolyLineProc& lp);
//---------------------------------------------------------------------
// Data structures for keeping log of hits during sub-object hit-testing.
//---------------------------------------------------------------------
class HitLog;
class HitRecord {
friend class HitLog;
HitRecord *next;
public:
INode *nodeRef;
ModContext *modContext;
DWORD distance;
ulong hitInfo;
HitData *hitData;
HitRecord() { next = NULL; modContext = NULL; distance = 0; hitInfo = 0; hitData = NULL;}
HitRecord(INode *nr, ModContext *mc, DWORD d, ulong inf, HitData *hitdat) {
next = NULL;
nodeRef = nr; modContext = mc; distance = d; hitInfo = inf; hitData = hitdat;
}
HitRecord(HitRecord *n,INode *nr, ModContext *mc, DWORD d, ulong inf, HitData *hitdat) {
next = n;
nodeRef = nr; modContext = mc; distance = d; hitInfo = inf; hitData = hitdat;
}
HitRecord * Next() { return next; }
~HitRecord() { if (hitData) { delete hitData; hitData = NULL; } }
};
class HitLog {
HitRecord *first;
int hitIndex;
public:
HitLog() { first = NULL; hitIndex = 0; }
~HitLog() { Clear(); }
CoreExport void Clear();
CoreExport void ClearHitIndex() { hitIndex = 0; }
CoreExport void IncrHitIndex() { hitIndex++; }
HitRecord* First() { return first; }
CoreExport HitRecord* ClosestHit();
CoreExport void LogHit(INode *nr, ModContext *mc, DWORD dist, ulong info, HitData *hitdat = NULL);
};
// Creates a new empty derived object, sets it to point at the given
// object and returns a pointer to the derived object.
CoreExport Object *MakeObjectDerivedObject(Object *obj);
// Category strings for space warp objects:
#define SPACEWARP_CAT_GEOMDEF 1
#define SPACEWARP_CAT_MODBASED 2
#define SPACEWARP_CAT_PARTICLE 3
CoreExport TCHAR *GetSpaceWarpCatString(int id);
#endif //_OBJECT_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -