aboutsummaryrefslogtreecommitdiff
path: root/pmpd3d.c
diff options
context:
space:
mode:
authorN.N. <nimon@users.sourceforge.net>2012-08-09 12:47:33 +0000
committerN.N. <nimon@users.sourceforge.net>2012-08-09 12:47:33 +0000
commit0264220d542fff8b4f1fae9cad9f8b6d595ebf6b (patch)
treefff28d1c10a4fb7a7a0a9cb247077eac0399264e /pmpd3d.c
parent68b32efaa58ce0e24bda9eff2d925844407a9012 (diff)
updated closestMass function with Id
svn path=/trunk/externals/pmpd/; revision=16164
Diffstat (limited to 'pmpd3d.c')
-rw-r--r--pmpd3d.c49
1 files changed, 38 insertions, 11 deletions
diff --git a/pmpd3d.c b/pmpd3d.c
index 6349373..8a916c0 100644
--- a/pmpd3d.c
+++ b/pmpd3d.c
@@ -4395,25 +4395,52 @@ void pmpd3d_grabMass(t_pmpd3d *x, t_float posX, t_float posY, t_float posZ, t_fl
}
}
-void pmpd3d_closestMass(t_pmpd3d *x, t_float posX, t_float posY, t_float posZ)
+void pmpd3d_closestMass(t_pmpd3d *x, t_symbol *s, int argc, t_atom *argv)
{
t_float dist, tmp;
t_int i;
t_atom std_out[4];
-
- if ((x->nb_mass > 0))
- {
- dist = sqr(x->mass[0].posX - posX) + sqr(x->mass[0].posY - posY) + sqr(x->mass[0].posZ - posZ);
- for (i=1; i<x->nb_mass; i++)
+
+ t_float posX, posY, posZ;
+ posX = atom_getfloatarg(0, argc, argv);
+ posY = atom_getfloatarg(1, argc, argv);
+ posZ = atom_getfloatarg(2, argc, argv);
+ if ( (argc == 4) && (argv[3].a_type == A_SYMBOL) )
+ {
+ //t_symbol *mass_name = atom_getsymbolarg(2, argc, argv);
+ if ((x->nb_mass > 0))
{
- tmp = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY) + sqr(x->mass[i].posZ - posZ);
- if (tmp < dist)
+ dist = 1000000000;//sqr(x->mass[0].posX - posX) + sqr(x->mass[0].posY - posY);
+ for (i=0; i<x->nb_mass; i++)
{
- dist = tmp;
- x->grab_nb= i;
+ if (atom_getsymbolarg(3,argc,argv) == x->mass[i].Id)
+ {
+ tmp = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY) + sqr(x->mass[i].posZ - posZ);
+ if (tmp < dist)
+ {
+ dist = tmp;
+ x->grab_nb= i;
+ }
+ }
}
}
}
+ else {
+ if ((x->nb_mass > 0))
+ {
+ dist = sqr(x->mass[0].posX - posX) + sqr(x->mass[0].posY - posY) + sqr(x->mass[0].posZ - posZ);
+ for (i=1; i<x->nb_mass; i++)
+ {
+ tmp = sqr(x->mass[i].posX - posX) + sqr(x->mass[i].posY - posY) + sqr(x->mass[i].posZ - posZ);
+ if (tmp < dist)
+ {
+ dist = tmp;
+ x->grab_nb= i;
+ }
+ }
+ }
+ }
+
SETFLOAT(&(std_out[0]),x->grab_nb);
SETFLOAT(&(std_out[1]), x->mass[x->grab_nb].posX);
SETFLOAT(&(std_out[2]), x->mass[x->grab_nb].posY);
@@ -4589,7 +4616,7 @@ void pmpd3d_setup(void)
*/
class_addmethod(pmpd3d_class, (t_method)pmpd3d_grabMass, gensym("grabMass"), A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
- class_addmethod(pmpd3d_class, (t_method)pmpd3d_closestMass, gensym("closestMass"), A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
+ class_addmethod(pmpd3d_class, (t_method)pmpd3d_closestMass, gensym("closestMass"), A_GIMME, 0);
}