add new zone box visuals,
This commit is contained in:
73
scripts/server/shapeline.cs
Normal file
73
scripts/server/shapeline.cs
Normal file
@ -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));
|
||||
}
|
Reference in New Issue
Block a user