Max 5 API Reference
00001 /* 00002 * jit.transfer.quintic.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * Functor for a 5th order (quintic) polynomial transfer function 00008 * 00009 */ 00010 00011 // ----------------------------------------------------------------------------- 00012 00013 #include "jit.common.h" 00014 #include "jit.functor.h" 00015 00016 // ----------------------------------------------------------------------------- 00017 00018 typedef struct _jit_functor_transfer_quintic 00019 { 00020 t_jit_object ob; 00021 00022 /* a + b * val + c * val^2 + d * val^3 + e * val^4 + f * val^5 */ 00023 00024 float float32[6]; // a, b, c, d, e, f 00025 double float64[6]; // a, b, c, d, e, f 00026 00027 } t_jit_functor_transfer_quintic; 00028 00029 // ----------------------------------------------------------------------------- 00030 00031 t_jit_object *jit_functor_transfer_quintic_new(void); 00032 t_jit_err jit_functor_transfer_quintic_free(t_jit_functor_transfer_quintic *x); 00033 t_jit_err jit_functor_transfer_quintic_a(t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv); 00034 t_jit_err jit_functor_transfer_quintic_b(t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv); 00035 t_jit_err jit_functor_transfer_quintic_c(t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv); 00036 t_jit_err jit_functor_transfer_quintic_d(t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv); 00037 t_jit_err jit_functor_transfer_quintic_e(t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv); 00038 t_jit_err jit_functor_transfer_quintic_f(t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv); 00039 t_jit_err jit_functor_transfer_quintic_recalc(t_jit_functor_transfer_quintic *x); 00040 00041 long jit_functor_transfer_quintic_eval_fixed(t_jit_functor_transfer_quintic *x, long dimcount, long *vals); 00042 float jit_functor_transfer_quintic_eval_float32(t_jit_functor_transfer_quintic *x, long dimcount, float *vals); 00043 double jit_functor_transfer_quintic_eval_float64(t_jit_functor_transfer_quintic *x, long dimcount, double *vals); 00044 long jit_functor_transfer_quintic_eval_fixed_scalar(t_jit_functor_transfer_quintic *x, long val); 00045 float jit_functor_transfer_quintic_eval_float32_scalar(t_jit_functor_transfer_quintic *x, float val); 00046 double jit_functor_transfer_quintic_eval_float64_scalar(t_jit_functor_transfer_quintic *x, double val); 00047 00048 t_class * _jit_functor_transfer_quintic_class; 00049 00050 // ----------------------------------------------------------------------------- 00051 00052 t_jit_err jit_functor_transfer_quintic_init(void) 00053 { 00054 t_jit_object *attr; 00055 00056 // create functor class 00057 _jit_functor_transfer_quintic_class = jit_class_new("jit_functor_transfer_quintic", 00058 (method)jit_functor_transfer_quintic_new,(method)jit_functor_transfer_quintic_free, 00059 sizeof(t_jit_functor_transfer_quintic),0L); 00060 00061 // add attribute methods 00062 attr = jit_object_new(_jit_sym_jit_attr_offset,"a",_jit_sym_float64,0, 00063 (method)0L,(method)jit_functor_transfer_quintic_a, 0); 00064 jit_class_addattr(_jit_functor_transfer_quintic_class,attr); 00065 attr = jit_object_new(_jit_sym_jit_attr_offset,"b",_jit_sym_float64,0, 00066 (method)0L,(method)jit_functor_transfer_quintic_b, 0); 00067 jit_class_addattr(_jit_functor_transfer_quintic_class,attr); 00068 attr = jit_object_new(_jit_sym_jit_attr_offset,"c",_jit_sym_float64,0, 00069 (method)0L,(method)jit_functor_transfer_quintic_c, 0); 00070 jit_class_addattr(_jit_functor_transfer_quintic_class,attr); 00071 attr = jit_object_new(_jit_sym_jit_attr_offset,"d",_jit_sym_float64,0, 00072 (method)0L,(method)jit_functor_transfer_quintic_d, 0); 00073 jit_class_addattr(_jit_functor_transfer_quintic_class,attr); 00074 attr = jit_object_new(_jit_sym_jit_attr_offset,"e",_jit_sym_float64,0, 00075 (method)0L,(method)jit_functor_transfer_quintic_e, 0); 00076 jit_class_addattr(_jit_functor_transfer_quintic_class,attr); 00077 attr = jit_object_new(_jit_sym_jit_attr_offset,"f",_jit_sym_float64,0, 00078 (method)0L,(method)jit_functor_transfer_quintic_f, 0); 00079 jit_class_addattr(_jit_functor_transfer_quintic_class,attr); 00080 00081 // add evaluation methods 00082 jit_class_addmethod(_jit_functor_transfer_quintic_class, 00083 (method)jit_functor_transfer_quintic_eval_fixed, "evalfixed", A_CANT, 0L); 00084 jit_class_addmethod(_jit_functor_transfer_quintic_class, 00085 (method)jit_functor_transfer_quintic_eval_float32, "evalfloat32", A_CANT, 0L); 00086 jit_class_addmethod(_jit_functor_transfer_quintic_class, 00087 (method)jit_functor_transfer_quintic_eval_float64, "evalfloat64", A_CANT, 0L); 00088 00089 // add to functor registry 00090 jit_functor_setup_class(_jit_functor_transfer_quintic_class,"transfer","quintic"); 00091 jit_class_register(_jit_functor_transfer_quintic_class); 00092 return JIT_ERR_NONE; 00093 } 00094 00095 t_jit_object *jit_functor_transfer_quintic_new(void) 00096 { 00097 t_jit_functor_transfer_quintic *x; 00098 00099 if (x = (t_jit_functor_transfer_quintic *)jit_object_alloc(_jit_functor_transfer_quintic_class)) { 00100 00101 // initialization 00102 00103 // default to Ken Perlin's improved noise smoothing polynomial: 6t^5 - 15t^4 + 10t^3 00104 x->float64[0] = x->float32[0] = 0.0f; 00105 x->float64[1] = x->float32[1] = 0.0f; 00106 x->float64[2] = x->float32[2] = 0.0f; 00107 x->float64[3] = x->float32[3] = 10.0f; 00108 x->float64[4] = x->float32[4] = -15.0f; 00109 x->float64[5] = x->float32[5] = 6.0f; 00110 jit_functor_transfer_quintic_recalc(x); 00111 } 00112 00113 return (t_jit_object *)x; 00114 } 00115 00116 t_jit_err jit_functor_transfer_quintic_free(t_jit_functor_transfer_quintic *x) 00117 { 00118 return JIT_ERR_NONE; 00119 } 00120 00121 // ----------------------------------------------------------------------------- 00122 00123 t_jit_err jit_functor_transfer_quintic_a( 00124 t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv) 00125 { 00126 float v; 00127 00128 if (x) { 00129 v = jit_atom_getfloat(argv); 00130 if (x->float32[0] != v) { 00131 x->float64[0] = x->float32[0] = v; 00132 jit_functor_transfer_quintic_recalc(x); 00133 } 00134 return JIT_ERR_NONE; 00135 } 00136 return JIT_ERR_INVALID_PTR; 00137 } 00138 00139 t_jit_err jit_functor_transfer_quintic_b( 00140 t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv) 00141 { 00142 float v; 00143 00144 if (x) { 00145 v = jit_atom_getfloat(argv); 00146 if (x->float32[1] != v) { 00147 x->float64[1] = x->float32[1] = v; 00148 jit_functor_transfer_quintic_recalc(x); 00149 } 00150 return JIT_ERR_NONE; 00151 } 00152 return JIT_ERR_INVALID_PTR; 00153 } 00154 00155 t_jit_err jit_functor_transfer_quintic_c( 00156 t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv) 00157 { 00158 float v; 00159 00160 if (x) { 00161 v = jit_atom_getfloat(argv); 00162 if (x->float32[2] != v) { 00163 x->float64[2] = x->float32[2] = v; 00164 jit_functor_transfer_quintic_recalc(x); 00165 } 00166 return JIT_ERR_NONE; 00167 } 00168 return JIT_ERR_INVALID_PTR; 00169 } 00170 00171 t_jit_err jit_functor_transfer_quintic_d( 00172 t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv) 00173 { 00174 float v; 00175 00176 if (x) { 00177 v = jit_atom_getfloat(argv); 00178 if (x->float32[3] != v) { 00179 x->float64[3] = x->float32[3] = v; 00180 jit_functor_transfer_quintic_recalc(x); 00181 } 00182 return JIT_ERR_NONE; 00183 } 00184 return JIT_ERR_INVALID_PTR; 00185 } 00186 00187 t_jit_err jit_functor_transfer_quintic_e( 00188 t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv) 00189 { 00190 float v; 00191 00192 if (x) { 00193 v = jit_atom_getfloat(argv); 00194 if (x->float32[4] != v) { 00195 x->float64[4] = x->float32[4] = v; 00196 jit_functor_transfer_quintic_recalc(x); 00197 } 00198 return JIT_ERR_NONE; 00199 } 00200 return JIT_ERR_INVALID_PTR; 00201 } 00202 00203 t_jit_err jit_functor_transfer_quintic_f( 00204 t_jit_functor_transfer_quintic *x, void *attr, long argc, t_atom *argv) 00205 { 00206 float v; 00207 00208 if (x) { 00209 v = jit_atom_getfloat(argv); 00210 if (x->float32[5] != v) { 00211 x->float64[5] = x->float32[5] = v; 00212 jit_functor_transfer_quintic_recalc(x); 00213 } 00214 return JIT_ERR_NONE; 00215 } 00216 return JIT_ERR_INVALID_PTR; 00217 } 00218 00219 t_jit_err jit_functor_transfer_quintic_recalc(t_jit_functor_transfer_quintic *x) 00220 { 00221 // calculate intermediary values for efficiency 00222 return JIT_ERR_NONE; 00223 } 00224 00225 // ----------------------------------------------------------------------------- 00226 // vector evaluation functions 00227 // ----------------------------------------------------------------------------- 00228 00229 long jit_functor_transfer_quintic_eval_fixed( 00230 t_jit_functor_transfer_quintic *x, long dimcount, long *vals) 00231 { 00232 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00233 (t_jit_functor_float64_sig)jit_functor_transfer_quintic_eval_float64); 00234 } 00235 00236 float jit_functor_transfer_quintic_eval_float32( 00237 t_jit_functor_transfer_quintic *x, long dimcount, float *vals) 00238 { 00239 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x,dimcount,vals, 00240 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_quintic_eval_float32_scalar); 00241 } 00242 00243 double jit_functor_transfer_quintic_eval_float64( 00244 t_jit_functor_transfer_quintic *x, long dimcount, double *vals) 00245 { 00246 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x,dimcount,vals, 00247 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_quintic_eval_float64_scalar); 00248 } 00249 00250 // ----------------------------------------------------------------------------- 00251 // scalar evaluation functions 00252 // ----------------------------------------------------------------------------- 00253 00254 long jit_functor_transfer_quintic_eval_fixed_scalar( 00255 t_jit_functor_transfer_quintic *x, long val) 00256 { 00257 return FloatToFixed(jit_functor_transfer_quintic_eval_float32_scalar(x,FixedToFloat(val))); 00258 } 00259 00260 float jit_functor_transfer_quintic_eval_float32_scalar( 00261 t_jit_functor_transfer_quintic *x, float val) 00262 { 00263 /* a + b * val + c * val^2 + d * val^3 + e * val^4 + f * val^5 */ 00264 return ((((( x->float32[5] * val ) + x->float32[4]) * val + x->float32[3]) * val + x->float32[2]) * val + x->float32[1]) * val + x->float32[0]; 00265 } 00266 00267 double jit_functor_transfer_quintic_eval_float64_scalar( 00268 t_jit_functor_transfer_quintic *x, double val) 00269 { 00270 /* a + b * val + c * val^2 + d * val^3 + e * val^4 + f * val^5 */ 00271 return ((((( x->float64[5] * val ) + x->float64[4]) * val + x->float64[3]) * val + x->float64[2]) * val + x->float64[1]) * val + x->float64[0]; 00272 } 00273 // -----------------------------------------------------------------------------
Copyright © 2008, Cycling '74