00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <string.h>
00029 #include <malloc.h>
00030 #include <math.h>
00031 #include <UT/UT_DSOVersion.h>
00032 #include <EXPR/EXPR.h>
00033 #include <OP/OP_Director.h>
00034 #include <CH/CH_Support.h>
00035 #include <CH/CH_Collection.h>
00036 #include <CMD/CMD_Manager.h>
00037
00038
00039 static void
00040 getTimeValues(int thread,
00041 float &t, float &t0, float &t1, float &v0, float &v1,
00042 float *m0=0, float *m1=0, float *a0=0, float *a1=0)
00043 {
00044 CH_Collection *channels;
00045 channels = OPgetDirector()->getChannelManager()->getEvalCollection(thread);
00046
00047
00048 channels->getGlueTime(t, t0, t1, v0, v1, thread);
00049
00050
00051 if (m0 || m1 || a0 || a1)
00052 channels->getGlueSlope(m0, m1, a0, a1, thread);
00053 }
00054
00055 #ifndef EV_START_FNNA
00056 #define EV_START_FNNA(name) \
00057 static void name(EV_FUNCTION *, EV_SYMBOL *result, \
00058 EV_SYMBOL **, int thread)
00059 #endif // EV_START_FNNA
00060
00061 EV_START_FNNA(fn_myLinear)
00062 {
00063 float t, t0, t1, v0, v1;
00064 float dt;
00065
00066 getTimeValues(thread, t, t0, t1, v0, v1);
00067 dt = t1 - t0;
00068 result->value.fval = (dt == 0) ? (v0+v1)*0.5F
00069 : v0 + (v1-v0)*(t - t0)/dt;
00070 }
00071
00072 #define EVF EV_TYPEFLOAT
00073 #define EVS EV_TYPESTRING
00074 #define EVV EV_TYPEVECTOR
00075
00076
00077
00078
00079 #define VAL_FLAGS (CH_EXPRVALUE)
00080 #define VALSLOPE_FLAGS (CH_EXPRVALUE | CH_EXPRSLOPE)
00081
00082 static EV_FUNCTION funcTable[] = {
00083 EV_FUNCTION(VAL_FLAGS, "myLinear", 0, EVF, 0, fn_myLinear),
00084 EV_FUNCTION(),
00085 };
00086
00087 void
00088 CMDextendLibrary(CMD_Manager *)
00089 {
00090 int i;
00091
00092 for (i = 0; funcTable[i].getName(); i++)
00093 ev_AddFunction(&funcTable[i]);
00094 }