tge/lib/maxsdk70/include/maxscrpt/mscustattrib.h
2017-04-17 06:17:10 -06:00

151 lines
5.5 KiB
C++
Executable File

/*
* MSCustAttrib.h - MAXScript scriptable custom attributes MAX objects
*
* Copyright © Autodesk, Inc, 2000. John Wainwright.
*
*/
#ifndef _H_MSCUST_ATTRIB
#define _H_MSCUST_ATTRIB
// ---------- scripter Custom Attribute classes -------------------
#include "CustAttrib.h"
#define I_SCRIPTEDCUSTATTRIB 0x000010C1
#define MSCUSTATTRIB_CHUNK 0x0110
#define MSCUSTATTRIB_NAME_CHUNK 0x0010
// special subclass for holding custom attribute definitions
// these can be applied to any existing object, adding a CustAttrib to it
// instances of MSCustAttrib (an MSPlugin subclass) refer to CustAttribDefs for metadata
visible_class (MSCustAttribDef)
class MSCustAttribDef : public MSPluginClass
{
public:
static Tab<MSCustAttribDef*> ms_attrib_defs; // table of existing scripted attribute defs to enable redefinition
Value* defData; // persistent definition data, used by the scripter attribute editor
TSTR source; // extracted definition source, stored persistently with the def & automatically recompiled on
// reload
MSCustAttribDef(Class_ID& attrib_id);
~MSCustAttribDef();
// definition and redefinition
static MSCustAttribDef* intern(Class_ID& attrib_id);
void init(int local_count, Value** inits, HashTable* local_scope, HashTable* handlers, Array* pblock_defs, Array* rollouts, CharStream* source);
// MAXScript required
// BOOL is_kind_of(ValueMetaClass* c) { return (c == class_tag(MSCustAttribDef)) ? 1 : Value::is_kind_of(c); } // LAM: 2/23/01
BOOL is_kind_of(ValueMetaClass* c) { return (c == class_tag(MSCustAttribDef)) ? 1 : MSPluginClass::is_kind_of(c); }
# define is_attribute_def(v) ((v)->tag == class_tag(MSCustAttribDef))
void collect() { delete this; }
void gc_trace();
void sprin1(CharStream* s);
bool is_custAttribDef() { return true; }
MSCustAttribDef* unique_clone();
// from Value
Value* apply(Value** arg_list, int count, CallContext* cc=NULL) { return Value::apply(arg_list, count, cc); } // CustAttribDef's are not applyable
// scene I/O
static IOResult save_custattrib_defs(ISave* isave);
static IOResult load_custattrib_defs(ILoad* iload);
// ClassDesc delegates
RefTargetHandle Create(BOOL loading);
Value* get_property(Value** arg_list, int count);
Value* set_property(Value** arg_list, int count);
def_property ( name );
};
// MSCustAttrib - instances contain individual custom attribute blocks
// that are added to customized objects.
class MSCustAttrib : public MSPlugin, public CustAttrib, public ISubMap
{
public:
IObjParam* cip; // ip for any currently open command panel dialogs
static MSAutoMParamDlg* masterMDlg; // master dialog containing all scripted rollout
IMtlParams* mip; // ip for any open mtlEditor panel dlgs
TSTR name; // name of the custom attribute
MSCustAttrib() : cip(NULL), mip(NULL) { }
MSCustAttrib(MSCustAttribDef* pc, BOOL loading);
~MSCustAttrib() { DeleteAllRefsFromMe(); }
void sprin1(CharStream* s);
// From MSPlugin
HWND AddRollupPage(HINSTANCE hInst, TCHAR *dlgTemplate, DLGPROC dlgProc, TCHAR *title, LPARAM param=0,DWORD flags=0, int category=ROLLUP_CAT_CUSTATTRIB - 1);
void DeleteRollupPage(HWND hRollup);
IRollupWindow* GetRollupWindow();
ReferenceTarget* get_delegate() { return NULL; } // no delegates in MSCustAttribs
// from CustAttrib
TCHAR* GetName() { return name; }
ParamDlg* CreateParamDlg(HWND hwMtlEdit, IMtlParams *imp);
void SetName(TCHAR* newName) { name = newName ; }
// From Animatable
using CustAttrib::GetInterface;
void GetClassName(TSTR& s) { s = TSTR(pc->class_name->to_string()); }
Class_ID ClassID() { return pc->class_id; }
SClass_ID SuperClassID() { return pc->sclass_id; }
void FreeCaches() { }
int NumSubs() { return pblocks.Count(); }
Animatable* SubAnim(int i) { return pblocks[i]; }
TSTR SubAnimName(int i) { return pblocks[i]->GetLocalName(); }
int NumParamBlocks() { return pblocks.Count(); }
IParamBlock2* GetParamBlock(int i) { return pblocks[i]; }
IParamBlock2* GetParamBlockByID(BlockID id) { return MSPlugin::GetParamBlockByID(id); }
BOOL CanCopyAnim() { return FALSE; }
void* GetInterface(ULONG id);
void DeleteThis();
void BeginEditParams( IObjParam *ip, ULONG flags,Animatable *prev);
void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next);
// From ReferenceMaker
RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message)
{
if (!(pc->mpc_flags & MPC_REDEFINITION))
return ((MSPlugin*)this)->NotifyRefChanged(changeInt, hTarget, partID, message);
else
return REF_SUCCEED;
}
// From ReferenceTarget
int NumRefs() { return pblocks.Count(); }
RefTargetHandle GetReference(int i) { return pblocks[i]; }
void SetReference(int i, RefTargetHandle rtarg)
{
if (i >= pblocks.Count()) pblocks.SetCount(i+1); pblocks[i] = (IParamBlock2*)rtarg;
}
void RefDeleted() { MSPlugin::RefDeleted(); }
RefTargetHandle Clone(RemapDir& remap = NoRemap());
IOResult Save(ISave *isave);
IOResult Load(ILoad *iload);
// from ISubMap
int NumSubTexmaps();
Texmap* GetSubTexmap(int i);
void SetSubTexmap(int i, Texmap *m);
TSTR GetSubTexmapSlotName(int i);
int MapSlotType(int i) { return MAPSLOT_TEXTURE; }
TSTR GetSubTexmapTVName(int i) { return GetSubTexmapSlotName(i); }
ReferenceTarget *GetRefTarget() { return this; }
};
#endif