MAXScript functions are represented using the class MAXScriptFunction
defined in the header file maxscrpt
\funcs.h. If you have an instance of MAXScriptFunction
you can use the following method to evaluate the function:
Value* MAXScriptFunction::apply(Value** arglist, int count, CallContext* cc=NULL)
Functions exposed to the MAXScript engine using the What would a Plug-in Publish? are represented as instances of the class InterfaceFunction
.
All MAXScript functions are derived from the Value
class, meaning that they first class values in MAXScript.
The most important kind of 3ds Max function is the Primitive
function of which there are three kinds:
def_visible_primitive
( function_pointer, name)MappedPrimitive
function and are defined using the macro def_mapped_primitive
(function_pointer, name)def_lazy_primitive
( function_pointer, name)The function
argument to these macros must have the following signature:
Value* <name>_cf(Value** arg_list, int count)
To avoid name conflicts the C++ function implementation must have the suffix "_cf". The name
argument to the macro is used to define a global MAXScript variable with the given name. This global variable will hold the function.
There is no implicit type or argument checking in this calling mechanism - you have to do it yourself in the C++ implementation function. The following macros to help with this:
check_arg_count
( fn_name, wanted_count, got_count)type_check
( val, class, fn_name_or_description)Example:
Value* open_file_cf(Value** arg_list, int count)
{
// check that we have 1 arg and that it's a string
check_arg_count(openFile, 1, count);
type_check(arg_list[0], String, "openFile filename");
...
char* fn = arg_list[0]->to_string();
...
}