From db5e740e71533831081b7b9280aa19f5c01e987e Mon Sep 17 00:00:00 2001
From: "N.N." <nimon@users.sourceforge.net>
Date: Wed, 26 Jul 2006 15:03:48 +0000
Subject: *** empty log message ***

svn path=/trunk/externals/nusmuk/; revision=5415
---
 msd.h             | 101 ++++++++++++++++++++++++++++++++++--------------------
 msd/03_msdwave.pd |  14 ++++----
 2 files changed, 70 insertions(+), 45 deletions(-)

diff --git a/msd.h b/msd.h
index 6c43960..6a26b45 100644
--- a/msd.h
+++ b/msd.h
@@ -12,7 +12,7 @@
  Based on Pure Data by Miller Puckette and others
  Based on pmpd by Cyrille Henry 
 
- Contact : Nicolas Montgermont, montgermont@la-kitchen.fr
+ Contact : Nicolas Montgermont, nicolas@basseslumieres.org
 	   Cyrille Henry, Cyrille.Henry@la-kitchen.fr
 
  This library is free software; you can redistribute it and/or
@@ -29,7 +29,7 @@
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
- Version 0.07 -- 17.05.2005
+ Version 0.08 -- 26.07.2006
 */
 
 // include flext header
@@ -167,32 +167,35 @@ public:
 	t_float distance_old;
 	t_float puissance;
 	t_int oriented; //0 : no, 1 : tangential, 2 : normal
-	t_float tdirection1[3], tdirection2[3];
+	t_float tdirection1[N], tdirection2[N];
 	
-	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)
+	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 tangent[N]=NULL,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++)	{
+		for (int i=0; i<N; 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;
+			t_float norme = 0;
+			for(int i = 0; i < N; ++i) norme += sqr(tangent[i]);
+			norme = sqrt(norme);
+			//t_float norme = sqrt(sqr(xa)+sqr(ya)+sqr(za));
+			for(int i = 0; i < N; ++i)tdirection1[i] = tangent[i]/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
+		/*else if (oriented == 2)	{			// NORMAL LINK 2D
 			if (N >= 2)	{
 				const t_float norme = sqrt(sqr(xa)+sqr(ya));
 				tdirection1[0]=ya/norme;
@@ -222,7 +225,7 @@ public:
 				distance_old  = sqrt(distance_old);
 				longueur = distance_old;			
 			}
-		}	
+		}*/	
 		mass1->links.insert(this);
 		mass2->links.insert(this);
 	}
@@ -746,7 +749,7 @@ protected:
 						it1.data(),it.data(), // pointer to mass1, mass2
 						GetAFloat(argv[3]), // K1
 						GetAFloat(argv[4]), // D1
-						0,0,0,0,
+						0,NULL,
 						argc >= 6?GetFloat(argv[5]):1, // power
 						argc >= 7?GetFloat(argv[6]):0,
 						argc >= 8?GetFloat(argv[7]):1e10
@@ -768,7 +771,7 @@ protected:
 					mass1,it.data(), // pointer to mass1, mass2
 					GetAFloat(argv[3]), // K1
 					GetAFloat(argv[4]), // D1
-					0,0,0,0,
+					0,NULL,
 					argc >= 6?GetFloat(argv[5]):1, // power
 					argc >= 7?GetFloat(argv[6]):0,
 					argc >= 8?GetFloat(argv[7]):1e10
@@ -789,7 +792,7 @@ protected:
 					it.data(),mass2, // pointer to mass1, mass2
 					GetAFloat(argv[3]), // K1
 					GetAFloat(argv[4]), // D1
-					0,0,0,0,
+					0,NULL,
 					argc >= 6?GetFloat(argv[5]):1, // power
 					argc >= 7?GetFloat(argv[6]):0,
 					argc >= 8?GetFloat(argv[7]):1e10
@@ -814,7 +817,7 @@ protected:
 				mass1,mass2, // pointer to mass1, mass2
 				GetAFloat(argv[3]), // K1
 				GetAFloat(argv[4]), // D1
-				0,0,0,0,
+				0,NULL,
 				argc >= 6?GetFloat(argv[5]):1, // power
 				argc >= 7?GetFloat(argv[6]):0,	// Lmin
 				argc >= 8?GetFloat(argv[7]):1e10// Lmax
@@ -846,7 +849,7 @@ protected:
 					it1.data(),it.data(), // pointer to mass1, mass2
 					GetAFloat(argv[3]), // K1
 					GetAFloat(argv[4]), // D1
-					0,0,0,0,
+					0,NULL,
 					argc >= 6?GetFloat(argv[5]):1, // power
 					argc >= 7?GetFloat(argv[6]):0,
 					argc >= 8?GetFloat(argv[7]):1e10
@@ -867,6 +870,8 @@ protected:
 			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;
 		}
