[PD-cvs] externals/nusmuk msd.h,1.8,1.9

Nicolas Montgermont nimon at users.sourceforge.net
Tue May 17 17:37:44 CEST 2005


Update of /cvsroot/pure-data/externals/nusmuk
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10161

Modified Files:
	msd.h 
Log Message:
MSD Version 0.07


Index: msd.h
===================================================================
RCS file: /cvsroot/pure-data/externals/nusmuk/msd.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** msd.h	9 May 2005 14:12:19 -0000	1.8
--- msd.h	17 May 2005 15:37:42 -0000	1.9
***************
*** 30,34 ****
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  
!  Version 0.05 -- 28.04.2005
  */
  
--- 30,34 ----
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  
!  Version 0.07 -- 17.05.2005
  */
  
***************
*** 41,46 ****
  
  // define constants
! #define MSD_VERSION  0.05
! 
  
  // check for appropriate flext version
--- 41,46 ----
  
  // define constants
! #define MSD_VERSION  0.07
! #define PI  3.1415926535
  
  // check for appropriate flext version
***************
*** 70,74 ****
  	void insert(Link<N> *l) 
  	{
! 		for(typename LinkList::iterator it = begin(); it != end(); ++it)
  			if(*it == l) return;
  		// not found -> add
--- 70,74 ----
  	void insert(Link<N> *l) 
  	{
! 		for(typename LinkList<N>::iterator it = this->begin(); it != this->end(); ++it)
  			if(*it == l) return;
  		// not found -> add
***************
*** 78,82 ****
  	void erase(Link<N> *l)
  	{
! 		for(typename LinkList::iterator it = begin(); it != end(); ++it)
  			if(*it == l) { 
  				// found
--- 78,82 ----
  	void erase(Link<N> *l)
  	{
! 		for(typename LinkList<N>::iterator it = this->begin(); it != this->end(); ++it)
  			if(*it == l) { 
  				// found
***************
*** 166,178 ****
  	t_float longueur, long_min, long_max;
  	t_float distance_old;
  	
! 	Link(t_int n,const t_symbol *id,Mass<N> *m1,Mass<N> *m2,t_float k1,t_float d1,t_float d2,t_float lmin,t_float lmax)
  		: nbr(n),Id(id)
  		, mass1(m1),mass2(m2)
! 		, K1(k1),D1(d1),D2(d2)
  		, long_min(lmin),long_max(lmax)
  	{
! 		distance_old = longueur = Mass<N>::dist(*mass1,*mass2); // L[n-1]
! 
  		mass1->links.insert(this);
  		mass2->links.insert(this);
--- 166,227 ----
  	t_float longueur, long_min, long_max;
  	t_float distance_old;
+ 	t_float puissance;
+ 	t_int oriented; //0 : no, 1 : tangential, 2 : normal
+ 	t_float tdirection1[3], tdirection2[3];
  	
! 	Link(t_int n,const t_symbol *id,Mass<N> *m1,Mass<N> *m2,t_float k1,t_float d1, t_int o=0, t_float xa=0, t_float ya=0, t_float za=0,t_float pow=1, t_float lmin = 0,t_float lmax = 1e10)
  		: nbr(n),Id(id)
  		, mass1(m1),mass2(m2)
! 		, K1(k1),D1(d1),D2(0),oriented(o),puissance(pow)
  		, long_min(lmin),long_max(lmax)
  	{
! 		for (int i=0; i<3; i++)	{
! 			tdirection1[i] = 0;
! 			tdirection2[i] = 0;
! 			}
! 		if (oriented == 0)
! 			distance_old = longueur = Mass<N>::dist(*mass1,*mass2); // L[n-1]
! 		else if (oriented == 1)	{			// TANGENTIAL LINK
! 			const t_float norme = sqrt(sqr(xa)+sqr(ya)+sqr(za));
! 			tdirection1[0] = xa/norme;
! 			tdirection1[1] = ya/norme;
! 			tdirection1[2] = za/norme;
! 			distance_old = 0;
! 			for(int i = 0; i < N; ++i)	
! 				distance_old += sqr((m1->pos[i]-m2->pos[i])*tdirection1[i]);
! 			distance_old  = sqrt(distance_old);
! 			longueur = distance_old;
! 		}
! 		else if (oriented == 2)	{			// NORMAL LINK 2D
! 			if (N >= 2)	{
! 				const t_float norme = sqrt(sqr(xa)+sqr(ya));
! 				tdirection1[0]=ya/norme;
! 				tdirection1[1]=xa/norme;
! 				distance_old = 0;
! 				for(int i = 0; i < N; ++i)	
! 					distance_old += sqr((m1->pos[i]-m2->pos[i])*tdirection1[i]);
! 				if (N == 3)	{			// NORMAL LINK 3D
! 					if (xa == 0 && ya==0 && za!= 0)	{	// Special case
! 						tdirection1[0]=1;
! 						tdirection1[1]=0;
! 						tdirection1[2]=0;
! 						tdirection2[0]=0;
! 						tdirection2[1]=1;
! 						tdirection2[2]=0;
! 					}
! 					else	{				// Normal case
! 						const t_float norme2 = sqrt(sqr(xa*ya +za*xa)+sqr(xa*ya+za*ya)+sqr(sqr(xa)+sqr(ya)));
! 						tdirection2[0] = (xa*za+xa*ya)/norme2;
! 						tdirection2[1] = (xa*ya+za*ya)/norme2;
! 						tdirection2[2] = (sqr(xa)+sqr(ya))/norme2;
! 					}
! 					distance_old = 0;
! 					for(int i = 0; i < N; ++i)	
! 						distance_old += sqr((m1->pos[i]-m2->pos[i])*(tdirection1[i]+tdirection2[i]));
! 				}
! 				distance_old  = sqrt(distance_old);
! 				longueur = distance_old;			
! 			}
! 		}	
  		mass1->links.insert(this);
  		mass2->links.insert(this);
***************
*** 188,206 ****
  	inline void compute() 
  	{
  		Mass<N> *m1 = mass1,*m2 = mass2; // cache locally
! 		t_float distance = Mass<N>::dist(*m1,*m2); 
  		if (distance < long_min || distance > long_max || distance == 0) {
! 			for(int i = 0; i < N; ++i) {
! 				m1->force[i] -= D2 * m1->speed[i]; 	//  Fx1[n] = -Fx, Fx1[n] = Fx1[n] - D2 * vx1[n-1]
! 				m2->force[i] += D2 * m2->speed[i]; 	// Fx2[n] = Fx, Fx2[n] = Fx2[n] - D2 * vx2[n-1]
! 			}
  		}
! 		else {								// Lmin < L < Lmax
! 			const t_float F  = (K1 * (distance - longueur) + D1 * (distance - distance_old))/distance ;		// F[n] = k1 (L[n] - L[0])/L[n] + D1 (L[n] - L[n-1])/L[n]
! 			for(int i = 0; i < N; ++i) {
! 				const t_float Fn = F * (m1->pos[i] - m2->pos[i]); // Fx = F * Lx[n]/L[n]
! 				m1->force[i] -= Fn + D2 * m1->speed[i]; 	//  Fx1[n] = -Fx, Fx1[n] = Fx1[n] - D2 * vx1[n-1]
! 				m2->force[i] += Fn - D2 * m2->speed[i]; 	// Fx2[n] = Fx, Fx2[n] = Fx2[n] - D2 * vx2[n-1]
! 			}
  		}
  		
--- 237,286 ----
  	inline void compute() 
  	{
+ 		t_float distance=0;
+ 		t_float F;
  		Mass<N> *m1 = mass1,*m2 = mass2; // cache locally
! 		if (oriented == 0)	
! 			distance = Mass<N>::dist(*m1,*m2); 
! 		else if (oriented == 1) {
! 			for(int i = 0; i < N; ++i)	
! 				distance += sqr((m1->pos[i]-m2->pos[i])*tdirection1[i]);
! 			distance = sqrt(distance);
! 		}
! 		else if (oriented == 2) {
! 			for(int i = 0; i < N; ++i)	
! 				distance += sqr((m1->pos[i]-m2->pos[i])*(tdirection1[i] +tdirection2[i]));
! 			distance = sqrt(distance);
! 		}
! 
  		if (distance < long_min || distance > long_max || distance == 0) {
! //			for(int i = 0; i < N; ++i) {
! 	//			m1->force[i] -= D2 * m1->speed[i]; 	//  Fx1[n] = -Fx, Fx1[n] = Fx1[n] - D2 * vx1[n-1]
! 	//			m2->force[i] += D2 * m2->speed[i]; 	// Fx2[n] = Fx, Fx2[n] = Fx2[n] - D2 * vx2[n-1]
! 	//		}
  		}
! 		else {	// Lmin < L < Lmax
! 			// F[n] = k1 (L[n] - L[0])/L[n] + D1 (L[n] - L[n-1])/L[n]
! 			if ((distance - longueur)>0)
! 				F  = (K1 * pow(distance - longueur,puissance) + D1 * (distance - distance_old))/distance ;
! 			else
! 				F  = (-K1 * pow(longueur - distance,puissance) + D1 * (distance - distance_old))/distance ;
! 			if (oriented == 0)	
! 				for(int i = 0; i < N; ++i) {
! 					const t_float Fn = F * (m1->pos[i] - m2->pos[i]); // Fx = F * Lx[n]/L[n]
! 					m1->force[i] -= Fn + D2 * m1->speed[i]; 	//  Fx1[n] = -Fx, Fx1[n] = Fx1[n] - D2 * vx1[n-1]
! 					m2->force[i] += Fn - D2 * m2->speed[i]; 	// Fx2[n] = Fx, Fx2[n] = Fx2[n] - D2 * vx2[n-1]
! 				}
! 			else if (oriented == 1 || (oriented == 2 && N == 2))
! 				for(int i = 0; i < N; ++i) {
! 					const t_float Fn = F * (m1->pos[i] - m2->pos[i])*tdirection1[i]; // Fx = F * Lx[n]/L[n]
! 					m1->force[i] -= Fn + D2 * m1->speed[i]; 	//  Fx1[n] = -Fx, Fx1[n] = Fx1[n] - D2 * vx1[n-1]
! 					m2->force[i] += Fn - D2 * m2->speed[i]; 	// Fx2[n] = Fx, Fx2[n] = Fx2[n] - D2 * vx2[n-1]
! 				}
! 			else if (oriented == 2 && N == 3)
! 				for(int i = 0; i < N; ++i) {
! 					const t_float Fn = F * (m1->pos[i] - m2->pos[i])*(tdirection1[i] +tdirection2[i]); // Fx = F * Lx[n]/L[n]
! 					m1->force[i] -= Fn + D2 * m1->speed[i]; 	//  Fx1[n] = -Fx, Fx1[n] = Fx1[n] - D2 * vx1[n-1]
! 					m2->force[i] += Fn - D2 * m2->speed[i]; 	// Fx2[n] = Fx, Fx2[n] = Fx2[n] - D2 * vx2[n-1]
! 				}
  		}
  		
***************
*** 450,463 ****
  	{
  		if (argc != 1) {
! 			error("%s - %s Syntax : Idmass",thisName(),GetString(thisTag()));
  			return;
  		}
! 	
! 		t_mass *m = mass.find(GetAInt(argv[0]));
! 		if(m) 
! 			if(mob) m->setMobile(); 
! 			else m->setFixed();
! 		else
! 			error("%s - %s : Index not found",thisName(),GetString(thisTag()));
  	}
  
--- 530,553 ----
  	{
  		if (argc != 1) {
! 			error("%s - %s Syntax : Id/Nomass",thisName(),GetString(thisTag()));
  			return;
  		}
! 		if(IsSymbol(argv[0])) {
! 			typename IDMap<t_mass *>::iterator it;
! 			if(mob)
! 				for(it = massids.find(GetSymbol(argv[0])); it; ++it)
! 					it.data()->setMobile();
! 			else
! 				for(it = massids.find(GetSymbol(argv[0])); it; ++it)
! 					it.data()->setFixed();
! 		}
! 		else {	
! 			t_mass *m = mass.find(GetAInt(argv[0]));
! 			if(m) 
! 				if(mob) m->setMobile(); 
! 				else m->setFixed();
! 			else
! 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 		}
  	}
  
***************
*** 531,540 ****
  					}
  				}
- 	
- 
  			}
  			
  			// Set fixed if mobile
! 			mobil = mass.find(nearest_mass)->M;
  			SetInt(aux2[0],nearest_mass);
  			if (mobil != 0)
--- 621,628 ----
  					}
  				}
  			}
  			
  			// Set fixed if mobile
! 			mobil = mass.find(nearest_mass)->invM;
  			SetInt(aux2[0],nearest_mass);
  			if (mobil != 0)
***************
*** 566,598 ****
  	void m_link(int argc,t_atom *argv) 
  	{
! 		if (argc < 6 || argc > 8) {
! 			error("%s - %s Syntax : Id Nomass1 Nomass2 K D1 D2 (Lmin Lmax)",thisName(),GetString(thisTag()));
  			return;
  		}
! 		
! 		t_mass *mass1 = mass.find(GetAInt(argv[1]));
! 		t_mass *mass2 = mass.find(GetAInt(argv[2]));
!  
!       	if(!mass1 || !mass2) {
! 			error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 			return;
  		}
  
! 		t_link *l = new t_link(
! 			id_link,
! 			GetSymbol(argv[0]), // ID
! 			mass1,mass2, // pointer to mass1, mass2
! 			GetAFloat(argv[3]), // K1
! 			GetAFloat(argv[4]), // D1
! 			GetAFloat(argv[5]), // D2
! 			argc >= 7?GetFloat(argv[6]):0,
! 			argc >= 8?GetFloat(argv[7]):32768
! 		);
! 
! 		linkids.insert(l);
! 		link.insert(id_link++,l);
! 		outlink(S_Link,l);
  	}
- 
  	// add interactor link
  	// Id, Id masses1, Id masses2, K1, D1, D2, (Lmin, Lmax)
--- 654,752 ----
  	void m_link(int argc,t_atom *argv) 
  	{
! 		if (argc < 5 || argc > 8) {
! 			error("%s - %s Syntax : Id No/Idmass1 No/Idmass2 K D1 (pow Lmin Lmax)",thisName(),GetString(thisTag()));
  			return;
  		}
! 		if (IsSymbol(argv[1]) && IsSymbol(argv[2]))	{		// ID & ID
! 			typename IDMap<t_mass *>::iterator it1,it2,it;
! 			it1 = massids.find(GetSymbol(argv[1]));
! 			it2 = massids.find(GetSymbol(argv[2]));
! 			for(; it1; ++it1) {
! 				for(it = it2; it; ++it) {
! 					t_link *l = new t_link(
! 						id_link,
! 						GetSymbol(argv[0]), // ID
! 						it1.data(),it.data(), // pointer to mass1, mass2
! 						GetAFloat(argv[3]), // K1
! 						GetAFloat(argv[4]), // D1
! 						0,0,0,0,
! 						argc >= 6?GetFloat(argv[5]):1, // power
! 						argc >= 7?GetFloat(argv[6]):0,
! 						argc >= 8?GetFloat(argv[7]):1e10
! 					);
! 					linkids.insert(l);
! 					link.insert(id_link++,l);
! 					outlink(S_iLink,l);
! 				}
! 			}
  		}
+ 		else if (IsSymbol(argv[1])==0 && IsSymbol(argv[2]))	{	// No & ID
+ 			typename IDMap<t_mass *>::iterator it2,it;
+ 	 		t_mass *mass1 = mass.find(GetAInt(argv[1]));
+ 			it2 = massids.find(GetSymbol(argv[2]));
+ 			for(it = it2; it; ++it) {
+ 				t_link *l = new t_link(
+ 					id_link,
+ 					GetSymbol(argv[0]), // ID
+ 					mass1,it.data(), // pointer to mass1, mass2
+ 					GetAFloat(argv[3]), // K1
+ 					GetAFloat(argv[4]), // D1
+ 					0,0,0,0,
+ 					argc >= 6?GetFloat(argv[5]):1, // power
+ 					argc >= 7?GetFloat(argv[6]):0,
+ 					argc >= 8?GetFloat(argv[7]):1e10
+ 				);
+ 				linkids.insert(l);
+ 				link.insert(id_link++,l);
+ 				outlink(S_iLink,l);
+ 			}
+ 		}
+ 		else if (IsSymbol(argv[1]) && IsSymbol(argv[2])==0)	{	// ID & No
+ 			typename IDMap<t_mass *>::iterator it1,it;
+ 			it1 = massids.find(GetSymbol(argv[1]));
+ 	 		t_mass *mass2 = mass.find(GetAInt(argv[2]));
+ 			for(it = it1; it; ++it) {
+ 				t_link *l = new t_link(
+ 					id_link,
+ 					GetSymbol(argv[0]), // ID
+ 					it.data(),mass2, // pointer to mass1, mass2
+ 					GetAFloat(argv[3]), // K1
+ 					GetAFloat(argv[4]), // D1
+ 					0,0,0,0,
+ 					argc >= 6?GetFloat(argv[5]):1, // power
+ 					argc >= 7?GetFloat(argv[6]):0,
+ 					argc >= 8?GetFloat(argv[7]):1e10
+ 				);
+ 				linkids.insert(l);
+ 				link.insert(id_link++,l);
+ 				outlink(S_iLink,l);
+ 			}
+ 		}
+ 		else	{										// No & No
+ 	 		t_mass *mass1 = mass.find(GetAInt(argv[1]));
+ 			t_mass *mass2 = mass.find(GetAInt(argv[2]));
+  	
+    			if(!mass1 || !mass2) {
+ 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
+ 				return;
+ 			}
+ 	
+ 			t_link *l = new t_link(
+ 				id_link,
+ 				GetSymbol(argv[0]), // ID
+ 				mass1,mass2, // pointer to mass1, mass2
+ 				GetAFloat(argv[3]), // K1
+ 				GetAFloat(argv[4]), // D1
+ 				0,0,0,0,
+ 				argc >= 6?GetFloat(argv[5]):1, // power
+ 				argc >= 7?GetFloat(argv[6]):0,	// Lmin
+ 				argc >= 8?GetFloat(argv[7]):1e10// Lmax
+ 			);
  
! 			linkids.insert(l);
! 			link.insert(id_link++,l);
! 			outlink(S_Link,l);
! 		}
  	}
  	// add interactor link
  	// Id, Id masses1, Id masses2, K1, D1, D2, (Lmin, Lmax)
***************
*** 600,604 ****
  	{
  		if (argc < 6 || argc > 8) {
! 			error("%s - %s Syntax : Id Idmass1 Idmass2 K D1 D2 (Lmin Lmax)",thisName(),GetString(thisTag()));
  			return;
  		}
--- 754,758 ----
  	{
  		if (argc < 6 || argc > 8) {
! 			error("%s - %s Syntax : Id Idmass1 Idmass2 K D1 (pow Lmin Lmax)",thisName(),GetString(thisTag()));
  			return;
  		}
***************
*** 616,657 ****
  					GetAFloat(argv[3]), // K1
  					GetAFloat(argv[4]), // D1
! 					GetAFloat(argv[5]), // D2
  					argc >= 7?GetFloat(argv[6]):0,
! 					argc >= 8?GetFloat(argv[7]):32768
  				);
  
  				linkids.insert(l);
  				link.insert(id_link++,l);
! 				outlink(S_Link,l);
  			}
  		}
  	}
  
! 	// set rigidity of link(s) named Id
  	void m_setK(int argc,t_atom *argv) 
  	{
  		if (argc != 2) {
! 			error("%s - %s Syntax : IdLink Value",thisName(),GetString(thisTag()));
  			return;
  		}
  
! 		t_float k1 = GetAFloat(argv[1]);
! 		typename IDMap<t_link *>::iterator it;
! 		for(it = linkids.find(GetSymbol(argv[0])); it; ++it)
! 			it.data()->K1 = k1;
  	}
  
! 	// set damping of link(s) named Id
  	void m_setD(int argc,t_atom *argv) 
  	{
  		if (argc != 2) {
! 			error("%s - %s Syntax : IdLink Value",thisName(),GetString(thisTag()));
  			return;
  		}
  
! 		t_float d1 = GetAFloat(argv[1]);
! 		typename IDMap<t_link *>::iterator it;
! 		for(it = linkids.find(GetSymbol(argv[0])); it; ++it)
! 			it.data()->D1 = d1;
  	}
  
--- 770,1072 ----
  					GetAFloat(argv[3]), // K1
  					GetAFloat(argv[4]), // D1
! 					0,0,0,0,
! 					argc >= 6?GetFloat(argv[5]):1, // power
  					argc >= 7?GetFloat(argv[6]):0,
! 					argc >= 8?GetFloat(argv[7]):1e10
  				);
  
  				linkids.insert(l);
  				link.insert(id_link++,l);
! 				outlink(S_iLink,l);
  			}
  		}
  	}
  
