Use "Parent" null to position and rotate box and "Control" null to animate using the rig.
Problem
- Under LightWave 11 Item Shape is broken due to changes in comring
- Fixed parenting (v1.1)
- Objects require pivot to be resting on ground and centre of object
- Does not work on clones due to expressions
- Fixed getting correct boundingbox extents from layers
- Fixed Parent in Place issues
- Fixed offset when pivot not at bottom of object
// LScript Generic - www.StephenCulley.co.uk
//
// web address: http://www.stephenculley.co.uk
// email address: email@stephenculley.co.uk
/*
LScript Generic - BoxRig
Generic_BoxRig.ls
*/
@version 2.2
@warnings
@script generic
@name *Box Rig
// Title
sTitle = "*Box Rig";
// Version
sVersion = "v1.1";
generic
{
// Item Select
Items = Scene().getSelect();
if(Items == nil)
{
info("Select an object.");
return;
}
// Parent in Place
bParentInPlace = Scene().generalopts[3];
if(bParentInPlace){ParentInPlace();}
for(i = 1; i <= Items.size(); i++)
{
if(Items[i].genus == MESH && !Items[i].null)
{
GoToFrame(0);
SelectItem(Items[i].id);
// Box Item
BoxItem = Mesh(0); // Get Box
BoxItem_Parent = BoxItem.parent; // Parent
vPivot = BoxItem.getPivot(0.0);
vPosition = BoxItem.getPosition(0.0); // Position
vRotation = BoxItem.getRotation(0.0); // Rotation
vScaling = BoxItem.getScaling(0.0); // Scaling
aBoundingBox = BoxItem.position(getlayernumber(BoxItem)); // Bounding Box
aBoundingBox[1] -= vPivot;
aBoundingBox[2] -= vPivot;
sName = BoxItem.name; // Name
// Reset Box
Position(0.0,-aBoundingBox[1].y,0.0);
Rotation(0.0,0.0,0.0);
Scale(1.0,1.0,1.0);
CreateKey(0);
// Parent Item
AddNull(sName + "_Parent");
ParentItem = Mesh(sName + "_Parent"); // Assign to a var
ItemColor(12); // Color Dark Red
Position();
Rotation(vRotation);
Scale(vScaling);
CreateKey(0);
if(BoxItem_Parent != nil){ParentItem(BoxItem_Parent.id);} // Parent
// Pivot Item
AddNull(sName + "_Pivot");
PivotItem = Mesh(sName + "_Pivot"); // Assign to a var
ItemColor(5); // Color Dark Red
ParentItem(ParentItem.id); // Parent
// Shift Item
AddNull(sName + "_Shift");
ShiftItem = Mesh(sName + "_Shift"); // Assign to a var
ItemColor(5); // Color Dark Red
ParentItem(PivotItem.id); // Parent
MoveTool();
EnableXH();
EnableYP();
EnableZB();
RotateTool();
EnableXH();
EnableYP();
EnableZB();
SquashTool();
EnableXH();
EnableYP();
EnableZB();
// Box Item
BoxItem.select();
ParentItem(ShiftItem.id); // Parent
ItemColor(7); // Color Brown
MoveTool();
EnableYP();
RotateTool();
EnableYP();
EnableZB();
SquashTool();
EnableXH();
EnableYP();
EnableZB();
// Extent Item
AddNull(sName + "_Extent");
ExtentItem = Mesh(sName + "_Extent"); // Assign to a var
ItemColor(5); // Color Dark Red
ParentItem(ParentItem.id); // Parent
Position(aBoundingBox[2].x,0.0,aBoundingBox[2].z);
CreateKey(0);
MoveTool();
EnableYP();
RotateTool();
EnableXH();
EnableYP();
EnableZB();
SquashTool();
EnableXH();
EnableYP();
EnableZB();
// Control Item
AddNull(sName + "_Control");
ControlItem = Mesh(sName + "_Control"); // Assign to a var
ItemColor(12); // Color Red
ParentItem(ParentItem.id); // Parent
MoveTool();
EnableYP();
RotateTool();
EnableYP();
EnableZB();
SquashTool();
EnableXH();
EnableYP();
EnableZB();
// Custom
customshape(ParentItem,nil,0,nil,"Parent");
customshape(PivotItem,ParentItem,8,nil,"Pivot");
customshape(ShiftItem,ParentItem,8,nil,"Shift");
customshape(BoxItem,ParentItem,8,nil,"");
customshape(ExtentItem,ParentItem,8,nil,"Extent");
customshape(ControlItem,ParentItem,6,0.15,"Control");
// EXPRESSIONS
// Shift_X
createexpression(sName + "_Shift_X","max(min((( - ([" + sName + "_Control.Position.X] * 1000) ) * (1 / 5)) * ( [" + sName + "_Extent.Position.X] ),[" + sName + "_Extent.Position.X]),-[" + sName + "_Extent.Position.X])");
ShiftItem.select();
attachexpression(sName + "_Shift_X",sName + "_Shift.Position.X");
// Shift_Z
createexpression(sName + "_Shift_Z","max(min((( - ([" + sName + "_Control.Position.Z] * 1000) ) * (1 / 5)) * ( [" + sName + "_Extent.Position.Z] ),[" + sName + "_Extent.Position.Z]),-[" + sName + "_Extent.Position.Z])");
ShiftItem.select();
attachexpression(sName + "_Shift_Z",sName + "_Shift.Position.Z");
// Pivot_X
createexpression(sName + "_Pivot_X","min(max((( - ([" + sName + "_Control.Position.X] * 1000) ) * (1 / 5)) * ( -[" + sName + "_Extent.Position.X] ),-[" + sName + "_Extent.Position.X]),[" + sName + "_Extent.Position.X])");
PivotItem.select();
attachexpression(sName + "_Pivot_X",sName + "_Pivot.Position.X");
// Pivot_Z
createexpression(sName + "_Pivot_Z","min(max((( - ([" + sName + "_Control.Position.Z] * 1000) ) * (1 / 5)) * ( -[" + sName + "_Extent.Position.Z] ),-[" + sName + "_Extent.Position.Z]),[" + sName + "_Extent.Position.Z])");
PivotItem.select();
attachexpression(sName + "_Pivot_Z",sName + "_Pivot.Position.Z");
// Pivot_H
createexpression(sName + "_Pivot_H","[" + sName + "_Control.Rotation.H]");
PivotItem.select();
attachexpression(sName + "_Pivot_H",sName + "_Pivot.Rotation.H");
// Pivot_P
createexpression(sName + "_Pivot_P","mapRange([" + sName + "_Control.Position.Z],0.000,[" + sName + "_Extent.Position.Z],0.000,90.000)");
PivotItem.select();
attachexpression(sName + "_Pivot_P",sName + "_Pivot.Rotation.P");
// Pivot_B
createexpression(sName + "_Pivot_B","- mapRange([" + sName + "_Control.Position.X],0.000,[" + sName + "_Extent.Position.X],0.000,90.000)");
PivotItem.select();
attachexpression(sName + "_Pivot_B",sName + "_Pivot.Rotation.B");
//
// Control
ControlItem.select();
MoveTool();
}
}
// Parent in Place
if(bParentInPlace){ParentInPlace();}
info(sTitle + " " + sVersion + " - developer: Stephen Culley - http://www.stephenculley.co.uk");
}
getlayernumber: item
{
if(item.totallayers == 1){return(1);}
sTokens = parse(":",item.name);
iLayer = 0;
if (strleft(sTokens[2],5)=="Layer")
{
iLayer = integer(sTokens[2]);
}
else
{
iTotal = item.totallayers;
for(i = 1; i <= iTotal; i++)
{
if(item.layerVisible(i) == 1)
{
if(item.layerName(i) == sTokens[2])
{
iLayer = i;
break;
}
}
else
{
iTotal++;
}
}
}
return iLayer;
}
createexpression: name, expression
{
CommandInput("GE_CreateExpression " + "\"" + name + "\"" + " " + "\"" + expression + "\"");
}
attachexpression: name,channel
{
CommandInput("GE_OpenWindow");
CommandInput("GE_SetEnv " + "\"" + channel);
CommandInput("GE_AttachExpression " + "\"" + channel + "\"" + name);
}
customshape: item,linkto,shape,scale,label
{
SelectItem(item.id);
ApplyServer("CustomObjHandler","LW_ItemShape");
// ItemShapeData structure
aItemShapeData = @"p", // ctxt
"p","p", // self, linkTo
"d","d","d", // time, level, scale
"i","i","i","i", // axis, fill, shape, flags
"f","f","f", // clrA
"f","f","f", // clrB
"f","f","f", // clrT
"d","d","d", // linkPos
"s:120", // label
"s:100", // desc
"p", // alreadylist
"s:256", // selfname
"s:256", // linktoname
"i"@; // justify
comringattach("ItemShapeComRing", "shapecomring");
aDataBlob = comringencode(aItemShapeData,
0,
item.id, 0,
0.0, 0.0, 0.0,
0, 0, 0, 0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
"",
"",
0,
"",
"",
0);
comringmsg("ItemShapeComRing", 100, aDataBlob);
aItemShape = comringdecode(aItemShapeData, aDataBlob);
if(linkto != nil){aItemShape[3] = linkto.id;} // linkto
if(scale != nil){aItemShape[6] = scale;} // Scale
aItemShape[7] = 1; // Axis
aItemShape[9] = shape; // Shape
aItemShape[23] = label; // Label
if(linkto != nil)
aItemShape[27] = linkto.name; // linkto name
aDataBlob = comringencode(aItemShapeData,
aItemShape[1],
aItemShape[2],aItemShape[3],
aItemShape[4],aItemShape[5],aItemShape[6],
aItemShape[7],aItemShape[8],aItemShape[9],aItemShape[10],
aItemShape[11],aItemShape[12],aItemShape[13],
aItemShape[14],aItemShape[15],aItemShape[16],
aItemShape[17],aItemShape[18],aItemShape[19],
aItemShape[20],aItemShape[21],aItemShape[22],
aItemShape[23],
aItemShape[24],
aItemShape[25],
aItemShape[26],
aItemShape[27],
aItemShape[28]);
comringmsg("ItemShapeComRing", 200, aDataBlob);
comringdetach("ItemShapeComRing");
}
shapecomring: code, data
{
}
All scripts available at my Google Drive at
https://drive.google.com/open?id=1cR_q2GVUAJHumic1-A3eXV16acQnVTWs
No comments:
Post a Comment