functions.h File Reference

#include "arrays.h"
#include "..\..\ifnpub.h"
#include "..\..\GetCOREInterface.h"

Go to the source code of this file.

Classes

struct  DumpValueData
class  CallContext
class  StructMethod
class  SMCallContext
class  PluginMethod
class  UserProp
class  UserGeneric
class  ValueConverter
class  InterfaceMethod
class  StaticInterfaceMethod

Defines

#define def_generic(fn, name)   ScripterExport Value* fn##_vf(Value** arglist, int arg_count)
#define FPS_CACHE_SIZE   512
#define is_function(v)   ((v)->_is_function())
#define is_maxscriptfunction(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(MAXScriptFunction))
#define FN_MAPPED_FN   0x0001
#define FN_BODY_FN   0x0002
#define FN_HAS_REFARGS   0x0004
#define FN_MAPPED_EVAL   0x0008
#define is_structMethod(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == INTERNAL_STRUCT_METHOD_TAG)
#define is_pluginMethod(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == INTERNAL_MSPLUGIN_METHOD_TAG)
#define def_user_prop(_prop, _cls, _getter, _setter)   _cls##_class.add_user_prop(#_prop, _getter, _setter)
#define def_user_generic(_fn, _cls, _name)   _cls##_class.add_user_generic(#_name, _fn)
#define VALUECONVERTER_INTERFACE_ID   Interface_ID(0x19f37b9f, 0x39ed5680)
#define is_iobject(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(IObjectValue))
#define is_fpstaticinterface(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPInterfaceValue))
#define is_fpmixininterface(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPMixinInterfaceValue))
#define is_fpstaticmethodinterface(v)   ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPStaticMethodInterfaceValue))

Enumerations

enum  primitive_flag { LAZY_PRIMITIVE = 0x0001, DEBUGGER_SAFE = 0x0002 }

Functions

 visible_class (Function) class Function
 visible_class (Generic) class Generic
 visible_class (MappedGeneric) class MappedGeneric
 visible_class (NodeGeneric) class NodeGeneric
 visible_class (Primitive) class Primitive
 visible_class (MappedPrimitive) class MappedPrimitive
 visible_class (MAXScriptFunction) class MAXScriptFunction
 visible_class (UserGenericValue) class UserGenericValue
 visible_class (InterfaceFunction) class InterfaceFunction
 visible_class (ActionPredicate) class ActionPredicate
 visible_class (IObjectValue) class IObjectValue
 visible_class (FPInterfaceValue) class FPInterfaceValue
ScripterExport void print_FP_interface (CharStream *out, FPInterface *fpi, bool getPropNames=true, bool getMethodNames=true, bool getInterfaceNames=true, bool getActionTables=true)
 visible_class (FPMixinInterfaceValue) class FPMixinInterfaceValue
 visible_class (FPStaticMethodInterfaceValue) class FPStaticMethodInterfaceValue

Define Documentation

#define def_generic (   fn,
  name 
)    ScripterExport Value* fn##_vf(Value** arglist, int arg_count)

Definition at line 15 of file functions.h.

#define FPS_CACHE_SIZE   512

Definition at line 18 of file functions.h.

#define is_function (   v)    ((v)->_is_function())
#define is_maxscriptfunction (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(MAXScriptFunction))
#define FN_MAPPED_FN   0x0001

Definition at line 211 of file functions.h.

#define FN_BODY_FN   0x0002

Definition at line 212 of file functions.h.

#define FN_HAS_REFARGS   0x0004

Definition at line 213 of file functions.h.

#define FN_MAPPED_EVAL   0x0008

Definition at line 214 of file functions.h.

#define is_structMethod (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == INTERNAL_STRUCT_METHOD_TAG)

Definition at line 234 of file functions.h.

#define is_pluginMethod (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == INTERNAL_MSPLUGIN_METHOD_TAG)

Definition at line 276 of file functions.h.

#define def_user_prop (   _prop,
  _cls,
  _getter,
  _setter 
)    _cls##_class.add_user_prop(#_prop, _getter, _setter)

Definition at line 330 of file functions.h.

#define def_user_generic (   _fn,
  _cls,
  _name 
)    _cls##_class.add_user_generic(#_name, _fn)

