aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Henry <nusmuk@users.sourceforge.net>2013-05-01 15:03:05 +0000
committerCyrille Henry <nusmuk@users.sourceforge.net>2013-05-01 15:03:05 +0000
commit563967c7bb1b1b4eb0c09b757c4b2595d3aab97c (patch)
treebe443fcebfebe666f6b08b681ae36637b233112b
parenta81fa35c46071ea95f49056eb159a0dc1fe3ed12 (diff)
pmpd code refactorisation
svn path=/trunk/externals/pmpd/; revision=17105
-rw-r--r--pmpd.c1841
-rw-r--r--pmpd.h55
-rw-r--r--pmpd_get.c288
-rw-r--r--pmpd_list.c0
-rw-r--r--pmpd_set.c315
-rw-r--r--pmpd_tab.c403
-rw-r--r--pmpd_various.c160
7 files changed, 1222 insertions, 1840 deletions
diff --git a/pmpd.c b/pmpd.c
index 59b43fc..9860d2c 100644
--- a/pmpd.c
+++ b/pmpd.c
@@ -30,1854 +30,15 @@
#include "stdio.h"
#include "math.h"
-#define nb_max_link 100000
-#define nb_max_mass 100000
-
-#define max(a,b) ( ((a) > (b)) ? (a) : (b) )
-#define min(a,b) ( ((a) < (b)) ? (a) : (b) )
-
-t_float sign_ch(t_float v)
-{
- return v > 0 ? 1 : -1;
-}
-
-t_float pow_ch(t_float x, t_float y)
-{
- return x > 0 ? pow(x,y) : -pow(-x,y);
-}
-
-t_float sqr(t_float x)
-{
- return x*x ;
-}
-
-static t_class *pmpd_class;
-
-typedef struct _mass {
- t_symbol *Id;
- int mobile;
- t_float invM;
- t_float speedX;
- t_float posX;
- t_float forceX;
- t_float D2;
- int num;
-} foo;
-
-typedef struct _link {
- t_symbol *Id;
- int lType;
- struct _mass *mass1;
- struct _mass *mass2;
- t_float K;
- t_float D;
- t_float L;
- t_float Pow;
- t_float Lmin;
- t_float Lmax;
- t_float distance;
- t_symbol *arrayK;
- t_symbol *arrayD;
- t_float K_L; // longeur du tabeau K
- t_float D_L; // longeur du tabeau D
-} foo1 ;
-
-typedef struct _pmpd {
- t_object x_obj;
- struct _link link[nb_max_link];
- struct _mass mass[nb_max_mass];
- t_outlet *main_outlet;
- t_outlet *info_outlet;
- int nb_link;
- int nb_mass;
- t_float minX, maxX;
- t_int grab; // si on grab une mass ou pas
- t_int grab_nb; // la masse grabé
-} t_pmpd;
-
-t_float tabread2(t_pmpd *x, t_float pos, t_symbol *array)
-{
- t_garray *a;
- int npoints;
- t_word *vec;
- t_float posx;
-
- if (!(a = (t_garray *)pd_findbyclass(array, garray_class)))
- pd_error(x, "%s: no such array", array->s_name);
- else if (!garray_getfloatwords(a, &npoints, &vec))
- pd_error(x, "%s: bad template for tabLink", array->s_name);
- else
- {
- posx = fabs(pos)*npoints;
- int n=posx;
- if (n >= npoints - 1)
- return (sign_ch(pos)*vec[npoints-1].w_float);
- float fract = posx-n;
- return (sign_ch(pos) * ( fract*vec[n+1].w_float+(1-fract)*vec[n].w_float));
- }
- return( pos); // si il y a un pb sur le tableau, on renvoie l'identité
-}
-
-void pmpd_reset(t_pmpd *x)
-{
- x->nb_link = 0;
- x->nb_mass = 0;
- x->minX = -1000000;
- x->maxX = 1000000;
- x->grab = 0;
-}
-
-void pmpd_infosL(t_pmpd *x)
-{
- int i;
- post("list of mass");
- post("number, Id, mobile, mass, Damping, position, speed, forces");
- for(i=0; i < x->nb_mass; i++)
- {
- post("masse %i: %s, %d, %f, %f, %f, %f, %f",i, x->mass[i].Id->s_name, x->mass[i].mobile, 1/x->mass[i].invM, x->mass[i].D2, x->mass[i].posX, x->mass[i].speedX, x->mass[i].forceX );
- }
-
- post("list of link");
- post("number, Id, mass1, mass2, K, D, Pow, L, Lmin, Lmax");
- for(i=0; i < x->nb_link; i++)
- {
- switch(x->link[i].lType)
- {
- case 0 :
- post("link %i: %s, %i, %i, %f, %f, %f, %f, %f, %f", i, x->link[i].Id->s_name, x->link[i].mass1->num, x->link[i].mass2->num, x->link[i].K, x->link[i].D, x->link[i].Pow, x->link[i].L, x->link[i].Lmin, x->link[i].Lmax);
- break;
- case 2 :
- post("tabLink %i: %s, %i, %i, %f, %f, %s, %f, %s, %f", i, x->link[i].Id->s_name, x->link[i].mass1->num, x->link[i].mass2->num, x->link[i].K, x->link[i].D, x->link[i].arrayK->s_name, x->link[i].K_L, x->link[i].arrayD->s_name, x->link[i].D_L);
- break;
- }
- }
-}
-
-void pmpd_bang(t_pmpd *x)
-{ // this part is doing all the PM
- t_float F, L, absL, tmpX;
- t_int i;
- // post("bang");
-
- for (i=0; i<x->nb_mass; i++)
- // compute new masses position
- if (x->mass[i].mobile > 0) // only if mobile
- {
- x->mass[i].speedX += x->mass[i].forceX * x->mass[i].invM;
- // x->mass[i].forceX = 0;
- x->mass[i].posX += x->mass[i].speedX ;
- // x->mass[i].posX = min(x->maxX,max(x->minX,x->mass[i].posX));
- if ( (x->mass[i].posX < x->minX) || (x->mass[i].posX > x->maxX) )
- {
- tmpX = min(x->maxX,max(x->minX,x->mass[i].posX));
- x->mass[i].speedX -= x->mass[i].posX - tmpX;
- x->mass[i].posX = tmpX;
- }
- x->mass[i].forceX = -x->mass[i].D2 * x->mass[i].speedX;
- }
-
- for (i=0; i<x->nb_link; i++)
- // compute link forces
- {
- L = x->link[i].mass1->posX - x->link[i].mass2->posX;
- absL = fabs(L);
- if ( (absL >= x->link[i].Lmin) && (absL < x->link[i].Lmax) && (L !=0))
- {
- if (x->link[i].lType == 2)
- { // K et D viennent d'une table
- F = x->link[i].D * tabread2(x, (L - x->link[i].distance) / x->link[i].D_L, x->link[i].arrayD);
- F += x->link[i].K * tabread2(x, L / x->link[i].K_L, x->link[i].arrayK);
- }
- else
- {
- F = x->link[i].D * (L - x->link[i].distance) ;
- F += x->link[i].K * sign_ch(L) * pow_ch( absL - x->link[i].L, x->link[i].Pow);
- }
-
- x->link[i].mass1->forceX -= F;
- x->link[i].mass2->forceX += F;
- }
- x->link[i].distance=L;
- }
-}
-
-void pmpd_mass(t_pmpd *x, t_symbol *Id, t_float mobile, t_float M, t_float posX )
-{ // add a mass : Id, invM speedX posX forceX
-
- if (M<=0) M=1;
- x->mass[x->nb_mass].Id = Id;
- x->mass[x->nb_mass].mobile = (int)mobile;
- x->mass[x->nb_mass].invM = 1/M;
- x->mass[x->nb_mass].speedX = 0;
- x->mass[x->nb_mass].posX = posX;
- x->mass[x->nb_mass].forceX = 0;
- x->mass[x->nb_mass].num = x->nb_mass;
-
- x->nb_mass++ ;
- x->nb_mass = min ( nb_max_mass -1, x->nb_mass );
-}
-
-void pmpd_create_link(t_pmpd *x, t_symbol *Id, int mass1, int mass2, t_float K, t_float D, t_float Pow, t_float Lmin, t_float Lmax, t_int type)
-{ // create a link based on mass number
-
- if ((x->nb_mass>0) && (mass1 != mass2) && (mass1 >= 0) && (mass2 >= 0) && (mass1 < x->nb_mass) && (mass2 < x->nb_mass) )
- {
- x->link[x->nb_link].lType = type;
- x->link[x->nb_link].Id = Id;
- x->link[x->nb_link].mass1 = &x->mass[mass1];
- x->link[x->nb_link].mass2 = &x->mass[mass2];
- x->link[x->nb_link].K = K;
- x->link[x->nb_link].D = D;
- x->link[x->nb_link].L = x->mass[mass1].posX - x->mass[mass2].posX;
- x->link[x->nb_link].Pow = Pow;
- x->link[x->nb_link].Lmin = Lmin;
- x->link[x->nb_link].Lmax = Lmax;
- x->link[x->nb_link].distance = x->link[x->nb_link].L;
-
- x->nb_link++ ;
- x->nb_link = min ( nb_max_link -1, x->nb_link );
- }
-}
-
-void pmpd_link(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{ // add a link : Id, *mass1, *mass2, K, D, Pow, Lmin, Lmax;
-
- int i, j;
-
- t_symbol *Id = atom_getsymbolarg(0,argc,argv);
- int mass1 = atom_getfloatarg(1, argc, argv);
- int mass2 = atom_getfloatarg(2, argc, argv);
- t_float K = atom_getfloatarg(3, argc, argv);
- t_float D = atom_getfloatarg(4, argc, argv);
- t_float Pow = 1;
- if (argc > 5) Pow = atom_getfloatarg(5, argc, argv);
- t_float Lmin = -1000000;
- if (argc > 6) Lmin = atom_getfloatarg(6, argc, argv);
- t_float Lmax = 1000000;
- if (argc > 7) Lmax = atom_getfloatarg(7, argc, argv);
-// post("%d,%d, %f,%f", mass1, mass2, K, D);
-
- if ( ( argv[1].a_type == A_FLOAT ) && ( argv[2].a_type == A_FLOAT ) )
- {
- pmpd_create_link(x, Id, mass1, mass2, K, D, Pow, Lmin, Lmax, 0);
- }
- else
- if ( ( argv[1].a_type == A_SYMBOL ) && ( argv[2].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- pmpd_create_link(x, Id, i, mass2, K, D, Pow, Lmin, Lmax, 0);
- }
- }
- }
- else
- if ( ( argv[1].a_type == A_FLOAT ) && ( argv[2].a_type == A_SYMBOL ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(2,argc,argv) == x->mass[i].Id)
- {
- pmpd_create_link(x, Id, mass1, i, K, D, Pow, Lmin, Lmax, 0);
- }
- }
- }
- else
- if ( ( argv[1].a_type == A_SYMBOL ) && ( argv[2].a_type == A_SYMBOL ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- for (j=0; j< x->nb_mass; j++)
- {
- if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
- {
- if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) ))
- // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
- pmpd_create_link(x, Id, i, j, K, D, Pow, Lmin, Lmax, 0);
- }
- }
- }
- }
-}
-
-void pmpd_tabLink(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j;
-
- t_symbol *Id = atom_getsymbolarg(0,argc,argv);
- int mass1 = atom_getfloatarg(1, argc, argv);
- int mass2 = atom_getfloatarg(2, argc, argv);
- t_symbol *arrayK = atom_getsymbolarg(3,argc,argv);
- t_float Kl = atom_getfloatarg(4, argc, argv);
- if (Kl <= 0) Kl = 1;
- t_symbol *arrayD = atom_getsymbolarg(5,argc,argv);
- t_float Dl = atom_getfloatarg(6, argc, argv);
- if (Dl <= 0) Dl = 1;
-
- if ( ( argv[1].a_type == A_FLOAT ) && ( argv[2].a_type == A_FLOAT ) )
- {
- pmpd_create_link(x, Id, mass1, mass2, 1, 1, 1, -1000000, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
- x->link[x->nb_link-1].K_L = Kl;
- x->link[x->nb_link-1].D_L = Dl;
- }
- else
- if ( ( argv[1].a_type == A_SYMBOL ) && ( argv[2].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- pmpd_create_link(x, Id, i, mass2, 1, 1, 1, -1000000, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
- x->link[x->nb_link-1].K_L = Kl;
- x->link[x->nb_link-1].D_L = Dl;
- }
- }
- }
- else
- if ( ( argv[1].a_type == A_FLOAT ) && ( argv[2].a_type == A_SYMBOL ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(2,argc,argv) == x->mass[i].Id)
- {
- pmpd_create_link(x, Id, mass1, i, 1, 1, 1, -1000000, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
- x->link[x->nb_link-1].K_L = Kl;
- x->link[x->nb_link-1].D_L = Dl;
- }
- }
- }
- else
- if ( ( argv[1].a_type == A_SYMBOL ) && ( argv[2].a_type == A_SYMBOL ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- for (j=0; j< x->nb_mass; j++)
- {
- if ( (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)&(atom_getsymbolarg(2,argc,argv) == x->mass[j].Id))
- {
- if (!( (x->mass[i].Id == x->mass[j].Id) && (i>j) ))
- // si lien entre 2 serie de masses identique entres elle, alors on ne creer qu'un lien sur 2, pour evider les redondances
- {
- pmpd_create_link(x, Id, i, j, 1, 1, 1, -1000000, 1000000, 2);
- x->link[x->nb_link-1].arrayK = arrayK;
- x->link[x->nb_link-1].arrayD = arrayD;
- x->link[x->nb_link-1].K_L = Kl;
- x->link[x->nb_link-1].D_L = Dl;
- }
- }
- }
- }
- }
-}
-
-void pmpd_setK(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].K = atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].K = atom_getfloatarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_setD(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].D = atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].D = atom_getfloatarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_setL(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].L = atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].L = atom_getfloatarg(1, argc, argv);
- }
- }
- }
- if ( ( argv[0].a_type == A_FLOAT ) && ( argc == 1 ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].L = x->link[tmp].mass2->posX - x->link[tmp].mass1->posX;
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argc == 1 ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].L = x->link[i].mass2->posX - x->link[i].mass1->posX;
- }
- }
- }
-}
-
-void pmpd_setLKTab(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
- t_float K_l = atom_getfloatarg(1, argc, argv);
- if (K_l <= 0) K_l = 1;
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].K_L = K_l;
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].K_L = K_l;
- }
- }
- }
-}
-
-void pmpd_setLDTab(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
- t_float D_l = atom_getfloatarg(1, argc, argv);
- if (D_l <= 0) D_l = 1;
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].D_L = D_l;
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].D_L = D_l;
- }
- }
- }
-}
-
-void pmpd_setLinkId(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_SYMBOL ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_link-1, tmp));
- x->link[tmp].Id = atom_getsymbolarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_SYMBOL ) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
- {
- x->link[i].Id = atom_getsymbolarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_setMassId(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_SYMBOL ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].Id = atom_getsymbolarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_SYMBOL ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].Id = atom_getsymbolarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_minX(t_pmpd *x, t_float min)
-{
- x->minX = min;
-}
-
-void pmpd_maxX(t_pmpd *x, t_float max)
-{
- x->maxX = max;
-}
-
-void pmpd_setFixed(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( argv[0].a_type == A_FLOAT )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].mobile = 0;
- }
- if ( argv[0].a_type == A_SYMBOL )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].mobile = 0;
- }
- }
- }
-}
-
-void pmpd_setMobile(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( argv[0].a_type == A_FLOAT )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].mobile = 1;
- }
- if ( argv[0].a_type == A_SYMBOL )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].mobile = 1;
- }
- }
- }
-}
-
-void pmpd_forceX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
-// add a force to a specific mass
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].forceX += atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].forceX += atom_getfloatarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_posX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
-// displace a mass to a certain position
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].posX = atom_getfloatarg(1, argc, argv);
- x->mass[tmp].speedX = 0; // ??? TODO : esce la bonne chose a faire?
- x->mass[tmp].forceX = 0; // ??? TODO : esce la bonne chose a faire?
-
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].posX = atom_getfloatarg(1, argc, argv);
- x->mass[i].speedX = 0; // ??? TODO : esce la bonne chose a faire?
- x->mass[i].forceX = 0; // ??? TODO : esce la bonne chose a faire?
-
- }
- }
- }
-}
-
-void pmpd_setD2(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].D2 = atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].D2 = atom_getfloatarg(1, argc, argv);
- }
- }
- }
- if ( ( argv[0].a_type == A_FLOAT ) && ( argc == 1 ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- x->mass[i].D2 = atom_getfloatarg(0, argc, argv);
- }
- }
-}
-
-void pmpd_setSpeedX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].speedX = atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].speedX = atom_getfloatarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_addPosX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].posX += atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].posX += atom_getfloatarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_setForceX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int tmp, i;
-
- if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
- {
- tmp = atom_getfloatarg(0, argc, argv);
- tmp = max(0, min( x->nb_mass-1, tmp));
- x->mass[tmp].forceX = atom_getfloatarg(1, argc, argv);
- }
- if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- x->mass[i].forceX = atom_getfloatarg(1, argc, argv);
- }
- }
- }
-}
-
-void pmpd_get(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i;
- t_symbol *toget;
- t_atom toout[3];
- toget = atom_getsymbolarg(0, argc, argv);
-
- if ( (toget == gensym("massesPos")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].posX);
- outlet_anything(x->main_outlet, gensym("massesPosNo"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesPos")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].posX);
- outlet_anything(x->main_outlet, gensym("massesPosId"), 2, toout);
- }
- }
- }
- else
- if ( (toget == gensym("massesPos")) && (argc == 1) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].posX);
- outlet_anything(x->main_outlet, gensym("massesPos"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesPosName")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].posX);
- outlet_anything(x->main_outlet, gensym("massesPosNameNo"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesPosName")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].posX);
- outlet_anything(x->main_outlet, gensym("massesPosNameId"), 2, toout);
- }
- }
- }
- else
- if ( (toget == gensym("massesPosName")) && (argc == 1) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].posX);
- outlet_anything(x->main_outlet, gensym("massesPosName"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesSpeeds")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].speedX);
- outlet_anything(x->main_outlet, gensym("massesSpeedsNo"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesSpeeds")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].speedX);
- outlet_anything(x->main_outlet, gensym("massesSpeedsId"), 2, toout);
- }
- }
- }
- else
- if ( (toget == gensym("massesSpeeds")) && (argc == 1) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].speedX);
- outlet_anything(x->main_outlet, gensym("massesSpeeds"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesSpeedsName")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].speedX);
- outlet_anything(x->main_outlet, gensym("massesSpeedsNameNo"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesSpeedsName")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].speedX);
- outlet_anything(x->main_outlet, gensym("massesSpeedsNameId"), 2, toout);
- }
- }
- }
- else
- if ( (toget == gensym("massesSpeedsName")) && (argc == 1) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].speedX);
- outlet_anything(x->main_outlet, gensym("massesSpeedsName"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesForces")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].forceX);
- outlet_anything(x->main_outlet, gensym("massesForcesNo"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesForces")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].forceX);
- outlet_anything(x->main_outlet, gensym("massesForcesId"), 2, toout);
- }
- }
- }
- else
- if ( (toget == gensym("massesForces")) && (argc == 1) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->mass[i].forceX);
- outlet_anything(x->main_outlet, gensym("massesForces"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesForcesName")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].forceX);
- outlet_anything(x->main_outlet, gensym("massesForcesNameNo"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("massesForcesName")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].forceX);
- outlet_anything(x->main_outlet, gensym("massesForcesNameId"), 2, toout);
- }
- }
- }
- else
- if ( (toget == gensym("massesForcesName")) && (argc == 1) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- SETSYMBOL(&(toout[0]), x->mass[i].Id);
- SETFLOAT(&(toout[1]), x->mass[i].forceX);
- outlet_anything(x->main_outlet, gensym("massesForcesName"), 2, toout);
- }
- }
- else
- if ( (toget == gensym("linksPos")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
- SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
- outlet_anything(x->main_outlet, gensym("linksPosNo"), 3, toout);
- }
- }
- else
- if ( (toget == gensym("linksPos")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->link[i].Id)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
- SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
- outlet_anything(x->main_outlet, gensym("linksPosId"), 3, toout);
- }
- }
- }
- else
- if ( (toget == gensym("linksPos")) && (argc == 1) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- SETFLOAT(&(toout[0]), i);
- SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
- SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
- outlet_anything(x->main_outlet, gensym("linksPos"), 3, toout);
- }
- }
- else
- if ( (toget == gensym("linksPosName")) && (argv[1].a_type == A_FLOAT) )
- {
- i = atom_getfloatarg(1, argc, argv);
- if ( (i>=0) && (i<x->nb_mass) )
- {
- SETSYMBOL(&(toout[0]), x->link[i].Id);
- SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
- SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
- outlet_anything(x->main_outlet, gensym("linksPosNameNo"), 3, toout);
- }
- }
- else
- if ( (toget == gensym("linksPosName")) && (argv[1].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- if ( atom_getsymbolarg(1,argc,argv) == x->link[i].Id)
- {
- SETSYMBOL(&(toout[0]), x->link[i].Id);
- SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
- SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
- outlet_anything(x->main_outlet, gensym("linksPosNameId"), 3, toout);
- }
- }
- }
- else
- if ( (toget == gensym("linksPosName")) && (argc == 1) )
- {
- for (i=0; i< x->nb_link; i++)
- {
- SETSYMBOL(&(toout[0]), x->link[i].Id);
- SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
- SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
- outlet_anything(x->main_outlet, gensym("linksPosName"), 3, toout);
- }
- }
- else
- error("not get attribute");
-}
-
-void pmpd_massesPosL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_mass];
-
- for (i=0; i < x->nb_mass; i++)
- {
- SETFLOAT(&(pos_list[i]),x->mass[i].posX);
- }
- outlet_anything(x->main_outlet, gensym("massesPosL"),x->nb_mass , pos_list);
-}
-
-void pmpd_massesForcesL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_mass];
-
- for (i=0; i< x->nb_mass; i++)
- {
- SETFLOAT(&(pos_list[i]),x->mass[i].forceX);
- }
- outlet_anything(x->main_outlet, gensym("massesForcesL"),x->nb_mass , pos_list);
-}
-
-void pmpd_massesSpeedsL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_mass];
-
- for (i=0; i< x->nb_mass; i++)
- {
- SETFLOAT(&(pos_list[i]),x->mass[i].speedX);
- }
- outlet_anything(x->main_outlet, gensym("massesSpeedsL"),x->nb_mass , pos_list);
-}
-
-void pmpd_massesPosT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_mass;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = x->mass[i].posX;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_mass))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->mass[j].Id)
- {
- vec[i].w_float = x->mass[j].posX;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-
-void pmpd_massesSpeedsT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_mass;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = x->mass[i].speedX;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_mass))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->mass[j].Id)
- {
- vec[i].w_float = x->mass[j].speedX;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-
-void pmpd_massesForcesT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_mass;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = x->mass[i].forceX;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_mass))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->mass[j].Id)
- {
- vec[i].w_float = x->mass[j].forceX;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-
-void pmpd_massesPosMean(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float sommeX;
- t_int i,j;
- t_atom mean[1];
-
- sommeX = 0;
- j = 0;
-
- if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- sommeX += x->mass[i].posX;
- j++;
- }
- }
- }
- else
- {
- for (i=0; i< x->nb_mass; i++)
- {
- sommeX += x->mass[i].posX;
- j++;
- }
- }
-
- sommeX /= j;
-
- SETFLOAT(&(mean[0]),sommeX);
-
- outlet_anything(x->main_outlet, gensym("massesPosMean"),1 , mean);
-}
-
-void pmpd_massesPosStd(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float sommeX;
- t_int i,j;
- t_float stdX;
- t_atom std_out[1];
-
- sommeX = 0;
- stdX = 0;
- j = 0;
-
- if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- sommeX += x->mass[i].posX;
- j++;
- }
- }
- sommeX /= j;
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- stdX += sqr(x->mass[i].posX-sommeX);
- }
- }
- }
- else
- {
- for (i=0; i< x->nb_mass; i++)
- {
- sommeX += x->mass[i].posX;
- j++;
- }
- sommeX /= j;
- for (i=0; i< x->nb_mass; i++)
- {
- stdX += sqr(x->mass[i].posX-sommeX);
- }
- }
-
- stdX = sqrt(stdX/j);
-
- SETFLOAT(&(std_out[0]),stdX);
-
- outlet_anything(x->main_outlet, gensym("massesPosStd"),1 , std_out);
-}
-
-void pmpd_massesForcesMean(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float sommeX;
- t_int i,j;
- t_atom mean[1];
-
- sommeX = 0;
- j = 0;
-
- if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- sommeX += x->mass[i].forceX;
- j++;
- }
- }
- }
- else
- {
- for (i=0; i< x->nb_mass; i++)
- {
- sommeX += x->mass[i].forceX;
- j++;
- }
- }
-
- sommeX /= j;
-
- SETFLOAT(&(mean[0]),sommeX);
-
- outlet_anything(x->main_outlet, gensym("massesForcesMean"),1 , mean);
-}
-
-void pmpd_massesForcesStd(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float sommeX;
- t_int i,j;
- t_float stdX;
- t_atom std_out[1];
-
- sommeX = 0;
- stdX = 0;
- j = 0;
-
- if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- sommeX += x->mass[i].forceX;
- j++;
- }
- }
- sommeX /= j;
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- stdX += sqr(x->mass[i].forceX-sommeX);
- }
- }
- }
- else
- {
- for (i=0; i< x->nb_mass; i++)
- {
- sommeX += x->mass[i].forceX;
- j++;
- }
- sommeX /= j;
- for (i=0; i< x->nb_mass; i++)
- {
- stdX += sqr(x->mass[i].forceX-sommeX);
- }
- }
-
- stdX = sqrt(stdX/j);
-
- SETFLOAT(&(std_out[0]),stdX);
-
- outlet_anything(x->main_outlet, gensym("massesForcesStd"),1 , std_out);
-}
-
-void pmpd_massesSpeedsMean(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float sommeX;
- t_int i,j;
- t_atom mean[1];
-
- sommeX = 0;
- j = 0;
-
- if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- sommeX += x->mass[i].speedX;
- j++;
- }
- }
- }
- else
- {
- for (i=0; i< x->nb_mass; i++)
- {
- sommeX += x->mass[i].speedX;
- j++;
- }
- }
-
- sommeX /= j;
-
- SETFLOAT(&(mean[0]),sommeX);
-
- outlet_anything(x->main_outlet, gensym("massesSpeedsMean"),1 , mean);
-}
-
-void pmpd_massesSpeedsStd(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float sommeX;
- t_int i,j;
- t_float stdX;
- t_atom std_out[1];
-
- sommeX = 0;
- stdX = 0;
- j = 0;
-
- if ( (argc >= 1) && (argv[0].a_type == A_SYMBOL) )
- {
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- sommeX += x->mass[i].speedX;
- j++;
- }
- }
- sommeX /= j;
- for (i=0; i< x->nb_mass; i++)
- {
- if (atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
- {
- stdX += sqr(x->mass[i].speedX-sommeX);
- }
- }
- }
- else
- {
- for (i=0; i< x->nb_mass; i++)
- {
- sommeX += x->mass[i].speedX;
- j++;
- }
- sommeX /= j;
- for (i=0; i< x->nb_mass; i++)
- {
- stdX += sqr(x->mass[i].speedX-sommeX);
- }
- }
-
- stdX = sqrt(stdX/j);
-
- SETFLOAT(&(std_out[0]),stdX);
-
- outlet_anything(x->main_outlet, gensym("massesSpeedsStd"),1 , std_out);
-}
-
-// --------------------------------------------
-
-void pmpd_linksPosL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_link];
-
- for (i=0; i < x->nb_link; i++)
- {
- SETFLOAT(&(pos_list[i]),(x->link[i].mass1->posX + x->link[i].mass2->posX)/2);
- }
- outlet_anything(x->main_outlet, gensym("linksPosXL"),x->nb_link , pos_list);
-}
-
-void pmpd_linksLengthL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_link];
-
- for (i=0; i < x->nb_link; i++)
- {
- SETFLOAT(&(pos_list[i]),x->link[i].mass2->posX - x->link[i].mass1->posX);
- }
- outlet_anything(x->main_outlet, gensym("linksLengthXL"),x->nb_link , pos_list);
-}
-
-void pmpd_linksPosSpeedL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_link];
-
- for (i=0; i < x->nb_link; i++)
- {
- SETFLOAT(&(pos_list[i]),(x->link[i].mass1->speedX + x->link[i].mass2->speedX)/2);
- }
- outlet_anything(x->main_outlet, gensym("linksPosSpeedXL"),x->nb_link , pos_list);
-}
-
-void pmpd_linksLengthSpeedL(t_pmpd *x)
-{
- int i;
- t_atom pos_list[x->nb_link];
-
- for (i=0; i < x->nb_link; i++)
- {
- SETFLOAT(&(pos_list[i]),x->link[i].mass2->speedX - x->link[i].mass1->speedX);
- }
- outlet_anything(x->main_outlet, gensym("linksLengthSpeedXL"),x->nb_link , pos_list);
-}
-
-void pmpd_linksPosT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_link;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = (x->link[i].mass1->posX + x->link[i].mass2->posX)/2;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_link))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
- {
- vec[i].w_float = (x->link[j].mass1->posX + x->link[j].mass2->posX)/2;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-
-void pmpd_linksLengthT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_link;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = x->link[i].mass2->posX - x->link[i].mass1->posX;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_link))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
- {
- vec[i].w_float = x->link[j].mass2->posX - x->link[j].mass1->posX;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-
-void pmpd_linksPosSpeedT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_link;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = (x->link[i].mass1->speedX + x->link[i].mass2->speedX)/2;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_link))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
- {
- vec[i].w_float = (x->link[j].mass1->speedX + x->link[j].mass2->speedX)/2;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-
-void pmpd_linksLengthSpeedT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_link;
- taille_max = min(taille_max, vecsize);
- for (i=0; i < taille_max ; i++)
- {
- vec[i].w_float = x->link[i].mass2->speedX - x->link[i].mass1->speedX;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize) && (j < x->nb_link))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
- {
- vec[i].w_float = x->link[j].mass2->speedX - x->link[j].mass1->speedX;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
+#include "m_pd.h"
-void pmpd_linksEndT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- int i, j, vecsize;
- t_garray *a;
- t_word *vec;
-
- if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- int taille_max = x->nb_link;
- taille_max = min(taille_max, (vecsize-1)/2);
- for (i=0; i < taille_max ; i++)
- {
- vec[2*i ].w_float = x->link[i].mass1->posX;
- vec[2*i+1].w_float = x->link[i].mass2->posX;
- }
- garray_redraw(a);
- }
- }
- else
- if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
- {
- t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
- if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
- pd_error(x, "%s: no such array", tab_name->s_name);
- else if (!garray_getfloatwords(a, &vecsize, &vec))
- pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
- else
- {
- i = 0;
- j = 0;
- while ((i < vecsize-1) && (j < x->nb_link))
- {
- if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
- {
- vec[i].w_float = x->link[j].mass1->posX;
- i++;
- vec[i].w_float = x->link[j].mass2->posX;
- i++;
- }
- j++;
- }
- garray_redraw(a);
- }
- }
-}
-//----------------------------------------------
-void pmpd_grabMass(t_pmpd *x, t_float posX, t_float grab)
-{
- t_float dist, tmp;
- t_int i;
-
- if (grab == 0)
- x->grab=0;
- if ((x->grab == 0)&(grab == 1)&(x->nb_mass > 0))
- {
- x->grab=1;
- x->grab_nb= 0;
- dist = x->mass[0].posX - posX;
- for (i=1; i<x->nb_mass; i++)
- {
- tmp = x->mass[i].posX - posX;
- if (tmp < dist)
- {
- dist = tmp;
- x->grab_nb= i;
- }
- }
- }
- if (x->grab == 1)
- {
- x->mass[x->grab_nb].posX = posX;
- }
-}
-void pmpd_closestMass(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
-{
- t_float dist, tmp;
- t_int i;
- t_atom std_out[2];
- t_float posX;
- posX = atom_getfloatarg(0, argc, argv);
-
- if ( (argc == 2) && (argv[1].a_type == A_SYMBOL) )
- {
- //t_symbol *mass_name = atom_getsymbolarg(2, argc, argv);
- if ((x->nb_mass > 0))
- {
- dist = 1000000000;//sqr(x->mass[0].posX - posX) + sqr(x->mass[0].posY - posY);
- for (i=0; i<x->nb_mass; i++)
- {
- if (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
- {
- tmp = x->mass[i].posX - posX;
- if (tmp < dist)
- {
- dist = tmp;
- x->grab_nb= i;
- }
- }
- }
- }
- }
- else {
- if ((x->nb_mass > 0))
- {
- dist = x->mass[0].posX - posX;
- for (i=1; i<x->nb_mass; i++)
- {
- tmp = x->mass[i].posX - posX;
- 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);
- outlet_anything(x->main_outlet, gensym("closestMass"),2,std_out);
-}
-void *pmpd_new()
-{
- t_pmpd *x = (t_pmpd *)pd_new(pmpd_class);
- pmpd_reset(x);
-
- x->main_outlet=outlet_new(&x->x_obj, 0);
- // x->info_outlet=outlet_new(&x->x_obj, 0); // TODO
- return (void *)x;
-}
void pmpd_setup(void)
{
diff --git a/pmpd.h b/pmpd.h
new file mode 100644
index 0000000..69c4999
--- /dev/null
+++ b/pmpd.h
@@ -0,0 +1,55 @@
+/*
+ * pmpd.h
+ *
+ */
+
+#define nb_max_link 100000
+#define nb_max_mass 100000
+
+#define max(a,b) ( ((a) > (b)) ? (a) : (b) )
+#define min(a,b) ( ((a) < (b)) ? (a) : (b) )
+
+static t_class *pmpd_class;
+
+typedef struct _mass {
+ t_symbol *Id;
+ int mobile;
+ t_float invM;
+ t_float speedX;
+ t_float posX;
+ t_float forceX;
+ t_float D2;
+ int num;
+} foo;
+
+typedef struct _link {
+ t_symbol *Id;
+ int lType;
+ struct _mass *mass1;
+ struct _mass *mass2;
+ t_float K;
+ t_float D;
+ t_float L;
+ t_float Pow;
+ t_float Lmin;
+ t_float Lmax;
+ t_float distance;
+ t_symbol *arrayK;
+ t_symbol *arrayD;
+ t_float K_L; // longeur du tabeau K
+ t_float D_L; // longeur du tabeau D
+} foo1 ;
+
+typedef struct _pmpd {
+ t_object x_obj;
+ struct _link link[nb_max_link];
+ struct _mass mass[nb_max_mass];
+ t_outlet *main_outlet;
+ t_outlet *info_outlet;
+ int nb_link;
+ int nb_mass;
+ t_float minX, maxX;
+ t_int grab; // si on grab une mass ou pas
+ t_int grab_nb; // la masse grabé
+} t_pmpd;
+
diff --git a/pmpd_get.c b/pmpd_get.c
new file mode 100644
index 0000000..325e632
--- /dev/null
+++ b/pmpd_get.c
@@ -0,0 +1,288 @@
+void pmpd_get(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i;
+ t_symbol *toget;
+ t_atom toout[3];
+ toget = atom_getsymbolarg(0, argc, argv);
+
+ if ( (toget == gensym("massesPos")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].posX);
+ outlet_anything(x->main_outlet, gensym("massesPosNo"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesPos")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].posX);
+ outlet_anything(x->main_outlet, gensym("massesPosId"), 2, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("massesPos")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].posX);
+ outlet_anything(x->main_outlet, gensym("massesPos"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesPosName")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].posX);
+ outlet_anything(x->main_outlet, gensym("massesPosNameNo"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesPosName")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].posX);
+ outlet_anything(x->main_outlet, gensym("massesPosNameId"), 2, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("massesPosName")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].posX);
+ outlet_anything(x->main_outlet, gensym("massesPosName"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesSpeeds")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].speedX);
+ outlet_anything(x->main_outlet, gensym("massesSpeedsNo"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesSpeeds")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].speedX);
+ outlet_anything(x->main_outlet, gensym("massesSpeedsId"), 2, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("massesSpeeds")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].speedX);
+ outlet_anything(x->main_outlet, gensym("massesSpeeds"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesSpeedsName")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].speedX);
+ outlet_anything(x->main_outlet, gensym("massesSpeedsNameNo"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesSpeedsName")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].speedX);
+ outlet_anything(x->main_outlet, gensym("massesSpeedsNameId"), 2, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("massesSpeedsName")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].speedX);
+ outlet_anything(x->main_outlet, gensym("massesSpeedsName"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesForces")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].forceX);
+ outlet_anything(x->main_outlet, gensym("massesForcesNo"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesForces")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].forceX);
+ outlet_anything(x->main_outlet, gensym("massesForcesId"), 2, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("massesForces")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->mass[i].forceX);
+ outlet_anything(x->main_outlet, gensym("massesForces"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesForcesName")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].forceX);
+ outlet_anything(x->main_outlet, gensym("massesForcesNameNo"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("massesForcesName")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].forceX);
+ outlet_anything(x->main_outlet, gensym("massesForcesNameId"), 2, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("massesForcesName")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ SETSYMBOL(&(toout[0]), x->mass[i].Id);
+ SETFLOAT(&(toout[1]), x->mass[i].forceX);
+ outlet_anything(x->main_outlet, gensym("massesForcesName"), 2, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("linksPos")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
+ SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
+ outlet_anything(x->main_outlet, gensym("linksPosNo"), 3, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("linksPos")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->link[i].Id)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
+ SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
+ outlet_anything(x->main_outlet, gensym("linksPosId"), 3, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("linksPos")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ SETFLOAT(&(toout[0]), i);
+ SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
+ SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
+ outlet_anything(x->main_outlet, gensym("linksPos"), 3, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("linksPosName")) && (argv[1].a_type == A_FLOAT) )
+ {
+ i = atom_getfloatarg(1, argc, argv);
+ if ( (i>=0) && (i<x->nb_mass) )
+ {
+ SETSYMBOL(&(toout[0]), x->link[i].Id);
+ SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
+ SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
+ outlet_anything(x->main_outlet, gensym("linksPosNameNo"), 3, toout);
+ }
+ }
+ else
+ if ( (toget == gensym("linksPosName")) && (argv[1].a_type == A_SYMBOL) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(1,argc,argv) == x->link[i].Id)
+ {
+ SETSYMBOL(&(toout[0]), x->link[i].Id);
+ SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
+ SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
+ outlet_anything(x->main_outlet, gensym("linksPosNameId"), 3, toout);
+ }
+ }
+ }
+ else
+ if ( (toget == gensym("linksPosName")) && (argc == 1) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ SETSYMBOL(&(toout[0]), x->link[i].Id);
+ SETFLOAT(&(toout[1]), x->link[i].mass1->posX);
+ SETFLOAT(&(toout[2]), x->link[i].mass2->posX);
+ outlet_anything(x->main_outlet, gensym("linksPosName"), 3, toout);
+ }
+ }
+ else
+ error("not get attribute");
+}
+
diff --git a/pmpd_list.c b/pmpd_list.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pmpd_list.c
diff --git a/pmpd_set.c b/pmpd_set.c
new file mode 100644
index 0000000..f17ed6e
--- /dev/null
+++ b/pmpd_set.c
@@ -0,0 +1,315 @@
+void pmpd_setK(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].K = atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].K = atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+}
+
+void pmpd_setD(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].D = atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].D = atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+}
+
+void pmpd_setL(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].L = atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].L = atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argc == 1 ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].L = x->link[tmp].mass2->posX - x->link[tmp].mass1->posX;
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argc == 1 ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].L = x->link[i].mass2->posX - x->link[i].mass1->posX;
+ }
+ }
+ }
+}
+
+void pmpd_setLKTab(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+ t_float K_l = atom_getfloatarg(1, argc, argv);
+ if (K_l <= 0) K_l = 1;
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].K_L = K_l;
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].K_L = K_l;
+ }
+ }
+ }
+}
+
+void pmpd_setLDTab(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+ t_float D_l = atom_getfloatarg(1, argc, argv);
+ if (D_l <= 0) D_l = 1;
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].D_L = D_l;
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].D_L = D_l;
+ }
+ }
+ }
+}
+
+void pmpd_setLinkId(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_SYMBOL ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_link-1, tmp));
+ x->link[tmp].Id = atom_getsymbolarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_SYMBOL ) )
+ {
+ for (i=0; i< x->nb_link; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->link[i].Id)
+ {
+ x->link[i].Id = atom_getsymbolarg(1, argc, argv);
+ }
+ }
+ }
+}
+
+void pmpd_setMassId(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_SYMBOL ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].Id = atom_getsymbolarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_SYMBOL ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].Id = atom_getsymbolarg(1, argc, argv);
+ }
+ }
+ }
+}
+void pmpd_setFixed(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( argv[0].a_type == A_FLOAT )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].mobile = 0;
+ }
+ if ( argv[0].a_type == A_SYMBOL )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].mobile = 0;
+ }
+ }
+ }
+}
+
+void pmpd_setMobile(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( argv[0].a_type == A_FLOAT )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].mobile = 1;
+ }
+ if ( argv[0].a_type == A_SYMBOL )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].mobile = 1;
+ }
+ }
+ }
+}
+
+void pmpd_posX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+// displace a mass to a certain position
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].posX = atom_getfloatarg(1, argc, argv);
+ x->mass[tmp].speedX = 0; // ??? TODO : esce la bonne chose a faire?
+ x->mass[tmp].forceX = 0; // ??? TODO : esce la bonne chose a faire?
+
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].posX = atom_getfloatarg(1, argc, argv);
+ x->mass[i].speedX = 0; // ??? TODO : esce la bonne chose a faire?
+ x->mass[i].forceX = 0; // ??? TODO : esce la bonne chose a faire?
+
+ }
+ }
+ }
+}
+
+void pmpd_setD2(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].D2 = atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].D2 = atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argc == 1 ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ x->mass[i].D2 = atom_getfloatarg(0, argc, argv);
+ }
+ }
+}
+
+void pmpd_setSpeedX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].speedX = atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].speedX = atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+}
+void pmpd_setForceX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].forceX = atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].forceX = atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+}
diff --git a/pmpd_tab.c b/pmpd_tab.c
new file mode 100644
index 0000000..bc3b4f1
--- /dev/null
+++ b/pmpd_tab.c
@@ -0,0 +1,403 @@
+void pmpd_massesPosT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_mass;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = x->mass[i].posX;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_mass))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->mass[j].Id)
+ {
+ vec[i].w_float = x->mass[j].posX;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_massesSpeedsT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_mass;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = x->mass[i].speedX;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_mass))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->mass[j].Id)
+ {
+ vec[i].w_float = x->mass[j].speedX;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_massesForcesT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_mass;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = x->mass[i].forceX;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_mass))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->mass[j].Id)
+ {
+ vec[i].w_float = x->mass[j].forceX;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_linksPosT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_link;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = (x->link[i].mass1->posX + x->link[i].mass2->posX)/2;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_link))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
+ {
+ vec[i].w_float = (x->link[j].mass1->posX + x->link[j].mass2->posX)/2;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_linksLengthT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_link;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = x->link[i].mass2->posX - x->link[i].mass1->posX;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_link))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
+ {
+ vec[i].w_float = x->link[j].mass2->posX - x->link[j].mass1->posX;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_linksPosSpeedT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_link;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = (x->link[i].mass1->speedX + x->link[i].mass2->speedX)/2;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_link))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
+ {
+ vec[i].w_float = (x->link[j].mass1->speedX + x->link[j].mass2->speedX)/2;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_linksLengthSpeedT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_link;
+ taille_max = min(taille_max, vecsize);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[i].w_float = x->link[i].mass2->speedX - x->link[i].mass1->speedX;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize) && (j < x->nb_link))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
+ {
+ vec[i].w_float = x->link[j].mass2->speedX - x->link[j].mass1->speedX;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
+void pmpd_linksEndT(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int i, j, vecsize;
+ t_garray *a;
+ t_word *vec;
+
+ if ( (argc==1) && (argv[0].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ int taille_max = x->nb_link;
+ taille_max = min(taille_max, (vecsize-1)/2);
+ for (i=0; i < taille_max ; i++)
+ {
+ vec[2*i ].w_float = x->link[i].mass1->posX;
+ vec[2*i+1].w_float = x->link[i].mass2->posX;
+ }
+ garray_redraw(a);
+ }
+ }
+ else
+ if ( (argc==2) && (argv[0].a_type == A_SYMBOL) && (argv[1].a_type == A_SYMBOL) )
+ {
+ t_symbol *tab_name = atom_getsymbolarg(0, argc, argv);
+ if (!(a = (t_garray *)pd_findbyclass(tab_name, garray_class)))
+ pd_error(x, "%s: no such array", tab_name->s_name);
+ else if (!garray_getfloatwords(a, &vecsize, &vec))
+ pd_error(x, "%s: bad template for tabwrite", tab_name->s_name);
+ else
+ {
+ i = 0;
+ j = 0;
+ while ((i < vecsize-1) && (j < x->nb_link))
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->link[j].Id)
+ {
+ vec[i].w_float = x->link[j].mass1->posX;
+ i++;
+ vec[i].w_float = x->link[j].mass2->posX;
+ i++;
+ }
+ j++;
+ }
+ garray_redraw(a);
+ }
+ }
+}
+
diff --git a/pmpd_various.c b/pmpd_various.c
new file mode 100644
index 0000000..e6b2dfc
--- /dev/null
+++ b/pmpd_various.c
@@ -0,0 +1,160 @@
+void pmpd_infosL(t_pmpd *x)
+{
+ int i;
+ post("list of mass");
+ post("number, Id, mobile, mass, Damping, position, speed, forces");
+ for(i=0; i < x->nb_mass; i++)
+ {
+ post("masse %i: %s, %d, %f, %f, %f, %f, %f",i, x->mass[i].Id->s_name, x->mass[i].mobile, 1/x->mass[i].invM, x->mass[i].D2, x->mass[i].posX, x->mass[i].speedX, x->mass[i].forceX );
+ }
+
+ post("list of link");
+ post("number, Id, mass1, mass2, K, D, Pow, L, Lmin, Lmax");
+ for(i=0; i < x->nb_link; i++)
+ {
+ switch(x->link[i].lType)
+ {
+ case 0 :
+ post("link %i: %s, %i, %i, %f, %f, %f, %f, %f, %f", i, x->link[i].Id->s_name, x->link[i].mass1->num, x->link[i].mass2->num, x->link[i].K, x->link[i].D, x->link[i].Pow, x->link[i].L, x->link[i].Lmin, x->link[i].Lmax);
+ break;
+ case 2 :
+ post("tabLink %i: %s, %i, %i, %f, %f, %s, %f, %s, %f", i, x->link[i].Id->s_name, x->link[i].mass1->num, x->link[i].mass2->num, x->link[i].K, x->link[i].D, x->link[i].arrayK->s_name, x->link[i].K_L, x->link[i].arrayD->s_name, x->link[i].D_L);
+ break;
+ }
+ }
+}
+
+void pmpd_forceX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+// add a force to a specific mass
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].forceX += atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].forceX += atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+}
+
+void pmpd_minX(t_pmpd *x, t_float min)
+{
+ x->minX = min;
+}
+
+void pmpd_maxX(t_pmpd *x, t_float max)
+{
+ x->maxX = max;
+}
+
+void pmpd_addPosX(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int tmp, i;
+
+ if ( ( argv[0].a_type == A_FLOAT ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ tmp = atom_getfloatarg(0, argc, argv);
+ tmp = max(0, min( x->nb_mass-1, tmp));
+ x->mass[tmp].posX += atom_getfloatarg(1, argc, argv);
+ }
+ if ( ( argv[0].a_type == A_SYMBOL ) && ( argv[1].a_type == A_FLOAT ) )
+ {
+ for (i=0; i< x->nb_mass; i++)
+ {
+ if ( atom_getsymbolarg(0,argc,argv) == x->mass[i].Id)
+ {
+ x->mass[i].posX += atom_getfloatarg(1, argc, argv);
+ }
+ }
+ }
+}
+
+//----------------------------------------------
+
+void pmpd_grabMass(t_pmpd *x, t_float posX, t_float grab)
+{
+ t_float dist, tmp;
+ t_int i;
+
+ if (grab == 0)
+ x->grab=0;
+ if ((x->grab == 0)&(grab == 1)&(x->nb_mass > 0))
+ {
+ x->grab=1;
+ x->grab_nb= 0;
+ dist = x->mass[0].posX - posX;
+ for (i=1; i<x->nb_mass; i++)
+ {
+ tmp = x->mass[i].posX - posX;
+ if (tmp < dist)
+ {
+ dist = tmp;
+ x->grab_nb= i;
+ }
+ }
+ }
+ if (x->grab == 1)
+ {
+ x->mass[x->grab_nb].posX = posX;
+ }
+}
+
+void pmpd_closestMass(t_pmpd *x, t_symbol *s, int argc, t_atom *argv)
+{
+ t_float dist, tmp;
+ t_int i;
+ t_atom std_out[2];
+ t_float posX;
+ posX = atom_getfloatarg(0, argc, argv);
+
+ if ( (argc == 2) && (argv[1].a_type == A_SYMBOL) )
+ {
+ //t_symbol *mass_name = atom_getsymbolarg(2, argc, argv);
+ if ((x->nb_mass > 0))
+ {
+ dist = 1000000000;//sqr(x->mass[0].posX - posX) + sqr(x->mass[0].posY - posY);
+ for (i=0; i<x->nb_mass; i++)
+ {
+ if (atom_getsymbolarg(1,argc,argv) == x->mass[i].Id)
+ {
+ tmp = x->mass[i].posX - posX;
+ if (tmp < dist)
+ {
+ dist = tmp;
+ x->grab_nb= i;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if ((x->nb_mass > 0))
+ {
+ dist = x->mass[0].posX - posX;
+ for (i=1; i<x->nb_mass; i++)
+ {
+ tmp = x->mass[i].posX - posX;
+ 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);
+ outlet_anything(x->main_outlet, gensym("closestMass"),2,std_out);
+}
+