! 	// add a tangential link
! 	// Id, *mass1, *mass2, K1, D1, D2, (Lmin,Lmax)
! 	void m_tlink(int argc,t_atom *argv) 
! 	{
! 		if (argc < 5+N || argc > 8+N) {
! 			error("%s - %s Syntax : Id Nomass1 Nomass2 K D1 xa%s%s (pow Lmin Lmax)",thisName(),GetString(thisTag()),N >= 2?" ya":"",N >= 3?" za":"");
! 			return;
! 		}
! 
! 		if (IsSymbol(argv[1]) && IsSymbol(argv[2]))	{		// ID & ID
! 			typename IDMap<t_mass *>::iterator it1,it2,it;
! 			it1 = massids.find(GetSymbol(argv[1]));
! 			it2 = massids.find(GetSymbol(argv[2]));
! 			for(; it1; ++it1) {
! 				for(it = it2; it; ++it) {
! 					t_link *l = new t_link(
! 						id_link,
! 						GetSymbol(argv[0]), // ID
! 						it1.data(),it.data(), // pointer to mass1, mass2
! 						GetAFloat(argv[3]), // K1
! 						GetAFloat(argv[4]), // D1
! 						1,					// tangential
! 						GetAFloat(argv[5]),N >= 2?GetAFloat(argv[6]):0,N >= 3?GetAFloat(argv[7]):0,	// vector
! 						(N==1 && argc >= 7)?GetFloat(argv[6]):((N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1)), // power
! 						(N==1 && argc >= 8)?GetFloat(argv[7]):((N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0)),	// Lmin
! 						(N==1 && argc >= 9)?GetFloat(argv[8]):((N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10))// Lmax
! 
! 					);
! 					linkids.insert(l);
! 					link.insert(id_link++,l);
! 					outlink(S_iLink,l);
! 				}
! 			}
! 		}
! 		else if (IsSymbol(argv[1])==0 && IsSymbol(argv[2]))	{	// No & ID
! 			typename IDMap<t_mass *>::iterator it2,it;
! 	 		t_mass *mass1 = mass.find(GetAInt(argv[1]));
! 			it2 = massids.find(GetSymbol(argv[2]));
! 			for(it = it2; it; ++it) {
! 				t_link *l = new t_link(
! 					id_link,
! 					GetSymbol(argv[0]), // ID
! 					mass1,it.data(), // pointer to mass1, mass2
! 					GetAFloat(argv[3]), // K1
! 					GetAFloat(argv[4]), // D1
! 					1,					// tangential
! 					GetAFloat(argv[5]),N >= 2?GetAFloat(argv[6]):0,N >= 3?GetAFloat(argv[7]):0,	// vector
! 					(N==1 && argc >= 7)?GetFloat(argv[6]):((N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1)), // power
! 					(N==1 && argc >= 8)?GetFloat(argv[7]):((N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0)),	// Lmin
! 					(N==1 && argc >= 9)?GetFloat(argv[8]):((N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10))// Lmax
! 				);
! 				linkids.insert(l);
! 				link.insert(id_link++,l);
! 				outlink(S_iLink,l);
! 			}
! 		}
! 		else if (IsSymbol(argv[1]) && IsSymbol(argv[2])==0)	{	// ID & No
! 			typename IDMap<t_mass *>::iterator it1,it;
! 			it1 = massids.find(GetSymbol(argv[1]));
! 	 		t_mass *mass2 = mass.find(GetAInt(argv[2]));
! 			for(it = it1; it; ++it) {
! 				t_link *l = new t_link(
! 					id_link,
! 					GetSymbol(argv[0]), // ID
! 					it.data(),mass2, // pointer to mass1, mass2
! 					GetAFloat(argv[3]), // K1
! 					GetAFloat(argv[4]), // D1
! 					1,					// tangential
! 					GetAFloat(argv[5]),N >= 2?GetAFloat(argv[6]):0,N >= 3?GetAFloat(argv[7]):0,	// vector
! 					(N==1 && argc >= 7)?GetFloat(argv[6]):((N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1)), // power
! 					(N==1 && argc >= 8)?GetFloat(argv[7]):((N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0)),	// Lmin
! 					(N==1 && argc >= 9)?GetFloat(argv[8]):((N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10))// Lmax
! 				);
! 				linkids.insert(l);
! 				link.insert(id_link++,l);
! 				outlink(S_iLink,l);
! 			}
! 		}
! 		else	{										// No & No
! 			t_mass *mass1 = mass.find(GetAInt(argv[1]));
! 			t_mass *mass2 = mass.find(GetAInt(argv[2]));
!  
!    			if(!mass1 || !mass2) {
! 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 				return;
! 			}
! 			t_link *l = new t_link(
! 				id_link,
! 				GetSymbol(argv[0]), // ID
! 				mass1,mass2, // pointer to mass1, mass2
! 				GetAFloat(argv[3]), // K1
! 				GetAFloat(argv[4]), // D1
! 				1,					// tangential
! 				GetAFloat(argv[5]),N >= 2?GetAFloat(argv[6]):0,N >= 3?GetAFloat(argv[7]):0,	// vector
! 				(N==1 && argc >= 7)?GetFloat(argv[6]):((N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1)), // power
! 				(N==1 && argc >= 8)?GetFloat(argv[7]):((N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0)),	// Lmin
! 				(N==1 && argc >= 9)?GetFloat(argv[8]):((N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10))// Lmax
! 			);
! 			linkids.insert(l);
! 			link.insert(id_link++,l);
! 			outlink(S_tLink,l);
! 		}
! 	}
! 
! 	// add a normal link
! 	// Id, *mass1, *mass2, K1, D1, D2, (Lmin,Lmax)
! 	void m_nlink(int argc,t_atom *argv) 
! 	{
! 		if (argc < 5+N || argc > 8+N) {
! 			error("%s - %s Syntax : Id No/Idmass1 No/Idmass2 K D1 xa%s%s (pow Lmin Lmax)",thisName(),GetString(thisTag()),N >= 2?" ya":"",N >= 3?" za":"");
! 			return;
! 		}
! 
! 		if (N==1)	{
! 			error("%s - %s : No normal Link in 1D",thisName(),GetString(thisTag()));
! 			return;
! 		}
! 		if (IsSymbol(argv[1]) && IsSymbol(argv[2]))	{		// ID & ID
! 			typename IDMap<t_mass *>::iterator it1,it2,it;
! 			it1 = massids.find(GetSymbol(argv[1]));
! 			it2 = massids.find(GetSymbol(argv[2]));
! 			for(; it1; ++it1) {
! 				for(it = it2; it; ++it) {
! 					t_link *l = new t_link(
! 						id_link,
! 						GetSymbol(argv[0]), // ID
! 						it1.data(),it.data(), // pointer to mass1, mass2
! 						GetAFloat(argv[3]), // K1
! 						GetAFloat(argv[4]), // D1
! 						2,					// normal
! 						GetAFloat(argv[5]),GetAFloat(argv[6]),N >= 3?GetAFloat(argv[7]):0,	// vector
! 						(N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1),	// pow
! 						(N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0),	// Lmin
! 						(N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10)// Lmax
! 					);
! 					linkids.insert(l);
! 					link.insert(id_link++,l);
! 					outlink(S_nLink,l);
! 				}
! 			}
! 		}
! 		else if (IsSymbol(argv[1])==0 && IsSymbol(argv[2]))	{	// No & ID
! 			typename IDMap<t_mass *>::iterator it2,it;
! 	 		t_mass *mass1 = mass.find(GetAInt(argv[1]));
! 			it2 = massids.find(GetSymbol(argv[2]));
! 			for(it = it2; it; ++it) {
! 				t_link *l = new t_link(
! 					id_link,
! 					GetSymbol(argv[0]), // ID
! 					mass1,it.data(), // pointer to mass1, mass2
! 					GetAFloat(argv[3]), // K1
! 					GetAFloat(argv[4]), // D1
! 					2,					// normal
! 					GetAFloat(argv[5]),GetAFloat(argv[6]),N >= 3?GetAFloat(argv[7]):0,	// vector
! 					(N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1),	// pow
! 					(N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0),	// Lmin
! 					(N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10)// Lmax
! 				);
! 				linkids.insert(l);
! 				link.insert(id_link++,l);
! 				outlink(S_nLink,l);
! 			}
! 		}
! 		else if (IsSymbol(argv[1]) && IsSymbol(argv[2])==0)	{	// ID & No
! 			typename IDMap<t_mass *>::iterator it1,it;
! 			it1 = massids.find(GetSymbol(argv[1]));
! 	 		t_mass *mass2 = mass.find(GetAInt(argv[2]));
! 			for(it = it1; it; ++it) {
! 				t_link *l = new t_link(
! 					id_link,
! 					GetSymbol(argv[0]), // ID
! 					it.data(),mass2, // pointer to mass1, mass2
! 					GetAFloat(argv[3]), // K1
! 					GetAFloat(argv[4]), // D1
! 					2,					// normal
! 					GetAFloat(argv[5]),GetAFloat(argv[6]),N >= 3?GetAFloat(argv[7]):0,	// vector
! 					(N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1),	// pow
! 					(N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0),	// Lmin
! 					(N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10)// Lmax
! 				);
! 				linkids.insert(l);
! 				link.insert(id_link++,l);
! 				outlink(S_nLink,l);
! 			}
! 		}
! 		else	{										// No & No
! 			t_mass *mass1 = mass.find(GetAInt(argv[1]));
! 			t_mass *mass2 = mass.find(GetAInt(argv[2]));
!  	
!    			if(!mass1 || !mass2) {
! 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 				return;
! 			}
! 
! 			t_link *l = new t_link(
! 				id_link,
! 				GetSymbol(argv[0]), // ID
! 				mass1,mass2, // pointer to mass1, mass2
! 				GetAFloat(argv[3]), // K1
! 				GetAFloat(argv[4]), // D1
! 				2,					// normal
! 				GetAFloat(argv[5]),GetAFloat(argv[6]),N >= 3?GetAFloat(argv[7]):0,	// vector
! 				(N==2 && argc >= 8)?GetFloat(argv[7]):((N==3 && argc >= 9)?GetFloat(argv[8]):1),	// pow
! 				(N==2 && argc >= 9)?GetFloat(argv[8]):((N==3 && argc >= 10)?GetFloat(argv[9]):0),	// Lmin
! 				(N==2 && argc >= 10)?GetFloat(argv[9]):((N==3 && argc >= 11)?GetFloat(argv[10]):1e10)// Lmax
! 			);
! 			linkids.insert(l);
! 			link.insert(id_link++,l);
! 			outlink(S_nLink,l);
! 		}
! 	}
! 
! 	// set rigidity of link(s) named Id or number No
  	void m_setK(int argc,t_atom *argv) 
  	{
  		if (argc != 2) {
! 			error("%s - %s Syntax : Id/NoLink Value",thisName(),GetString(thisTag()));
  			return;
  		}
  
! 		const t_float k1 = GetAFloat(argv[1]);
! 
! 		if(IsSymbol(argv[0])) {
! 			typename IDMap<t_link *>::iterator it;
! 			for(it = linkids.find(GetSymbol(argv[0])); it; ++it)
! 				it.data()->K1 = k1;
! 		}
! 		else	{
! 			t_link *l = link.find(GetAInt(argv[0]));
! 			if(l)
! 				l->K1 = k1;
! 			else
! 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 		}
  	}
  