Definition at line 333 of file functions.h.

#define VALUECONVERTER_INTERFACE_ID   Interface_ID(0x19f37b9f, 0x39ed5680)

Definition at line 381 of file functions.h.

#define is_iobject (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(IObjectValue))
#define is_fpstaticinterface (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPInterfaceValue))
#define is_fpmixininterface (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPMixinInterfaceValue))
#define is_fpstaticmethodinterface (   v)    ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPStaticMethodInterfaceValue))

Enumeration Type Documentation

Enumerator:
LAZY_PRIMITIVE 
DEBUGGER_SAFE 

Definition at line 124 of file functions.h.

{
    LAZY_PRIMITIVE  =   0x0001, // don't pre-evaluate args for lazy primitives
    DEBUGGER_SAFE   =   0x0002, // safe to call from debugger
};

Function Documentation

visible_class ( Function  )

Definition at line 31 of file functions.h.

               : public Value
{
// Whether the function can be called from debugger thread stored in Collectable::flags3 - bit 0. Default is false.
public:
    MCHAR*      name;
    MCHAR*      struct_name;    // packaged in a struct if non-null

                   Function() { name = NULL; struct_name = NULL; }
    ScripterExport Function(MCHAR* name, MCHAR* struct_name=NULL);
    ScripterExport Function(MCHAR* name, MCHAR* struct_name, bool debuggerSafe);
    ScripterExport ~Function();

                classof_methods (Function, Value);
#   define      is_function(v) ((v)->_is_function())
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return 1; }

    ScripterExport void sprin1(CharStream* s);
    ScripterExport void export_to_scripter();
};
visible_class ( Generic  )

Definition at line 69 of file functions.h.

              : public Function
{
public:
    value_vf    fn_ptr;

                Generic() { }
 ScripterExport Generic(MCHAR* name, value_vf fn, MCHAR* struct_name = NULL);
 ScripterExport Generic(MCHAR* name, value_vf fn, MCHAR* struct_name, short init_flags=0);
                Generic(MCHAR* name) : Function(name) { }

                classof_methods (Generic, Function);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return 1; }
    ScripterExport void init(MCHAR* name, value_vf fn);
    void        collect() { delete this; }

    ScripterExport Value* apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( MappedGeneric  )

Definition at line 89 of file functions.h.

                    : public Generic
{
public:
                MappedGeneric() { }
 ScripterExport MappedGeneric(MCHAR* name, value_vf fn);
 ScripterExport MappedGeneric(MCHAR* name, value_vf fn, short init_flags);
                MappedGeneric(MCHAR* name) : Generic(name) { }

                classof_methods (MappedGeneric, Generic);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return 1; }
    void        collect() { delete this; }

    ScripterExport Value* apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( NodeGeneric  )

Definition at line 106 of file functions.h.

                  : public MappedGeneric
{
public:
 ScripterExport NodeGeneric(MCHAR* name, value_vf fn);
 ScripterExport NodeGeneric(MCHAR* name, value_vf fn, short init_flags);
                NodeGeneric(MCHAR* name) : MappedGeneric(name) { }

                classof_methods (NodeGeneric, MappedGeneric);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return 1; }
    void        collect() { delete this; }

    ScripterExport Value* apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( Primitive  )

Definition at line 130 of file functions.h.

                : public Function
{ 
public:
    short       flags;
    value_cf    fn_ptr;

                Primitive() { flags=0; }
 ScripterExport Primitive(MCHAR* name, value_cf fn, short init_flags=0);
 ScripterExport Primitive(MCHAR* name, MCHAR* structure, value_cf fn, short init_flags=0);
                Primitive(MCHAR* name) : Function(name) { flags=0; }

                classof_methods (Primitive, Function);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return 1; }
    void        collect() { delete this; }

    ScripterExport Value* apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( MappedPrimitive  )

Definition at line 150 of file functions.h.

                      : public Primitive
{ 
public:
 ScripterExport MappedPrimitive(MCHAR* name, value_cf fn);
 ScripterExport MappedPrimitive(MCHAR* name, value_cf fn, short init_flags);

                classof_methods (MappedPrimitive, Primitive);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return 1; }
    void        collect() { delete this; }

    ScripterExport Value* apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( MAXScriptFunction  )

