Max 5 API Reference
00001 /* 00002 * jit.distance.superquadratic.c 00003 * 00004 * Copyright 2001-2005 - Cycling '74 00005 * Derek Gerstmann - derek@cycling74.com 00006 * 00007 * Functor for calculating Superquadratic distance 00008 * 00009 */ 00010 00011 // -------------------------------------------------------------------------- 00012 00013 #include "jit.common.h" 00014 #include "jit.functor.h" 00015 00016 // -------------------------------------------------------------------------- 00017 00018 typedef struct _jit_functor_distance_superquadratic 00019 { 00020 t_jit_object ob; 00021 double coefficients[JIT_MATRIX_MAX_DIMCOUNT]; 00022 00023 } t_jit_functor_distance_superquadratic; 00024 00025 // -------------------------------------------------------------------------- 00026 00027 t_jit_object *jit_functor_distance_superquadratic_new(void); 00028 t_jit_err jit_functor_distance_superquadratic_free(t_jit_functor_distance_superquadratic *x); 00029 t_jit_err jit_functor_distance_superquadratic_coefficients(t_jit_functor_distance_superquadratic *x, void *attr, long argc, t_atom *argv); 00030 t_jit_err jit_functor_distance_superquadratic_recalc(t_jit_functor_distance_superquadratic *x); 00031 00032 long jit_functor_distance_superquadratic_eval_fixed(t_jit_functor_distance_superquadratic *x, long dimcount, long *vals); 00033 float jit_functor_distance_superquadratic_eval_float32(t_jit_functor_distance_superquadratic *x, long dimcount, float *vals); 00034 double jit_functor_distance_superquadratic_eval_float64(t_jit_functor_distance_superquadratic *x, long dimcount, double *vals); 00035 00036 void jit_functor_distance_superquadratic_fixlut_init(void); 00037 00038 t_class *_jit_functor_distance_superquadratic_class; 00039 00040 // -------------------------------------------------------------------------- 00041 00042 t_jit_err jit_functor_distance_superquadratic_init(void) 00043 { 00044 t_jit_object *attr; 00045 00046 _jit_functor_distance_superquadratic_class = jit_class_new("jit_functor_distance_superquadratic",(method)jit_functor_distance_superquadratic_new,(method)jit_functor_distance_superquadratic_free, 00047 sizeof(t_jit_functor_distance_superquadratic),0L); 00048 00049 // add attribute methods 00050 attr = jit_object_new(_jit_sym_jit_attr_offset_array,"coefficients",_jit_sym_float64,JIT_MATRIX_MAX_DIMCOUNT,0, 00051 (method)0L,(method)jit_functor_distance_superquadratic_coefficients,calcoffset(t_jit_functor_distance_superquadratic,coefficients),calcoffset(t_jit_functor_distance_superquadratic,coefficients)); 00052 jit_class_addattr(_jit_functor_distance_superquadratic_class,attr); 00053 00054 // add evaluation methods 00055 jit_class_addmethod(_jit_functor_distance_superquadratic_class, (method)jit_functor_distance_superquadratic_eval_fixed, "evalfixed", A_CANT, 0L); 00056 jit_class_addmethod(_jit_functor_distance_superquadratic_class, (method)jit_functor_distance_superquadratic_eval_float32, "evalfloat32", A_CANT, 0L); 00057 jit_class_addmethod(_jit_functor_distance_superquadratic_class, (method)jit_functor_distance_superquadratic_eval_float64, "evalfloat64", A_CANT, 0L); 00058 00059 // important to add last for subclassing methods 00060 jit_functor_setup_class(_jit_functor_distance_superquadratic_class,"distance","superquadratic"); 00061 jit_class_register(_jit_functor_distance_superquadratic_class); 00062 00063 return JIT_ERR_NONE; 00064 } 00065 00066 // -------------------------------------------------------------------------- 00067 00068 t_jit_object *jit_functor_distance_superquadratic_new(void) 00069 { 00070 long i; 00071 t_jit_functor_distance_superquadratic *x; 00072 00073 if (x = (t_jit_functor_distance_superquadratic *)jit_object_alloc(_jit_functor_distance_superquadratic_class)) { 00074 00075 // initialization 00076 for(i = 0; i < JIT_MATRIX_MAX_DIMCOUNT; i++) 00077 x->coefficients[i] = 1.0; 00078 00079 jit_functor_distance_superquadratic_recalc(x); 00080 } 00081 00082 return (t_jit_object *)x; 00083 } 00084 00085 t_jit_err jit_functor_distance_superquadratic_free(t_jit_functor_distance_superquadratic *x) 00086 { 00087 return JIT_ERR_NONE; 00088 } 00089 00090 // -------------------------------------------------------------------------- 00091 00092 t_jit_err jit_functor_distance_superquadratic_coefficients(t_jit_functor_distance_superquadratic *x, void *attr, long argc, t_atom *argv) 00093 { 00094 long i; 00095 double v; 00096 char changed = FALSE; // changed 00097 00098 if (x) { 00099 for(i = 0; i < argc && i < JIT_MATRIX_MAX_DIMCOUNT; i++) 00100 { 00101 v = jit_atom_getfloat(argv+i); 00102 if(x->coefficients[i] != v) { 00103 x->coefficients[i] = v; 00104 changed = TRUE; 00105 } 00106 } 00107 if(changed) 00108 jit_functor_distance_superquadratic_recalc(x); 00109 return JIT_ERR_NONE; 00110 } 00111 return JIT_ERR_INVALID_PTR; 00112 } 00113 00114 t_jit_err jit_functor_distance_superquadratic_recalc(t_jit_functor_distance_superquadratic *x) 00115 { 00116 // calculate intermediary values for efficiency 00117 return JIT_ERR_NONE; 00118 } 00119 00120 // -------------------------------------------------------------------------- 00121 00122 long jit_functor_distance_superquadratic_eval_fixed( 00123 t_jit_functor_distance_superquadratic *x, long dimcount, long *vals) 00124 { 00125 return jit_functor_eval_fixed_with_float64((t_jit_object *)x,dimcount,vals, 00126 (t_jit_functor_float64_sig)jit_functor_distance_superquadratic_eval_float64); 00127 } 00128 00129 float jit_functor_distance_superquadratic_eval_float32( 00130 t_jit_functor_distance_superquadratic *x, long dimcount, float *vals) 00131 { 00132 return jit_functor_eval_float32_with_float64((t_jit_object *)x,dimcount,vals, 00133 (t_jit_functor_float64_sig)jit_functor_distance_superquadratic_eval_float64); 00134 } 00135 00136 double jit_functor_distance_superquadratic_eval_float64( 00137 t_jit_functor_distance_superquadratic *x, long dimcount, double *vals) 00138 { 00139 long i; 00140 double rval = 0; 00141 00142 for (i=0;i<dimcount;i++) { 00143 rval += jit_math_pow((vals[i] > 0 ? vals[i] : -vals[i]), x->coefficients[i]); 00144 } 00145 00146 return rval; 00147 } 00148 00149 // --------------------------------------------------------------------------
Copyright © 2008, Cycling '74