! 	// set damping of link(s) named Id or number No
  	void m_setD(int argc,t_atom *argv) 
  	{
  		if (argc != 2) {
! 			error("%s - %s Syntax : Id/NoLink Value",thisName(),GetString(thisTag()));
  			return;
  		}
  
! 		const t_float d1 = GetAFloat(argv[1]);
! 
! 		if(IsSymbol(argv[0])) {
! 			typename IDMap<t_link *>::iterator it;
! 			for(it = linkids.find(GetSymbol(argv[0])); it; ++it)
! 				it.data()->D1 = d1;
! 		}
! 		else	{
! 			t_link *l = link.find(GetAInt(argv[0]));
! 			if(l)
! 				l->D1 = d1;
! 			else
! 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 		}
! 	}
! 
! 	// set initial lenght of link(s) named Id or number No
! 	void m_setL(int argc,t_atom *argv) 
! 	{
! 		if (argc != 2) {
! 			error("%s - %s Syntax : Id/NoLink Value",thisName(),GetString(thisTag()));
! 			return;
! 		}
! 
! 		const t_float lon = GetAFloat(argv[1]);
! 
! 		if(IsSymbol(argv[0])) {
! 			typename IDMap<t_link *>::iterator it;
! 			for(it = linkids.find(GetSymbol(argv[0])); it; ++it) {
! 				it.data()->longueur = lon;
! 				it.data()->distance_old = lon;
! 			}
! 		}
! 		else	{
! 			t_link *l = link.find(GetAInt(argv[0]));
! 			if(l) {
! 				l->longueur = lon;
! 				l->distance_old = lon;
! 			}
! 			else
! 				error("%s - %s : Index not found",thisName(),GetString(thisTag()));
! 		}
  	}
  
