1
////---------------------------------------------------------------------
2
//// Class definition file: FUNCDEF.CPP
3
//// Associated header file: FUNCDEF.H
5
//// Author: Paul C. Gregory
6
//// Creation date: 22/07/99
7
////---------------------------------------------------------------------
10
#include "parsenode.h"
13
START_NAMESPACE( Aqsis )
15
///---------------------------------------------------------------------
16
/// Global array of standard function definitions
18
char* gVariableTypeIdentifiers[] =
34
TqInt gcVariableTypeIdentifiers = sizeof( gVariableTypeIdentifiers ) / sizeof( gVariableTypeIdentifiers[ 0 ] );
37
CqFuncDef gStandardFuncs[] = {
38
CqFuncDef( Type_Float, "operator*", "mulff", "ff" ),
39
CqFuncDef( Type_Float, "operator/", "divff", "ff" ),
40
CqFuncDef( Type_Float, "operator+", "addff", "ff" ),
41
CqFuncDef( Type_Float, "operator-", "subff", "ff" ),
42
CqFuncDef( Type_Float, "operatorneg", "negf", "f" ),
44
CqFuncDef( Type_Point, "operator*", "mulpp", "pp" ),
45
CqFuncDef( Type_Point, "operator/", "divpp", "pp" ),
46
CqFuncDef( Type_Point, "operator+", "addpp", "pp" ),
47
CqFuncDef( Type_Point, "operator-", "subpp", "pp" ),
48
CqFuncDef( Type_Point, "operator^", "crspp", "pp" ),
49
CqFuncDef( Type_Float, "operator.", "dotpp", "pp" ),
50
CqFuncDef( Type_Point, "operatorneg", "negp", "p" ),
52
CqFuncDef( Type_Color, "operator*", "mulcc", "cc" ),
53
CqFuncDef( Type_Color, "operator/", "divcc", "cc" ),
54
CqFuncDef( Type_Color, "operator+", "addcc", "cc" ),
55
CqFuncDef( Type_Color, "operator-", "subcc", "cc" ),
56
CqFuncDef( Type_Color, "operatorneg", "negc", "c" ),
58
CqFuncDef( Type_Vector, "operator*", "mulpp", "vv" ),
59
CqFuncDef( Type_Vector, "operator/", "divpp", "vv" ),
60
CqFuncDef( Type_Vector, "operator+", "addpp", "vv" ),
61
CqFuncDef( Type_Vector, "operator-", "subpp", "vv" ),
62
CqFuncDef( Type_Vector, "operator^", "crspp", "vv" ),
63
CqFuncDef( Type_Float, "operator.", "dotpp", "vv" ),
64
CqFuncDef( Type_Vector, "operatorneg", "negp", "v" ),
66
CqFuncDef( Type_Normal, "operator*", "mulpp", "nn" ),
67
CqFuncDef( Type_Normal, "operator/", "divpp", "nn" ),
68
CqFuncDef( Type_Normal, "operator+", "addpp", "nn" ),
69
CqFuncDef( Type_Normal, "operator-", "subpp", "nn" ),
70
CqFuncDef( Type_Normal, "operator^", "crspp", "nn" ),
71
CqFuncDef( Type_Float, "operator.", "dotpp", "nn" ),
72
CqFuncDef( Type_Normal, "operatorneg", "negp", "n" ),
74
CqFuncDef( Type_Point, "operator*", "mulfp", "fp" ),
75
CqFuncDef( Type_Point, "operator/", "divfp", "fp" ),
76
CqFuncDef( Type_Point, "operator+", "addfp", "fp" ),
77
CqFuncDef( Type_Point, "operator-", "subfp", "fp" ),
79
CqFuncDef( Type_Color, "operator*", "mulfc", "fc" ),
80
CqFuncDef( Type_Color, "operator/", "divfc", "fc" ),
81
CqFuncDef( Type_Color, "operator+", "addfc", "fc" ),
82
CqFuncDef( Type_Color, "operator-", "subfc", "fc" ),
84
CqFuncDef( Type_Vector, "operator*", "mulfp", "fv" ),
85
CqFuncDef( Type_Vector, "operator/", "divfp", "fv" ),
86
CqFuncDef( Type_Vector, "operator+", "addfp", "fv" ),
87
CqFuncDef( Type_Vector, "operator-", "subfp", "fv" ),
89
CqFuncDef( Type_Normal, "operator*", "mulfp", "fn" ),
90
CqFuncDef( Type_Normal, "operator/", "divfp", "fn" ),
91
CqFuncDef( Type_Normal, "operator+", "addfp", "fn" ),
92
CqFuncDef( Type_Normal, "operator-", "subfp", "fn" ),
94
CqFuncDef( Type_Matrix, "operator*", "mulmm", "mm" ),
95
CqFuncDef( Type_Matrix, "operator/", "divmm", "mm" ),
97
CqFuncDef( Type_Float, "radians", "radians", "f" ),
98
CqFuncDef( Type_Float, "degrees", "degrees", "f" ),
99
CqFuncDef( Type_Float, "sin", "sin", "f" ),
100
CqFuncDef( Type_Float, "asin", "asin", "f" ),
101
CqFuncDef( Type_Float, "cos", "cos", "f" ),
102
CqFuncDef( Type_Float, "acos", "acos", "f" ),
103
CqFuncDef( Type_Float, "tan", "tan", "f" ),
104
CqFuncDef( Type_Float, "atan", "atan", "f" ),
105
CqFuncDef( Type_Float, "atan", "atan2", "ff" ),
106
CqFuncDef( Type_Float, "pow", "pow", "ff" ),
107
CqFuncDef( Type_Float, "exp", "exp", "f" ),
108
CqFuncDef( Type_Float, "sqrt", "sqrt", "f" ),
109
CqFuncDef( Type_Float, "log", "log", "f" ),
110
CqFuncDef( Type_Float, "log", "log2", "ff" ),
111
CqFuncDef( Type_Float, "mod", "mod", "ff" ),
112
CqFuncDef( Type_Float, "abs", "abs", "f" ),
113
CqFuncDef( Type_Float, "sign", "sign", "f" ),
114
CqFuncDef( Type_Float, "min", "min", "ff*" ),
115
CqFuncDef( Type_Float, "max", "max", "ff*" ),
116
CqFuncDef( Type_Point, "min", "pmin", "pp*" ),
117
CqFuncDef( Type_Point, "max", "pmax", "pp*" ),
118
CqFuncDef( Type_Vector, "min", "vmin", "vv*" ),
119
CqFuncDef( Type_Vector, "max", "vmax", "vv*" ),
120
CqFuncDef( Type_Normal, "min", "nmin", "nn*" ),
121
CqFuncDef( Type_Normal, "max", "nmax", "nn*" ),
122
CqFuncDef( Type_Color, "min", "cmin", "cc*" ),
123
CqFuncDef( Type_Color, "max", "cmax", "cc*" ),
124
CqFuncDef( Type_Float, "clamp", "clamp", "fff" ),
125
CqFuncDef( Type_Point, "clamp", "pclamp", "ppp" ),
126
CqFuncDef( Type_Vector, "clamp", "vclamp", "vvv" ),
127
CqFuncDef( Type_Normal, "clamp", "nclamp", "nnn" ),
128
CqFuncDef( Type_Color, "clamp", "cclamp", "ccc" ),
129
CqFuncDef( Type_Float, "floor", "floor", "f" ),
130
CqFuncDef( Type_Float, "ceil", "ceil", "f" ),
131
CqFuncDef( Type_Float, "round", "round", "f" ),
132
CqFuncDef( Type_Float, "step", "step", "ff" ),
133
CqFuncDef( Type_Float, "smoothstep", "smoothstep", "fff" ),
134
CqFuncDef( Type_Float, "spline", "fspline", "fffff*" ),
135
CqFuncDef( Type_Color, "spline", "cspline", "fcccc*" ),
136
CqFuncDef( Type_Point, "spline", "pspline", "fpppp*" ),
137
CqFuncDef( Type_Point, "spline", "vspline", "fvvvv*" ),
138
CqFuncDef( Type_Float, "spline", "sfspline", "sfffff*" ),
139
CqFuncDef( Type_Color, "spline", "scspline", "sfcccc*" ),
140
CqFuncDef( Type_Point, "spline", "spspline", "sfpppp*" ),
141
CqFuncDef( Type_Point, "spline", "svspline", "sfvvvv*" ),
142
CqFuncDef( Type_Float, "Du", "fDu", "f", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
143
CqFuncDef( Type_Float, "Dv", "fDv", "f", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
144
CqFuncDef( Type_Float, "Deriv", "fDeriv", "ff", ( 1 << EnvVars_u ) | ( 1 << EnvVars_v ) ),
145
CqFuncDef( Type_Color, "Du", "cDu", "c", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
146
CqFuncDef( Type_Color, "Dv", "cDv", "c", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
147
CqFuncDef( Type_Color, "Deriv", "cDeriv", "cf", ( 1 << EnvVars_u ) | ( 1 << EnvVars_v ) ),
148
CqFuncDef( Type_Point, "Du", "pDu", "p", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
149
CqFuncDef( Type_Point, "Dv", "pDv", "p", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
150
CqFuncDef( Type_Point, "Deriv", "pDeriv", "pf", ( 1 << EnvVars_u ) | ( 1 << EnvVars_v ) ),
151
CqFuncDef( Type_hPoint, "Du", "hDu", "h", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
152
CqFuncDef( Type_hPoint, "Dv", "hDv", "h", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
153
CqFuncDef( Type_hPoint, "Deriv", "hDeriv", "hf", ( 1 << EnvVars_u ) | ( 1 << EnvVars_v ) ),
154
CqFuncDef( Type_Normal, "Du", "nDu", "n", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
155
CqFuncDef( Type_Normal, "Dv", "nDv", "n", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
156
CqFuncDef( Type_Normal, "Deriv", "nDeriv", "nf", ( 1 << EnvVars_u ) | ( 1 << EnvVars_v ) ),
157
CqFuncDef( Type_Vector, "Du", "vDu", "v", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
158
CqFuncDef( Type_Vector, "Dv", "vDv", "v", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
159
CqFuncDef( Type_Vector, "Deriv", "vDeriv", "vf", ( 1 << EnvVars_u ) | ( 1 << EnvVars_v ) ),
160
CqFuncDef( Type_Float, "random", "frandom", "" ),
161
CqFuncDef( Type_Color, "random", "crandom", "" ),
162
CqFuncDef( Type_Point, "random", "prandom", "" ),
163
CqFuncDef( Type_Float, "noise", "noise1", "f" ),
164
CqFuncDef( Type_Float, "noise", "noise2", "ff" ),
165
CqFuncDef( Type_Float, "noise", "noise3", "p" ),
166
CqFuncDef( Type_Float, "noise", "noise4", "pf" ),
167
CqFuncDef( Type_Color, "noise", "cnoise1", "f" ),
168
CqFuncDef( Type_Color, "noise", "cnoise2", "ff" ),
169
CqFuncDef( Type_Color, "noise", "cnoise3", "p" ),
170
CqFuncDef( Type_Color, "noise", "cnoise4", "pf" ),
171
CqFuncDef( Type_Point, "noise", "pnoise1", "f" ),
172
CqFuncDef( Type_Point, "noise", "pnoise2", "ff" ),
173
CqFuncDef( Type_Point, "noise", "pnoise3", "p" ),
174
CqFuncDef( Type_Point, "noise", "pnoise4", "pf" ),
175
CqFuncDef( Type_Vector, "noise", "pnoise1", "f" ),
176
CqFuncDef( Type_Vector, "noise", "pnoise2", "ff" ),
177
CqFuncDef( Type_Vector, "noise", "pnoise3", "p" ),
178
CqFuncDef( Type_Vector, "noise", "pnoise4", "pf" ),
179
CqFuncDef( Type_Float, "xcomp", "xcomp", "p" ),
180
CqFuncDef( Type_Float, "ycomp", "ycomp", "p" ),
181
CqFuncDef( Type_Float, "zcomp", "zcomp", "p" ),
182
CqFuncDef( Type_Float, "xcomp", "xcomp", "h" ),
183
CqFuncDef( Type_Float, "ycomp", "ycomp", "h" ),
184
CqFuncDef( Type_Float, "zcomp", "zcomp", "h" ),
185
CqFuncDef( Type_Float, "xcomp", "xcomp", "n" ),
186
CqFuncDef( Type_Float, "ycomp", "ycomp", "n" ),
187
CqFuncDef( Type_Float, "zcomp", "zcomp", "n" ),
188
CqFuncDef( Type_Float, "xcomp", "xcomp", "v" ),
189
CqFuncDef( Type_Float, "ycomp", "ycomp", "v" ),
190
CqFuncDef( Type_Float, "zcomp", "zcomp", "v" ),
191
CqFuncDef( Type_Float, "length", "length", "p" ),
192
CqFuncDef( Type_Float, "distance", "distance", "pp" ),
193
CqFuncDef( Type_Float, "area", "area", "p", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
194
CqFuncDef( Type_Float, "area", "area", "h", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
195
CqFuncDef( Type_Point, "normalize", "normalize", "p" ),
196
CqFuncDef( Type_Point, "faceforward", "faceforward", "pp" ),
197
CqFuncDef( Type_Point, "faceforward", "faceforward2", "ppp" ),
198
CqFuncDef( Type_Point, "reflect", "reflect", "pp" ),
199
CqFuncDef( Type_Point, "refract", "refract", "ppf" ),
200
CqFuncDef( Type_Void, "fresnel", "fresnel", "ppfFF" ),
201
CqFuncDef( Type_Void, "fresnel", "fresnel2", "ppfFFPP" ),
202
CqFuncDef( Type_Point, "transform", "transform2", "ssp" ),
203
CqFuncDef( Type_Point, "transform", "transform", "sp" ),
204
CqFuncDef( Type_Float, "depth", "depth", "p" ),
205
CqFuncDef( Type_Point, "calculatenormal", "calculatenormal", "p", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
206
CqFuncDef( Type_Point, "calculatenormal", "calculatenormal", "h", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
207
CqFuncDef( Type_Float, "comp", "comp", "cf" ),
208
CqFuncDef( Type_Void, "setcomp", "setcomp", "cff" ),
209
CqFuncDef( Type_Color, "mix", "cmix", "ccf" ),
210
CqFuncDef( Type_Color, "ambient", "ambient", "" ),
211
CqFuncDef( Type_Color, "diffuse", "diffuse", "p" ),
212
CqFuncDef( Type_Color, "specular", "specular", "ppf" ),
213
CqFuncDef( Type_Color, "phong", "phong", "ppf" ),
214
CqFuncDef( Type_Color, "trace", "trace", "pp" ),
215
CqFuncDef( Type_Float, "shadow", "shadow2", "sfpppp*" ),
216
CqFuncDef( Type_Float, "shadow", "shadow", "sfp*" ),
217
CqFuncDef( Type_Float, "texture", "ftexture3", "sfffffffff*" ),
218
CqFuncDef( Type_Float, "texture", "ftexture2", "sfff*", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
219
CqFuncDef( Type_Float, "texture", "ftexture1", "sf*", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) | ( 1 << EnvVars_s ) | ( 1 << EnvVars_t ) ),
220
CqFuncDef( Type_Color, "texture", "ctexture3", "sfffffffff*" ),
221
CqFuncDef( Type_Color, "texture", "ctexture2", "sfff*", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
222
CqFuncDef( Type_Color, "texture", "ctexture1", "sf*", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) | ( 1 << EnvVars_s ) | ( 1 << EnvVars_t ) ),
223
CqFuncDef( Type_Float, "environment", "fenvironment3", "sfpppp*" ),
224
CqFuncDef( Type_Float, "environment", "fenvironment2", "sfp*", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
225
CqFuncDef( Type_Color, "environment", "cenvironment3", "sfpppp*" ),
226
CqFuncDef( Type_Color, "environment", "cenvironment2", "sfp*", ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) | ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) ),
227
CqFuncDef( Type_Point, "bump", "bump3", "sfpppffffffff*" ),
228
CqFuncDef( Type_Point, "bump", "bump2", "sfpppff*" ),
229
CqFuncDef( Type_Point, "bump", "bump1", "sfppp*" ),
230
CqFuncDef( Type_Void, "printf", "printf", "s*" ),
232
CqFuncDef( Type_Point, "transform", "transformm", "mp" ),
233
CqFuncDef( Type_Vector, "vtransform", "vtransform2", "ssv" ),
234
CqFuncDef( Type_Vector, "vtransform", "vtransform", "sv" ),
235
CqFuncDef( Type_Vector, "vtransform", "vtransformm", "mv" ),
236
CqFuncDef( Type_Normal, "ntransform", "ntransform2", "ssn" ),
237
CqFuncDef( Type_Normal, "ntransform", "ntransform", "sn" ),
238
CqFuncDef( Type_Normal, "ntransform", "ntransformm", "mn" ),
239
CqFuncDef( Type_Color, "ctransform", "ctransform2", "ssc" ),
240
CqFuncDef( Type_Color, "ctransform", "ctransform", "sc" ),
241
CqFuncDef( Type_Float, "cellnoise", "fcellnoise1", "f" ),
242
CqFuncDef( Type_Float, "cellnoise", "fcellnoise2", "ff" ),
243
CqFuncDef( Type_Float, "cellnoise", "fcellnoise3", "p" ),
244
CqFuncDef( Type_Float, "cellnoise", "fcellnoise4", "pf" ),
245
CqFuncDef( Type_Color, "cellnoise", "ccellnoise1", "f" ),
246
CqFuncDef( Type_Color, "cellnoise", "ccellnoise2", "ff" ),
247
CqFuncDef( Type_Color, "cellnoise", "ccellnoise3", "p" ),
248
CqFuncDef( Type_Color, "cellnoise", "ccellnoise4", "pf" ),
249
CqFuncDef( Type_Point, "cellnoise", "pcellnoise1", "f" ),
250
CqFuncDef( Type_Point, "cellnoise", "pcellnoise2", "ff" ),
251
CqFuncDef( Type_Point, "cellnoise", "pcellnoise3", "p" ),
252
CqFuncDef( Type_Point, "cellnoise", "pcellnoise4", "pf" ),
253
CqFuncDef( Type_Vector, "cellnoise", "pcellnoise1", "f" ),
254
CqFuncDef( Type_Vector, "cellnoise", "pcellnoise2", "ff" ),
255
CqFuncDef( Type_Vector, "cellnoise", "pcellnoise3", "p" ),
256
CqFuncDef( Type_Vector, "cellnoise", "pcellnoise4", "pf" ),
257
CqFuncDef( Type_Float, "mix", "fmix", "fff" ),
258
CqFuncDef( Type_Point, "mix", "pmix", "ppf" ),
259
CqFuncDef( Type_Vector, "mix", "vmix", "vvf" ),
260
CqFuncDef( Type_Normal, "mix", "nmix", "nnf" ),
262
CqFuncDef( Type_Void, "setcomp", "setcomp", "Cff" ),
263
CqFuncDef( Type_Void, "setxcomp", "setxcomp", "Pf" ),
264
CqFuncDef( Type_Void, "setycomp", "setycomp", "Pf" ),
265
CqFuncDef( Type_Void, "setzcomp", "setzcomp", "Pf" ),
266
CqFuncDef( Type_Void, "setxcomp", "setxcomp", "Nf" ),
267
CqFuncDef( Type_Void, "setycomp", "setycomp", "Nf" ),
268
CqFuncDef( Type_Void, "setzcomp", "setzcomp", "Nf" ),
269
CqFuncDef( Type_Void, "setxcomp", "setxcomp", "Vf" ),
270
CqFuncDef( Type_Void, "setycomp", "setycomp", "Vf" ),
271
CqFuncDef( Type_Void, "setzcomp", "setzcomp", "Vf" ),
273
CqFuncDef( Type_Float, "ptlined", "ptlined", "ppp" ),
274
CqFuncDef( Type_Float, "inversesqrt", "inversesqrt", "f" ),
275
CqFuncDef( Type_String, "concat", "concat", "ss*" ),
276
CqFuncDef( Type_String, "format", "format", "s*" ),
277
CqFuncDef( Type_Float, "match", "match", "ss" ),
278
CqFuncDef( Type_Point, "rotate", "rotate", "pfpp" ),
279
CqFuncDef( Type_Float, "filterstep", "filterstep2", "fff*"),
280
CqFuncDef( Type_Float, "filterstep", "filterstep", "ff*", ( 1 << EnvVars_du ) | ( 1 << EnvVars_u ) | ( 1 << EnvVars_dv ) | ( 1 << EnvVars_v ) ),
281
CqFuncDef( Type_Color, "specularbrdf", "specularbrdf", "vnvf" ),
283
CqFuncDef( Type_Float, "pnoise", "fpnoise1", "ff" ),
284
CqFuncDef( Type_Float, "pnoise", "fpnoise2", "ffff" ),
285
CqFuncDef( Type_Float, "pnoise", "fpnoise3", "pp" ),
286
CqFuncDef( Type_Float, "pnoise", "fpnoise4", "pfpf" ),
287
CqFuncDef( Type_Color, "pnoise", "cpnoise1", "ff" ),
288
CqFuncDef( Type_Color, "pnoise", "cpnoise2", "ffff" ),
289
CqFuncDef( Type_Color, "pnoise", "cpnoise3", "pp" ),
290
CqFuncDef( Type_Color, "pnoise", "cpnoise4", "pfpf" ),
291
CqFuncDef( Type_Point, "pnoise", "ppnoise1", "ff" ),
292
CqFuncDef( Type_Point, "pnoise", "ppnoise2", "ffff" ),
293
CqFuncDef( Type_Point, "pnoise", "ppnoise3", "pp" ),
294
CqFuncDef( Type_Point, "pnoise", "ppnoise4", "pfpf" ),
295
CqFuncDef( Type_Vector, "pnoise", "ppnoise1", "ff" ),
296
CqFuncDef( Type_Vector, "pnoise", "ppnoise2", "ffff" ),
297
CqFuncDef( Type_Vector, "pnoise", "ppnoise3", "pp" ),
298
CqFuncDef( Type_Vector, "pnoise", "ppnoise4", "pfpf" ),
300
CqFuncDef( Type_Matrix, "mtransform", "mtransform2", "ssm" ),
301
CqFuncDef( Type_Matrix, "mtransform", "mtransform", "sm" ),
302
CqFuncDef( Type_Float, "comp", "mcomp", "mff" ),
303
CqFuncDef( Type_Void, "setcomp", "setmcomp", "mfff" ),
304
CqFuncDef( Type_Float, "determinant", "determinant", "m" ),
305
CqFuncDef( Type_Matrix, "translate", "mtranslate", "mv" ),
306
CqFuncDef( Type_Matrix, "rotate", "mrotate", "mfv" ),
307
CqFuncDef( Type_Matrix, "scale", "mscale", "mp" ),
309
CqFuncDef( Type_Float, "spline", "fsplinea", "f[f]" ),
310
CqFuncDef( Type_Color, "spline", "csplinea", "f[c]" ),
311
CqFuncDef( Type_Point, "spline", "psplinea", "f[p]" ),
312
CqFuncDef( Type_Point, "spline", "vsplinea", "f[v]" ),
313
CqFuncDef( Type_Float, "spline", "sfsplinea", "sf[f]" ),
314
CqFuncDef( Type_Color, "spline", "scsplinea", "sf[c]" ),
315
CqFuncDef( Type_Point, "spline", "spsplinea", "sf[p]" ),
316
CqFuncDef( Type_Point, "spline", "svsplinea", "sf[v]" ),
318
CqFuncDef( Type_String, "shadername", "shadername2", "s" ),
319
CqFuncDef( Type_String, "shadername", "shadername", "" ),
320
CqFuncDef( Type_Void, "bake", "bake_f", "sfff" ),
321
CqFuncDef( Type_Void, "bake", "bake_3c", "sffc" ),
322
CqFuncDef( Type_Void, "bake", "bake_3p", "sffp" ),
323
CqFuncDef( Type_Void, "bake", "bake_3v", "sffv" ),
324
CqFuncDef( Type_Void, "bake", "bake_3n", "sffn" ),
326
CqFuncDef( Type_Float, "occlusion", "occlusion", "sfpnf*" ),
329
TqUint gcStandardFuncs = sizeof( gStandardFuncs ) / sizeof( gStandardFuncs[ 0 ] );
333
std::vector<CqFuncDef> gLocalFuncs;
336
///---------------------------------------------------------------------
340
CqFuncDef::CqFuncDef( TqInt Type, const char* strName, const char* strVMName, const char* strParams, CqParseNode* pDef, CqParseNode* pArgs ) :
342
m_strName( strName ),
343
m_strVMName( strVMName ),
344
m_strParamTypes( strParams ),
348
m_fVarying( TqFalse )
350
// Build the type array.
358
///---------------------------------------------------------------------
359
/** Find a function definition by searchin the standard and user definitions lists.
362
TqBool CqFuncDef::FindFunction( const char* strName, std::vector<SqFuncRef>& Refs )
365
// Clear any existing indexes.
368
// Search the standard definitions first.
370
for ( i = 0; i < gcStandardFuncs; i++ )
372
if ( gStandardFuncs[ i ].m_strName == strName )
374
ref.m_Type = FuncTypeStandard;
376
Refs.push_back( ref );
380
// Search the local definitions next.
381
for ( i = 0; i < gLocalFuncs.size(); i++ )
383
if ( gLocalFuncs[ i ].m_strName == strName )
385
ref.m_Type = FuncTypeLocal;
387
Refs.push_back( ref );
397
///---------------------------------------------------------------------
398
/** Add a new local function.
401
TqInt CqFuncDef::AddFunction( CqFuncDef& Def )
403
gLocalFuncs.push_back( Def );
404
return ( gLocalFuncs.size() - 1 );
408
///---------------------------------------------------------------------
409
/** Fill in an array of types from a typespec string.
412
int CqFuncDef::TypeArray()
414
// Go through the type string parsing the types.
415
unsigned int j = 0, cvars = 0;
417
while ( j < m_strParamTypes.size() )
419
TqInt type = Type_Nil;
420
int ctype = m_strParamTypes[ j++ ];
421
switch ( tolower( ctype ) )
426
type = ( ( type & ( ~Type_Mask ) ) | Type_Float );
429
type = ( ( type & ( ~Type_Mask ) ) | Type_Integer );
432
type = ( ( type & ( ~Type_Mask ) ) | Type_Point );
435
type = ( ( type & ( ~Type_Mask ) ) | Type_String );
438
type = ( ( type & ( ~Type_Mask ) ) | Type_Color );
441
type = ( ( type & ( ~Type_Mask ) ) | Type_Triple );
444
type = ( ( type & ( ~Type_Mask ) ) | Type_hPoint );
447
type = ( ( type & ( ~Type_Mask ) ) | Type_Normal );
450
type = ( ( type & ( ~Type_Mask ) ) | Type_Vector );
453
type = ( ( type & ( ~Type_Mask ) ) | Type_Void );
456
type = ( ( type & ( ~Type_Mask ) ) | Type_Matrix );
459
type = ( ( type & ( ~Type_Mask ) ) | Type_HexTuple );
462
type = ( type | Type_Array );
470
if ( isupper( ctype ) )
471
type = ( type | Type_Variable );
473
if ( ( type & Type_Mask ) != Type_Nil )
475
m_aTypeSpec.push_back( type );
483
const IqParseNode* CqFuncDef::pArgs() const
489
const IqParseNode* CqFuncDef::pDef() const
494
IqParseNode* CqFuncDef::pDef()
500
///---------------------------------------------------------------------
501
/** Return a temporary pointer to a function definition..
504
CqFuncDef* CqFuncDef::GetFunctionPtr( const SqFuncRef& Ref )
506
if ( Ref.m_Type == FuncTypeStandard && Ref.m_Index < gcStandardFuncs )
507
return ( &gStandardFuncs[ Ref.m_Index ] );
509
if ( Ref.m_Type == FuncTypeLocal && Ref.m_Index < gLocalFuncs.size() )
510
return ( &gLocalFuncs[ Ref.m_Index ] );
516
///---------------------------------------------------------------------
517
/// IqFuncDef::GetFunctionPtr
518
/// Return a temporary pointer to a function definition..
520
IqFuncDef* IqFuncDef::GetFunctionPtr( const SqFuncRef& Ref )
522
return ( CqFuncDef::GetFunctionPtr( Ref ) );
526
END_NAMESPACE( Aqsis )
527
//---------------------------------------------------------------------