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