***************
*** 674,678 ****
  	{
  		if (argc != 1) {
! 			error("%s - %s Syntax : NoLink",thisName(),GetString(thisTag()));
  			return;
  		}
--- 1089,1093 ----
  	{
  		if (argc != 1) {
! 			error("%s - %s Syntax : NtLink",thisName(),GetString(thisTag()));
  			return;
  		}
***************
*** 942,946 ****
  		massids.reset();
  		mass.reset();
! 		
  		id_mass = id_link = mouse_grab = mass_deleted = link_deleted = 0;
  	}
--- 1357,1361 ----
  		massids.reset();
  		mass.reset();
! 		// Reset state variables 		
  		id_mass = id_link = mouse_grab = mass_deleted = link_deleted = 0;
  	}
***************
*** 967,971 ****
  	void outlink(const t_symbol *s,const t_link *l)
  	{
! 		t_atom sortie[7];
  		SetInt((sortie[0]),l->nbr);
  		SetSymbol((sortie[1]),l->Id);
--- 1382,1387 ----
  	void outlink(const t_symbol *s,const t_link *l)
  	{
! 		t_atom sortie[15];
! 		int size=6;
  		SetInt((sortie[0]),l->nbr);
  		SetSymbol((sortie[1]),l->Id);
***************
*** 974,979 ****
  		SetFloat((sortie[4]),l->K1);
  		SetFloat((sortie[5]),l->D1);
! 		SetFloat((sortie[6]),l->D2);
! 		ToOutAnything(1,s,7,sortie);
  	}
  	
--- 1390,1428 ----
  		SetFloat((sortie[4]),l->K1);
  		SetFloat((sortie[5]),l->D1);
! 
! 		if (l->oriented == 1 ||(l->oriented == 2 && N ==2))	{
! 			for (int i=0; i<N; i++)
! 				SetFloat((sortie[6+i]),l->tdirection1[i]);
! //			ToOutAnything(1,s,6+N,sortie);
! 			size = 6+N;
! 		}
! 		else if (l->oriented == 2 && N==3)	{
! 			for (int i=0; i<N; i++)	{
! 				SetFloat((sortie[6+i]),l->tdirection1[i]);
! 				SetFloat((sortie[6+i+N]),l->tdirection2[i]);	
! 			}			
! //			ToOutAnything(1,s,6+2*N,sortie);
! 			size = 6+2*N;
! 		}
! 
! 		if(l->long_max != 1e10)	{
! 			SetFloat((sortie[size]),l->puissance);
! 			size++;
! 			SetFloat((sortie[size]),l->long_min);
! 			size++;
! 			SetFloat((sortie[size]),l->long_max);
! 			size++;
! 		}
! 		else if(l->long_min != 0) {
! 			SetFloat((sortie[size]),l->puissance);
! 			size++;
! 			SetFloat((sortie[size]),l->long_min);
! 			size++;
! 		}
! 		else if(l->puissance != 1)	{
! 			SetFloat((sortie[size]),l->puissance);
! 			size++;
! 		}
! 		ToOutAnything(1,s,size,sortie);
  	}
  	