Definition at line 167 of file functions.h.

                        : public Function
{
public:
    short       parameter_count;
    short       local_count;
    short       keyparm_count;
    short       flags;
    Value**     keyparms;
    Value*      body;
    HashTable*  local_scope;
    value_cf    c_callable_fn;
    Array*      paramNames;
    Value*      owner;

 ScripterExport MAXScriptFunction(MCHAR* name, int parm_count, int keyparm_count, Value** keyparms,
                                  int local_count, Value* body, HashTable* local_scope, short flags = 0);
 ScripterExport MAXScriptFunction(MCHAR* name, int parm_count, int keyparm_count, Value** keyparms,
                                  int local_count, Value* body, HashTable* local_scope, Array* param_names, 
                                  Value* owner, short flags = 0);
                ~MAXScriptFunction();
#   define      is_maxscriptfunction(v) ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(MAXScriptFunction))

                classof_methods (MAXScriptFunction, Function);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return TRUE; }
    void        collect() { delete this; }
    void        gc_trace();
    void        sprin1(CharStream* s);

    Value*      apply(Value** arglist, int count, CallContext* cc=NULL);
    Value*      apply_no_alloc_frame(Value** arglist, int count, CallContext* cc=NULL);

    value_cf    get_c_callable_fn();

    Value*      operator()(Value** arg_list, int count);

    // added 3/21/05. Used by debugger to dump locals, parms, and externals to standard out
    void        dump_local_vars_params_and_externals(Value** paramsFrame, Value** localsFrame, int indentLevel);

protected:
    Value*      wrap_arg(Value* arg);
};
visible_class ( UserGenericValue  )

Definition at line 312 of file functions.h.

                       : public Function
{
public:
    Value*      fn_name;
    Value*      old_fn;   // if non-NULL, the original global fn that this usergeneric replaced
                
 ScripterExport UserGenericValue(Value* name, Value* old_fn);

                classof_methods (UserGenericValue, Function);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return TRUE; }
    void        collect() { delete this; }
    void        gc_trace();

    Value*      apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( InterfaceFunction  )

Definition at line 349 of file functions.h.

                        : public Function
{
public:
    FPInterfaceDesc* fpid;
    FPFunctionDef*   fd;

                InterfaceFunction(FPInterface* fpi, FPFunctionDef* fd);
                ~InterfaceFunction();

                classof_methods (InterfaceFunction, Function);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return TRUE; }
    void        collect() { delete this; }
    void        gc_trace();
    void        sprin1(CharStream* s);

    Value*      apply(Value** arglist, int count, CallContext* cc=NULL);
    Value*      get_property(Value** arg_list, int count);

    // parameter conversion utilities
    ScripterExport static void    val_to_FPValue(Value* v, ParamType2 type, FPValue& fpv, FPEnum* e, Tab<void*> *stringStorage, Array* valueStore);
    ScripterExport static void    val_to_FPValue(Value* v, ParamType2 type, FPValue& fpv, FPEnum* e, Tab<void*> *stringStorage);
    ScripterExport static void    val_to_FPValue(Value* v, ParamType2 type, FPValue& fpv, FPEnum* e=NULL);
    ScripterExport static Value*  FPValue_to_val(FPValue& fpv, FPEnum* e=NULL);
    ScripterExport static void    release_param(FPValue& fpv, ParamType2 type, Value* v, FPEnum* e=NULL);
    ScripterExport static void    init_param(FPValue& fpv, ParamType2 type);
    ScripterExport static void    validate_params(FPInterface* fpi, FunctionID fid, FPParamDef* pd, ParamType2 type, int paramNum, FPValue& val, Value* v);
    ScripterExport static FPEnum* FindEnum(short id, FPInterfaceDesc* fpid);
};
visible_class ( ActionPredicate  )

Definition at line 431 of file functions.h.

                      : public InterfaceFunction
{
public:
    short       pred;

    ActionPredicate(FPInterface* fpi, FPFunctionDef* fd, short pred);

                classof_methods (ActionPredicate, Function);
    BOOL        _is_function() { DbgAssert(!is_sourcepositionwrapper(this)); return TRUE; }
    void        collect() { delete this; }

    Value*      apply(Value** arglist, int count, CallContext* cc=NULL);
};
visible_class ( IObjectValue  )

