Files
Tool_NewDuplicator/scripts/server/shapeline.cs
2025-07-22 00:26:35 -07:00

71 lines
3.2 KiB
C#

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