***************
*** 984,987 ****
--- 1433,1438 ----
  	const static t_symbol *S_Link;
  	const static t_symbol *S_iLink;
+ 	const static t_symbol *S_tLink;
+ 	const static t_symbol *S_nLink;
  	const static t_symbol *S_Mass_deleted;
  	const static t_symbol *S_Link_deleted;
***************
*** 1010,1013 ****
--- 1461,1466 ----
  		S_Link = MakeSymbol("Link");
  		S_iLink = MakeSymbol("iLink");
+ 		S_tLink = MakeSymbol("tLink");
+ 		S_nLink = MakeSymbol("nLink");
  		S_Mass_deleted = MakeSymbol("Mass deleted");
  		S_Link_deleted = MakeSymbol("Link deleted");
***************
*** 1066,1073 ****
--- 1519,1529 ----
  		FLEXT_CADDMETHOD_(c,0,"setK",m_setK);
  		FLEXT_CADDMETHOD_(c,0,"setD",m_setD);
+ 		FLEXT_CADDMETHOD_(c,0,"setL",m_setL);
  		FLEXT_CADDMETHOD_(c,0,"setD2",m_setD2);
  		FLEXT_CADDMETHOD_(c,0,"mass",m_mass);
  		FLEXT_CADDMETHOD_(c,0,"link",m_link);
  		FLEXT_CADDMETHOD_(c,0,"iLink",m_ilink);