Definition at line 452 of file functions.h.

                   : public Value
{
public:
    IObject* iobj;                  // the IObject pointer

            IObjectValue(IObject* io);
           ~IObjectValue();
#   define  is_iobject(v) ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(IObjectValue))

            classof_methods (IObjectValue, Value);
    void    collect() { delete this; }
    void    sprin1(CharStream* s);

    MSTR    to_filename(); // returns guidstring if wraps AssetUser
    void    to_fpvalue(FPValue& v) { v.iobj = iobj; v.type = TYPE_IOBJECT; }

    def_generic (show_interfaces,  "showInterfaces"); 
    def_generic (get_interfaces, "getInterfaces");
    def_generic (get_interface, "getInterface");

// End of 3ds max 4.2 Extension

    BaseInterface* GetInterface(Interface_ID id) { return iobj->GetInterface(id); }

    //accesses interfaces on the IObject
    Value*  get_property(Value** arg_list, int count);
    Value*  set_property(Value** arg_list, int count);
};
visible_class ( FPInterfaceValue  )

Definition at line 485 of file functions.h.

                       : public Value, public InterfaceNotifyCallback
{
public:
    FPInterface* fpi;           // interface
    HashTable*   fns;           // interface fn lookup
    HashTable*   props;         // interface prop lookup
    FPInterface::LifetimeType lifetime; // interface lifetime control type
    static bool  enable_test_interfaces;  // test interface enable flag
    // Whether to call fpi->ReleaseInterface stored in Collectable::flags3 - bit 0

    ScripterExport FPInterfaceValue(FPInterface* fpi);   
    FPInterfaceValue(FPInterfaceProxy* proxy);
    ~FPInterfaceValue();

    // Needed to solve ambiguity between Collectable's operators and MaxHeapOperators
    using Collectable::operator new;
    using Collectable::operator delete;

#   define  is_fpstaticinterface(v) ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPInterfaceValue))

            classof_methods (FPInterfaceValue, Value);
            def_generic ( show_interface,       "showInterface"); // LAM: 08/29/00
            def_generic ( get_props,            "getPropNames"); // LAM: added 2/1/02
            def_generic ( isDeleted,            "isDeleted");   // LAM: 11/23/01 - added - doesn't break SDK
            use_generic( eq,                    "=" );          // LAM: 11/23/01 - added - doesn't break SDK
            use_generic( ne,                    "!=" );         // LAM: 11/23/01 - added - doesn't break SDK
    void    collect() { delete this; }
    void    gc_trace();
    void    sprin1(CharStream* s);

// The following method has 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.

    void    to_fpvalue(FPValue& v) { 
        resolve_proxy();
        v.fpi = fpi; 
        v.type = TYPE_INTERFACE; 
    }

// End of 3ds max 4.2 Extension

    // from InterfaceNotifyCallback
    void    InterfaceDeleted(BaseInterface* bi) { UNUSED_PARAM(bi); fpi = NULL; }  

    // accesses methods & props in the interface
    Value*  _get_property(Value* prop);
    Value*  _set_property(Value* prop, Value* val);

    Value*  get_property(Value** arg_list, int count);
    Value*  set_property(Value** arg_list, int count);

    static void UpdateEditorOnResolve(bool update = true);

private:
    void    resolve_proxy();
    void    set_interface(FPInterface* fpi);

    FPInterfaceProxy*   m_fpip;
    static bool         s_updateEditorOnResolve;
};
ScripterExport void print_FP_interface ( CharStream *  out,
FPInterface fpi,
bool  getPropNames = true,
bool  getMethodNames = true,
bool  getInterfaceNames = true,
bool  getActionTables = true 
)
visible_class ( FPMixinInterfaceValue  )

