Max 5 API Reference
00001 /* 00002 * jit.transfer.cubic.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * Functor for a third order (cubic) 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_cubic 00019 { 00020 t_jit_object ob; 00021 00022 /* a + b * val + c * val^2 + d * val^3 */ 00023 00024 float float32[4]; // a, b, c, d 00025 double float64[4]; // a, b, c, d 00026 00027 } t_jit_functor_transfer_cubic; 00028 00029 // -------------------------------------------------------------------------- 00030 00031 t_jit_object *jit_functor_transfer_cubic_new(void); 00032 t_jit_err jit_functor_transfer_cubic_free(t_jit_functor_transfer_cubic *x); 00033 t_jit_err jit_functor_transfer_cubic_a(t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv); 00034 t_jit_err jit_functor_transfer_cubic_b(t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv); 00035 t_jit_err jit_functor_transfer_cubic_c(t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv); 00036 t_jit_err jit_functor_transfer_cubic_d(t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv); 00037 t_jit_err jit_functor_transfer_cubic_recalc(t_jit_functor_transfer_cubic *x); 00038 00039 long jit_functor_transfer_cubic_eval_fixed(t_jit_functor_transfer_cubic *x, long dimcount, long *vals); 00040 float jit_functor_transfer_cubic_eval_float32(t_jit_functor_transfer_cubic *x, long dimcount, float *vals); 00041 double jit_functor_transfer_cubic_eval_float64(t_jit_functor_transfer_cubic *x, long dimcount, double *vals); 00042 00043 long jit_functor_transfer_cubic_eval_fixed_scalar(t_jit_functor_transfer_cubic *x, long val); 00044 float jit_functor_transfer_cubic_eval_float32_scalar(t_jit_functor_transfer_cubic *x, float val); 00045 double jit_functor_transfer_cubic_eval_float64_scalar(t_jit_functor_transfer_cubic *x, double val); 00046 00047 t_class * _jit_functor_transfer_cubic_class; 00048 00049 // -------------------------------------------------------------------------- 00050 00051 t_jit_err jit_functor_transfer_cubic_init(void) 00052 { 00053 t_jit_object *attr; 00054 00055 // create transfer class 00056 _jit_functor_transfer_cubic_class = jit_class_new("jit_functor_transfer_cubic", 00057 (method)jit_functor_transfer_cubic_new,(method)jit_functor_transfer_cubic_free, 00058 sizeof(t_jit_functor_transfer_cubic),0L); 00059 00060 // add attribute methods 00061 attr = jit_object_new(_jit_sym_jit_attr_offset,"a",_jit_sym_float64,0, 00062 (method)0L,(method)jit_functor_transfer_cubic_a, 0); 00063 jit_class_addattr(_jit_functor_transfer_cubic_class,attr); 00064 attr = jit_object_new(_jit_sym_jit_attr_offset,"b",_jit_sym_float64,0, 00065 (method)0L,(method)jit_functor_transfer_cubic_b, 0); 00066 jit_class_addattr(_jit_functor_transfer_cubic_class,attr); 00067 attr = jit_object_new(_jit_sym_jit_attr_offset,"c",_jit_sym_float64,0, 00068 (method)0L,(method)jit_functor_transfer_cubic_c, 0); 00069 jit_class_addattr(_jit_functor_transfer_cubic_class,attr); 00070 attr = jit_object_new(_jit_sym_jit_attr_offset,"d",_jit_sym_float64,0, 00071 (method)0L,(method)jit_functor_transfer_cubic_d, 0); 00072 jit_class_addattr(_jit_functor_transfer_cubic_class,attr); 00073 00074 // add evaluation methods 00075 jit_class_addmethod(_jit_functor_transfer_cubic_class, 00076 (method)jit_functor_transfer_cubic_eval_fixed, "evalfixed", A_CANT, 0L); 00077 jit_class_addmethod(_jit_functor_transfer_cubic_class, 00078 (method)jit_functor_transfer_cubic_eval_float32, "evalfloat32", A_CANT, 0L); 00079 jit_class_addmethod(_jit_functor_transfer_cubic_class, 00080 (method)jit_functor_transfer_cubic_eval_float64, "evalfloat64", A_CANT, 0L); 00081 00082 // add to functor and class registry 00083 jit_functor_setup_class(_jit_functor_transfer_cubic_class,"transfer","cubic"); 00084 jit_class_register(_jit_functor_transfer_cubic_class); 00085 00086 return JIT_ERR_NONE; 00087 } 00088 00089 t_jit_object *jit_functor_transfer_cubic_new(void) 00090 { 00091 t_jit_functor_transfer_cubic *x; 00092 00093 if (x = (t_jit_functor_transfer_cubic *)jit_object_alloc(_jit_functor_transfer_cubic_class)) { 00094 00095 // initialization 00096 00097 // default to Ken Perlin's original noise smoothing polynomial: 3t^2 - 2t^3 00098 x->float64[0] = x->float32[0] = 0.0f; 00099 x->float64[1] = x->float32[1] = 0.0f; 00100 x->float64[2] = x->float32[2] = 3.0f; 00101 x->float64[3] = x->float32[3] = -2.0f; 00102 jit_functor_transfer_cubic_recalc(x); 00103 } 00104 00105 return (t_jit_object *)x; 00106 } 00107 00108 t_jit_err jit_functor_transfer_cubic_free(t_jit_functor_transfer_cubic *x) 00109 { 00110 return JIT_ERR_NONE; 00111 } 00112 00113 // -------------------------------------------------------------------------- 00114 00115 t_jit_err jit_functor_transfer_cubic_a( 00116 t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv) 00117 { 00118 float v; 00119 00120 if (x) { 00121 v = jit_atom_getfloat(argv); 00122 if (x->float32[0] != v) { 00123 x->float64[0] = x->float32[0] = v; 00124 jit_functor_transfer_cubic_recalc(x); 00125 } 00126 return JIT_ERR_NONE; 00127 } 00128 return JIT_ERR_INVALID_PTR; 00129 } 00130 00131 t_jit_err jit_functor_transfer_cubic_b( 00132 t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv) 00133 { 00134 float v; 00135 00136 if (x) { 00137 v = jit_atom_getfloat(argv); 00138 if (x->float32[1] != v) { 00139 x->float64[1] = x->float32[1] = v; 00140 jit_functor_transfer_cubic_recalc(x); 00141 } 00142 return JIT_ERR_NONE; 00143 } 00144 return JIT_ERR_INVALID_PTR; 00145 } 00146 00147 t_jit_err jit_functor_transfer_cubic_c( 00148 t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv) 00149 { 00150 float v; 00151 00152 if (x) { 00153 v = jit_atom_getfloat(argv); 00154 if (x->float32[2] != v) { 00155 x->float64[2] = x->float32[2] = v; 00156 jit_functor_transfer_cubic_recalc(x); 00157 } 00158 return JIT_ERR_NONE; 00159 } 00160 return JIT_ERR_INVALID_PTR; 00161 } 00162 00163 t_jit_err jit_functor_transfer_cubic_d( 00164 t_jit_functor_transfer_cubic *x, void *attr, long argc, t_atom *argv) 00165 { 00166 float v; 00167 00168 if (x) { 00169 v = jit_atom_getfloat(argv); 00170 if (x->float32[3] != v) { 00171 x->float64[3] = x->float32[3] = v; 00172 jit_functor_transfer_cubic_recalc(x); 00173 } 00174 return JIT_ERR_NONE; 00175 } 00176 return JIT_ERR_INVALID_PTR; 00177 } 00178 00179 t_jit_err jit_functor_transfer_cubic_recalc(t_jit_functor_transfer_cubic *x) 00180 { 00181 // calculate intermediary values for efficiency 00182 return JIT_ERR_NONE; 00183 } 00184 00185 // ----------------------------------------------------------------------------- 00186 // vector evaluation functions 00187 // ----------------------------------------------------------------------------- 00188 long jit_functor_transfer_cubic_eval_fixed( 00189 t_jit_functor_transfer_cubic *x, long dimcount, long *vals) 00190 { 00191 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00192 (t_jit_functor_float64_sig)jit_functor_transfer_cubic_eval_float64); 00193 } 00194 00195 float jit_functor_transfer_cubic_eval_float32( 00196 t_jit_functor_transfer_cubic *x, long dimcount, float *vals) 00197 { 00198 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x,dimcount,vals, 00199 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_cubic_eval_float32_scalar); 00200 } 00201 00202 double jit_functor_transfer_cubic_eval_float64( 00203 t_jit_functor_transfer_cubic *x, long dimcount, double *vals) 00204 { 00205 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x,dimcount,vals, 00206 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_cubic_eval_float64_scalar); 00207 } 00208 00209 // -------------------------------------------------------------------------- 00210 // scalar evaluation functions 00211 // -------------------------------------------------------------------------- 00212 long jit_functor_transfer_cubic_eval_fixed_scalar( 00213 t_jit_functor_transfer_cubic *x, long val) 00214 { 00215 return FloatToFixed(jit_functor_transfer_cubic_eval_float32_scalar(x,FixedToFloat(val))); 00216 } 00217 00218 float jit_functor_transfer_cubic_eval_float32_scalar( 00219 t_jit_functor_transfer_cubic *x, float val) 00220 { 00221 /* a + b * val + c * val^2 + d * val^3 */ 00222 return ((( x->float32[3] * val ) + x->float32[2]) * val + x->float32[1]) * val + x->float32[0]; 00223 } 00224 00225 double jit_functor_transfer_cubic_eval_float64_scalar( 00226 t_jit_functor_transfer_cubic *x, double val) 00227 { 00228 /* a + b * val + c * val^2 + d * val^3 */ 00229 return ((( x->float64[3] * val ) + x->float64[2]) * val + x->float64[1]) * val + x->float64[0]; 00230 } 00231 // --------------------------------------------------------------------------
Copyright © 2008, Cycling '74