+		t_float tangent[N];
+		for(int i = 0; i < N; ++i) tangent[i] = GetAFloat(argv[5+i]);
 
 		if (IsSymbol(argv[1]) && IsSymbol(argv[2]))	{		// ID & ID
 			typename IDMap<t_mass *>::iterator it1,it2,it;
@@ -881,10 +886,15 @@ protected:
 						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
+						tangent,
+						argc >= 6+N?GetFloat(argv[5+N]):1, // power
+						argc >= 7+N?GetFloat(argv[6+N]):0, // Lmin
+						argc >= 8+N?GetFloat(argv[7+N]):1e10 // Lmax
+
+//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);
@@ -905,14 +915,19 @@ protected:
 					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
+					tangent,
+					argc >= 6+N?GetFloat(argv[5+N]):1, // power
+					argc >= 7+N?GetFloat(argv[6+N]):0, // Lmin
+					argc >= 8+N?GetFloat(argv[7+N]):1e10 // Lmax
+
+					//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);
+				outlink(S_tLink,l);
 			}
 		}
 		else if (IsSymbol(argv[1]) && IsSymbol(argv[2])==0)	{	// ID & No
@@ -926,15 +941,20 @@ protected:
 					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
+					1,
+					tangent,					// tangential
+					argc >= 6+N?GetFloat(argv[5+N]):1, // power
+					argc >= 7+N?GetFloat(argv[6+N]):0, // Lmin
+					argc >= 8+N?GetFloat(argv[7+N]):1e10 // Lmax
+
+					//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);
+				outlink(S_tLink,l);
 			}
 		}
 		else	{										// No & No
@@ -952,11 +972,16 @@ protected:
 				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
-			);
+				tangent,					// tangential
+				argc >= 6+N?GetFloat(argv[5+N]):1, // power
+				argc >= 7+N?GetFloat(argv[6+N]):0, // Lmin
+				argc >= 8+N?GetFloat(argv[7+N]):1e10 // Lmax
+
+				//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);
@@ -966,7 +991,7 @@ protected:
 	// 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;
@@ -1069,7 +1094,7 @@ protected:
 			link.insert(id_link++,l);
 			outlink(S_nLink,l);
 		}
-	}
+	*/}
 
 	// set Id of link(s) named Id or number No
 	void m_setLinkId(int argc,t_atom *argv) 
diff --git a/msd/03_msdwave.pd b/msd/03_msdwave.pd
index c071993..ae67a8a 100644
--- a/msd/03_msdwave.pd
+++ b/msd/03_msdwave.pd
@@ -1,4 +1,4 @@
-#N canvas 493 42 947 811 10;
+#N canvas 555 25 947 765 10;
 #X obj 32 13 loadbang;
 #X obj 603 265 gemwin;
 #X msg 603 243 0 \, destroy;
@@ -17,19 +17,19 @@
 #X obj 127 136 t b f;
 #X obj 127 57 unpack f f f;
 #X obj 64 114 gemhead 45;
-#X obj 48 239 color 0.2 0.2 0.2;
 #X obj 48 283 cuboid 0.005 0.15 0.08;
+#X obj 48 239 color 0.8 0.8 0.8;
 #X connect 0 0 5 0;
-#X connect 1 0 7 0;
+#X connect 1 0 8 0;
 #X connect 2 0 1 0;
 #X connect 3 0 2 0;
 #X connect 4 0 3 0;
 #X connect 4 1 1 1;
 #X connect 5 0 4 0;
 #X connect 5 1 1 2;
-#X connect 5 2 8 3;
+#X connect 5 2 7 3;
 #X connect 6 0 3 1;
-#X connect 7 0 8 0;
+#X connect 8 0 7 0;
 #X restore 274 531 pd massrender;
 #X msg 203 83 symbol reset;
 #X text 793 205 Select view;
@@ -48,11 +48,11 @@
 #X msg 421 523 get massesPos \$1;
 #X obj 602 334 rotateXYZ;
 #X obj 56 547 vsl 15 128 0 4 0 0 empty empty empty 0 -8 0 8 -262131
--1 -1 400 1;
+-1 -1 0 1;
 #X obj 75 547 vsl 15 128 0 4 0 0 empty empty empty 0 -8 0 8 -262131
 -1 -1 0 1;
 #X obj 94 547 vsl 15 128 0 4 0 0 empty empty empty 0 -8 0 8 -262131
--1 -1 0 1;
+-1 -1 600 1;
 #X obj 112 547 vsl 15 128 0 4 0 0 empty empty empty 0 -8 0 8 -262131
 -1 -1 0 1;
 #X msg 56 682 posX 0 \$1;
-- 
cgit v1.2.1