Definition at line 558 of file functions.h.

                            : public Value, public InterfaceNotifyCallback
{
private:
            FPMixinInterfaceValue(FPInterface* fpi);
           ~FPMixinInterfaceValue();
    static  FPMixinInterfaceValue* FPMixinInterfaceValue::interface_cache[128];
    friend void Collectable::gc();
    friend void Collectable::mark();
public:
    FPInterface* fpi;                       // interface
    FPInterface::LifetimeType lifetime;     // interface lifetime control type
    // Whether to call fpi->ReleaseInterface stored in Collectable::flags3 - bit 0

    // Needed to solve ambiguity between Collectable's operators and MaxHeapOperators
    using Collectable::operator new;
    using Collectable::operator delete;

    static  ScripterExport FPMixinInterfaceValue* intern(Value* prop_name, Value* target);
    static  ScripterExport FPMixinInterfaceValue* intern(FPInterface* fpi);
#   define  is_fpmixininterface(v) ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPMixinInterfaceValue))

            classof_methods (FPMixinInterfaceValue, Value);
            def_generic ( show_interface,       "showInterface"); // LAM: 08/29/00
            def_generic ( isDeleted,            "isDeleted");   // LAM: 11/23/01 - added - doesn't break SDK
            use_generic( eq,                    "=" );          // LAM: 11/23/01 - added - doesn't break SDK
            use_generic( ne,                    "!=" );         // LAM: 11/23/01 - added - doesn't break SDK
            def_generic ( get_props,            "getPropNames"); // LAM: added 2/1/02
    void    collect() { delete this; }
    void    sprin1(CharStream* s);

// The following method has 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.

    void    to_fpvalue(FPValue& v) { v.fpi = fpi; v.type = TYPE_INTERFACE; }

// End of 3ds max 4.2 Extension

    // from InterfaceNotifyCallback
    void    InterfaceDeleted(BaseInterface* bi); 

    // accesses methods & props in the interface
    Value*  _get_property(Value* prop);
    Value*  _set_property(Value* prop, Value* val);

    Value*  get_property(Value** arg_list, int count);
    Value*  set_property(Value** arg_list, int count);
};
visible_class ( FPStaticMethodInterfaceValue  )

Definition at line 622 of file functions.h.

                                   : public Value, public InterfaceNotifyCallback
{
private:
            FPStaticMethodInterfaceValue(FPInterface* fpi, ParamType2 type, void* object);
           ~FPStaticMethodInterfaceValue();
    static  FPStaticMethodInterfaceValue* interface_cache[FPS_CACHE_SIZE];
    friend void Collectable::gc();
    friend void Collectable::mark();
public:
    FPInterface* fpi;           // interface
    FPValue      value;         // the target object as FPValue first argument
    FPInterface::LifetimeType lifetime; // interface lifetime control type
    // Whether to call fpi->ReleaseInterface stored in Collectable::flags3 - bit 0

    // Needed to solve ambiguity between Collectable's operators and MaxHeapOperators
    using Collectable::operator new;
    using Collectable::operator delete;

    static  ScripterExport FPStaticMethodInterfaceValue* intern(FPInterface* fpi, ParamType2 type, void* object);
#   define  is_fpstaticmethodinterface(v) ((DbgVerify(!is_sourcepositionwrapper(v)), (v))->tag == class_tag(FPStaticMethodInterfaceValue))

            classof_methods (FPStaticMethodInterfaceValue, Value);
            def_generic ( show_interface,       "showInterface"); // LAM: 08/29/00
            def_generic ( isDeleted,            "isDeleted");   // LAM: 11/23/01 - added - doesn't break SDK
            use_generic( eq,                    "=" );          // LAM: 11/23/01 - added - doesn't break SDK
            use_generic( ne,                    "!=" );         // LAM: 11/23/01 - added - doesn't break SDK
            def_generic ( get_props,            "getPropNames"); // LAM: added 2/1/02
    void    collect() { delete this; }
    void    sprin1(CharStream* s);

    // from InterfaceNotifyCallback
    void    InterfaceDeleted(BaseInterface* bi) { UNUSED_PARAM(bi); fpi = NULL; }  

    // accesses methods & props in the interface
    Value*  _get_property(Value* prop);
    Value*  _set_property(Value* prop, Value* val);

    Value*  get_property(Value** arg_list, int count);
    Value*  set_property(Value** arg_list, int count);
};