Max 5 API Reference
00001 /* 00002 * jit.transfer.gain.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * functor for perlin's "gain" 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_gain 00019 { 00020 t_jit_object ob; 00021 double beta; // 0.5 is no change, smaller values bias towards 0, larger towards 1. 00022 double invbeta; 00023 } t_jit_functor_transfer_gain; 00024 00025 // -------------------------------------------------------------------------- 00026 00027 t_jit_object *jit_functor_transfer_gain_new(void); 00028 t_jit_err jit_functor_transfer_gain_free(t_jit_functor_transfer_gain *x); 00029 t_jit_err jit_functor_transfer_gain_setattr_beta(t_jit_functor_transfer_gain *x, void *attr, long argc, t_atom *argv); 00030 t_jit_err jit_functor_transfer_gain_recalc(t_jit_functor_transfer_gain *x); 00031 00032 long jit_functor_transfer_gain_eval_fixed(t_jit_functor_transfer_gain *x, long dimcount, long *vals); 00033 float jit_functor_transfer_gain_eval_float32(t_jit_functor_transfer_gain *x, long dimcount, float *vals); 00034 double jit_functor_transfer_gain_eval_float64(t_jit_functor_transfer_gain *x, long dimcount, double *vals); 00035 long jit_functor_transfer_gain_eval_fixed_scalar(t_jit_functor_transfer_gain *x, long val); 00036 float jit_functor_transfer_gain_eval_float32_scalar(t_jit_functor_transfer_gain *x, float val); 00037 double jit_functor_transfer_gain_eval_float64_scalar(t_jit_functor_transfer_gain *x, double val); 00038 00039 t_class * _jit_functor_transfer_gain_class; 00040 00041 // -------------------------------------------------------------------------- 00042 00043 t_jit_err jit_functor_transfer_gain_init(void) 00044 { 00045 t_jit_object *attr; 00046 00047 // create functor class 00048 _jit_functor_transfer_gain_class = jit_class_new("jit_functor_transfer_gain", 00049 (method)jit_functor_transfer_gain_new,(method)jit_functor_transfer_gain_free, 00050 sizeof(t_jit_functor_transfer_gain),0L); 00051 00052 // add attribute methods 00053 attr = jit_object_new(_jit_sym_jit_attr_offset,"beta",_jit_sym_float64,0, 00054 (method)0L,(method)jit_functor_transfer_gain_setattr_beta, 00055 calcoffset(t_jit_functor_transfer_gain,beta)); 00056 jit_class_addattr(_jit_functor_transfer_gain_class,attr); 00057 00058 // add evaluation methods 00059 jit_class_addmethod(_jit_functor_transfer_gain_class, 00060 (method)jit_functor_transfer_gain_eval_fixed, "evalfixed", A_CANT, 0L); 00061 jit_class_addmethod(_jit_functor_transfer_gain_class, 00062 (method)jit_functor_transfer_gain_eval_float32, "evalfloat32", A_CANT, 0L); 00063 jit_class_addmethod(_jit_functor_transfer_gain_class, 00064 (method)jit_functor_transfer_gain_eval_float64, "evalfloat64", A_CANT, 0L); 00065 00066 // important to add last for subclassing methods 00067 jit_functor_setup_class(_jit_functor_transfer_gain_class,"transfer","gain"); 00068 jit_class_register(_jit_functor_transfer_gain_class); 00069 00070 return JIT_ERR_NONE; 00071 } 00072 00073 t_jit_object *jit_functor_transfer_gain_new(void) 00074 { 00075 t_jit_functor_transfer_gain *x; 00076 00077 if (x = (t_jit_functor_transfer_gain *)jit_object_alloc(_jit_functor_transfer_gain_class)) { 00078 00079 // initialization 00080 x->beta = 0.5; 00081 jit_functor_transfer_gain_recalc(x); 00082 } 00083 00084 return (t_jit_object *)x; 00085 } 00086 00087 t_jit_err jit_functor_transfer_gain_free(t_jit_functor_transfer_gain *x) 00088 { 00089 return JIT_ERR_NONE; 00090 } 00091 00092 t_jit_err jit_functor_transfer_gain_setattr_beta( 00093 t_jit_functor_transfer_gain *x, void *attr, long argc, t_atom *argv) 00094 { 00095 double v; 00096 00097 if (x) { 00098 v = jit_atom_getfloat(argv); 00099 if (x->beta != v) { 00100 x->beta = v; 00101 jit_functor_transfer_gain_recalc(x); 00102 } 00103 return JIT_ERR_NONE; 00104 } 00105 return JIT_ERR_INVALID_PTR; 00106 } 00107 00108 t_jit_err jit_functor_transfer_gain_recalc(t_jit_functor_transfer_gain *x) 00109 { 00110 // calculate intermediary values for efficiency 00111 x->invbeta = ( 1.0 / x->beta - 2.0); 00112 return JIT_ERR_NONE; 00113 } 00114 00115 // -------------------------------------------------------------------------- 00116 // vector evaluation functions (calls scalar functions and generates a product of scalar evaluation for each dimension) 00117 // -------------------------------------------------------------------------- 00118 long jit_functor_transfer_gain_eval_fixed(t_jit_functor_transfer_gain *x, long dimcount, long *vals) 00119 { 00120 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00121 (t_jit_functor_float64_sig)jit_functor_transfer_gain_eval_float64); 00122 } 00123 00124 float jit_functor_transfer_gain_eval_float32(t_jit_functor_transfer_gain *x, long dimcount, float *vals) 00125 { 00126 return jit_functor_eval_float32_with_scalar_product((t_jit_object *)x,dimcount,vals, 00127 (t_jit_functor_float32_scalar_sig)jit_functor_transfer_gain_eval_float32_scalar); 00128 } 00129 00130 double jit_functor_transfer_gain_eval_float64(t_jit_functor_transfer_gain *x, long dimcount, double *vals) 00131 { 00132 return jit_functor_eval_float64_with_scalar_product((t_jit_object *)x,dimcount,vals, 00133 (t_jit_functor_float64_scalar_sig)jit_functor_transfer_gain_eval_float64_scalar); 00134 } 00135 00136 // -------------------------------------------------------------------------- 00137 // scalar evaluation functions 00138 // -------------------------------------------------------------------------- 00139 long jit_functor_transfer_gain_eval_fixed_scalar( 00140 t_jit_functor_transfer_gain *x, long val) 00141 { 00142 return FloatToFixed(jit_functor_transfer_gain_eval_float64_scalar(x,FixedToFloat(val))); 00143 } 00144 00145 float jit_functor_transfer_gain_eval_float32_scalar( 00146 t_jit_functor_transfer_gain *x, float val) 00147 { 00148 /* 00149 float a = val; 00150 float p = (float)jit_math_log(1.0f - x->beta) / (float)jit_math_log(0.5f); 00151 if (a < .001f) 00152 return 0.0f; 00153 else if (a > .999f) 00154 return 1.0f; 00155 if (a < 0.5f) 00156 return (float)jit_math_pow(2 * a, p) / 2; 00157 else 00158 return 1.0f - (float)jit_math_pow(2 * (1. - a), p) / 2; 00159 */ 00160 // fast approximate to above 00161 float a = val; 00162 float c = x->invbeta * (1.0f - 2.0f * a); 00163 if (a < 0.5f) 00164 return a / ( c + 1.0f ); 00165 else 00166 return (c - a) / (c - 1.0f ); 00167 } 00168 00169 double jit_functor_transfer_gain_eval_float64_scalar( 00170 t_jit_functor_transfer_gain *x, double val) 00171 { 00172 00173 /* 00174 double a = val; 00175 double p = jit_math_log(1.0 - x->beta) / jit_math_log(0.5); 00176 if (a < .001) 00177 return 0.0; 00178 else if (a > .999) 00179 return 1.0; 00180 if (a < 0.5) 00181 return jit_math_pow(2 * a, p) / 2; 00182 else 00183 return 1.0 - jit_math_pow(2 * (1. - a), p) / 2; 00184 */ 00185 // fast approximate to above 00186 float a = val; 00187 float c = x->invbeta * (1.0 - 2.0 * a); 00188 if (a < 0.5) 00189 return a / ( c + 1.0); 00190 else 00191 return (c - a) / (c - 1.0); 00192 } 00193 // --------------------------------------------------------------------------
Copyright © 2008, Cycling '74