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); } //////////////////////////////////////////////////////////////////////////////// // 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)); }