| 
							
							
							
						 |  |  | @@ -0,0 +1,73 @@ | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | function ndShapelineCreate(%color) { | 
		
	
		
			
				|  |  |  |  | 	if(%color$="") %color="1 1 1 1"; | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | 	%line = new StaticShape() { | 
		
	
		
			
				|  |  |  |  | 		datablock = ND_SelectionBoxBorder; | 
		
	
		
			
				|  |  |  |  | 	}; | 
		
	
		
			
				|  |  |  |  | 	//%line.setScopeAlways(); // newdup does this, idk why yet | 
		
	
		
			
				|  |  |  |  | 	%line.setNodeColor("ALL", %color); | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | 	return %line; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | function ndShapelineMove(%line, %p1,%p2) { | 
		
	
		
			
				|  |  |  |  | 	// calculate shape position | 
		
	
		
			
				|  |  |  |  | 	%center = vectorScale(vectorAdd(%p1,%p2), 0.5); | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | 	// calculate shape rotation | 
		
	
		
			
				|  |  |  |  | 	%lineDir = "0 0 1"; // direction of static shape | 
		
	
		
			
				|  |  |  |  | 	%dir = vectorSub(%p2, %p1); | 
		
	
		
			
				|  |  |  |  | 	%axis = vectorNormalize(vectorCross(%dir, %lineDir)); | 
		
	
		
			
				|  |  |  |  | 	%angle = mAcos(vectorDot(%dir, %lineDir) / vectorLen(%dir) / vectorLen(%lineDir)); | 
		
	
		
			
				|  |  |  |  | 	%rot = %axis SPC %angle; | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | 	// calculate shape scale | 
		
	
		
			
				|  |  |  |  | 	%scale = "1 1" SPC %vectorLen(%dir); | 
		
	
		
			
				|  |  |  |  | 	 | 
		
	
		
			
				|  |  |  |  | 	%line.setTransform(%center SPC %rot); | 
		
	
		
			
				|  |  |  |  | 	%line.setScale(%scale); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | function ndShapelineDelete(%line) { | 
		
	
		
			
				|  |  |  |  | 	%line.delete(); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | //////////////////////////////////////////////////////////////////////////////// | 
		
	
		
			
				|  |  |  |  | // Box drawing | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | function ndShapelineConnectBoxes_delete(%container) { // public | 
		
	
		
			
				|  |  |  |  | 	for(%i=0; %i<8; %i++) { | 
		
	
		
			
				|  |  |  |  | 		if(isObject(%line = %container.ndShapeline[%i])) | 
		
	
		
			
				|  |  |  |  | 			%line.delete(); | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | function ndShapelineConnectBoxes_create(%container, %color) { // public | 
		
	
		
			
				|  |  |  |  | 	for(%i=0; %i<8; %i++) { | 
		
	
		
			
				|  |  |  |  | 		if(!isObject(%container.ndShapeline[%i])) | 
		
	
		
			
				|  |  |  |  | 			%container.ndShapeline[%i] = ndShapelineCreate(%color); | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | function ndMin(%a,%b) { return %a<%b ? %a : %b; } | 
		
	
		
			
				|  |  |  |  | function ndMax(%a,%b) { return %a>%b ? %a : %b; } | 
		
	
		
			
				|  |  |  |  | // draw 8 lines between the boxes' 8 corners | 
		
	
		
			
				|  |  |  |  | function ndNormalizeBox(%box) { | 
		
	
		
			
				|  |  |  |  | 	%pLx = ndMin(getWord(%box,0),getWord(%box,3)); | 
		
	
		
			
				|  |  |  |  | 	%pLy = ndMin(getWord(%box,1),getWord(%box,4)); | 
		
	
		
			
				|  |  |  |  | 	%pLz = ndMin(getWord(%box,2),getWord(%box,5)); | 
		
	
		
			
				|  |  |  |  | 	%pHx = ndMax(getWord(%box,0),getWord(%box,3)); | 
		
	
		
			
				|  |  |  |  | 	%pHy = ndMax(getWord(%box,1),getWord(%box,4)); | 
		
	
		
			
				|  |  |  |  | 	%pHz = ndMax(getWord(%box,2),getWord(%box,5)); | 
		
	
		
			
				|  |  |  |  | 	return %pLx SPC %pLy SPC %pLz SPC %pHx SPC %pHy SPC %pHz; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | function ndShapelineConnectBoxes_move(%container, %box1, %box2) { // public | 
		
	
		
			
				|  |  |  |  | 	%box1 = ndNormalizeBox(%box1); | 
		
	
		
			
				|  |  |  |  | 	%box2 = ndNormalizeBox(%box2); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[0], getWord(%box1,0) SPC getWord(%box1,1) SPC getWord(%box1,2), getWord(%box2,0) SPC getWord(%box2,1) SPC getWord(%box2,2)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[1], getWord(%box1,0) SPC getWord(%box1,1) SPC getWord(%box1,5), getWord(%box2,0) SPC getWord(%box2,1) SPC getWord(%box2,5)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[2], getWord(%box1,0) SPC getWord(%box1,4) SPC getWord(%box1,2), getWord(%box2,0) SPC getWord(%box2,4) SPC getWord(%box2,2)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[3], getWord(%box1,0) SPC getWord(%box1,4) SPC getWord(%box1,5), getWord(%box2,0) SPC getWord(%box2,4) SPC getWord(%box2,5)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[4], getWord(%box1,3) SPC getWord(%box1,1) SPC getWord(%box1,2), getWord(%box2,3) SPC getWord(%box2,1) SPC getWord(%box2,2)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[5], getWord(%box1,3) SPC getWord(%box1,1) SPC getWord(%box1,5), getWord(%box2,3) SPC getWord(%box2,1) SPC getWord(%box2,5)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[6], getWord(%box1,3) SPC getWord(%box1,4) SPC getWord(%box1,2), getWord(%box2,3) SPC getWord(%box2,4) SPC getWord(%box2,2)); | 
		
	
		
			
				|  |  |  |  | 	ndShapelineMove(%container.ndShapeline[7], getWord(%box1,3) SPC getWord(%box1,4) SPC getWord(%box1,5), getWord(%box2,3) SPC getWord(%box2,4) SPC getWord(%box2,5)); | 
		
	
		
			
				|  |  |  |  | } |