+ 		FLEXT_CADDMETHOD_(c,0,"tLink",m_tlink);
+ 		FLEXT_CADDMETHOD_(c,0,"nLink",m_nlink);
  		FLEXT_CADDMETHOD_(c,0,"get",m_get);
  		FLEXT_CADDMETHOD_(c,0,"deleteLink",m_delete_link);
***************
*** 1091,1094 ****
--- 1547,1552 ----
  	FLEXT_CALLBACK_V(m_link)
  	FLEXT_CALLBACK_V(m_ilink)
+ 	FLEXT_CALLBACK_V(m_tlink)
+ 	FLEXT_CALLBACK_V(m_nlink)
  	FLEXT_CALLBACK_V(m_Xmax)
  	FLEXT_CALLBACK_V(m_Xmin)
***************
*** 1105,1108 ****
--- 1563,1567 ----
  	FLEXT_CALLBACK_V(m_setK)
  	FLEXT_CALLBACK_V(m_setD)
+ 	FLEXT_CALLBACK_V(m_setL)
  	FLEXT_CALLBACK_V(m_setD2)
  	FLEXT_CALLBACK_V(m_get)
***************
*** 1117,1121 ****
  const t_symbol \
  	*msdN<N>::S_Reset,*msdN<N>::S_Mass, \
! 	*msdN<N>::S_Link,*msdN<N>::S_iLink, \
  	*msdN<N>::S_Mass_deleted,*msdN<N>::S_Link_deleted, \
  	*msdN<N>::S_massesPos,*msdN<N>::S_massesPosNo,*msdN<N>::S_massesPosId, \
--- 1576,1580 ----
  const t_symbol \
  	*msdN<N>::S_Reset,*msdN<N>::S_Mass, \
! 	*msdN<N>::S_Link,*msdN<N>::S_iLink,*msdN<N>::S_tLink,*msdN<N>::S_nLink, \
  	*msdN<N>::S_Mass_deleted,*msdN<N>::S_Link_deleted, \
  	*msdN<N>::S_massesPos,*msdN<N>::S_massesPosNo,*msdN<N>::S_massesPosId, \





More information about the Pd-cvs mailing list