// Morph Modfy AnyAxiz 0.625
// 選択軸の値を操作する。
@name "MorphModAnyAxiz"
@version 2.5
@warnings
@script modeler
@define DESCRIPT "Morph Modify AnyAxiz"
@define MODE_RELATED 1
@define MODE_ABSOLUTE 2
@define MODE_MULTI 3
var cX,cY,cZ, dX,dY,dZ, pX,pY,pZ;
main
{
selmode(DIRECT);
var SelPts = pointcount();
// 90/92/93 はpoint/poly countでUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
if(!SelPts){
error("
Need Select Pts");
return;
}
var vmap = VMap(VMMORPH);
if(vmap == nil){
error("
Not Found MORPH");
return;
}
var VMapNames;
while(vmap && vmap.type == VMMORPH){
VMapNames += vmap.name;
vmap = vmap.next();
}
var RecentMap;
@if version == 2.5
RecentMap = recall("RecentMap", "--None--");
@else
vmap = VMap(VMMORPH,0);
if(vmap == nil) RecentMap = recall("RecentMap", "--None--");
else RecentMap = vmap.name;
@end
var RecentType = recall("RecentType", 1);
var ListIdx = 1;
var MapCnt = VMapNames.size();
for(i = 1; i <= MapCnt; i++){
if(RecentMap == VMapNames[i]){
ListIdx = i;
break;
}
}
reqbegin(DESCRIPT);
reqsize(300,142);
tx1 = ctltext("","% only for Multi");
ctlposition(tx1,210,87);
tx2 = ctltext("","Sym");
ctlposition(tx2, 68,87);
c0 = ctlpopup("", ListIdx, VMapNames);
ctlposition(c0, 0, 2);
m0 = ctlchoice("", RecentType, @"Related","Absolute"," Multi"@, true);
ctlposition(m0, 0, 25, 63);
cX = ctlchoice("", 2,@"X","-"@, false);
ctlposition(cX, 88, 25, 40);
cY = ctlchoice("", 2,@"Y","-"@, false);
ctlposition(cY, 88, 45, 40);
cZ = ctlchoice("", 2,@"Z","-"@, false);
ctlposition(cZ, 88, 65, 40);
cC = ctlchoice("", 2,@"*","-"@, false);
ctlposition(cC, 88, 85, 40);
rX = ctlcheckbox("", true);
ctlposition(rX, 69, 25, 22);
rY = ctlcheckbox("", false);
ctlposition(rY, 69, 45, 22);
rZ = ctlcheckbox("", false);
ctlposition(rZ, 69, 65, 22);
dX = ctldistance("", 0.0);
ctlposition(dX, 129, 25);
dY = ctldistance("", 0.0);
ctlposition(dY, 129, 45);
dZ = ctldistance("", 0.0);
ctlposition(dZ, 129, 65);
pX = ctlpercent("", 1.0);
ctlposition(pX, 200, 25);
pY = ctlpercent("", 1.0);
ctlposition(pY, 200, 45);
pZ = ctlpercent("", 1.0);
ctlposition(pZ, 200, 65);
c2 = ctlbutton("-", 22, "changeDec");
ctlposition(c2, 135,85, 20);
c3 = ctlbutton("0", 21, "changeReset");
ctlposition(c3, 157,85, 20);
c4 = ctlbutton("+", 21, "changeInc");
ctlposition(c4, 179,85, 20);
ctlactive( m0, "maskVal", dX,dY,dZ,c2,c3,c4);
ctlactive( m0, "maskPer", pX,pY,pZ);
ctlrefresh(cC, "changeActDeact");
return if !reqpost();
var ModType = getvalue(m0);
var SelIdx = getvalue(c0);
var XRev = getvalue(rX);
var YRev = getvalue(rY);
var ZRev = getvalue(rZ);
var XOn = ( getvalue(cX) - 1) ^ 1;
var YOn = ((getvalue(cY) - 1) ^ 1) * 2;
var ZOn = ((getvalue(cZ) - 1) ^ 1) * 4;
var DistX = getvalue(dX);
var DistY = getvalue(dY);
var DistZ = getvalue(dZ);
var PercX = getvalue(pX);
var PercY = getvalue(pY);
var PercZ = getvalue(pZ);
reqend();
var SelAxiz = XOn + YOn + ZOn;
if(SelAxiz == 0){
error("
Not Select Axis.");
return;
}
vmap = VMap(VMMORPH, VMapNames[SelIdx]);
var SrcVal[SelPts][3];
var NewVal[SelPts][3];
var SrcPos[SelPts];
var Val[3];
editbegin();
for(i = 1; i <= SelPts; i++){
if(vmap.isMapped(points[i])) Val = vmap.getValue(points[i]);
else Val = @0.0,0.0,0.0@;
SrcVal[i] = Val;
SrcPos[i] = pointinfo(points[i]);
}
var RevFlag = XRev + YRev + ZRev;
switch(ModType){
case MODE_RELATED:
if(RevFlag != 0){
for(i = 1; i <= SelPts; i++){
if(XRev && (SrcPos[i].x < 0.0)) NewVal[i][1] = SrcVal[i][1] - DistX;
else NewVal[i][1] = SrcVal[i][1] + DistX;
if(YRev && (SrcPos[i].y < 0.0)) NewVal[i][2] = SrcVal[i][2] - DistY;
else NewVal[i][2] = SrcVal[i][2] + DistY;
if(ZRev && (SrcPos[i].z < 0.0)) NewVal[i][3] = SrcVal[i][3] - DistZ;
else NewVal[i][3] = SrcVal[i][3] + DistZ;
}
}else{
for(i = 1; i <= SelPts; i++){
NewVal[i][1] = SrcVal[i][1] + DistX;
NewVal[i][2] = SrcVal[i][2] + DistY;
NewVal[i][3] = SrcVal[i][3] + DistZ;
}
}
break;
case MODE_ABSOLUTE:
if(RevFlag != 0){
var DistXr = DistX * -1.0;
var DistYr = DistY * -1.0;
var DistZr = DistZ * -1.0;
for(i = 1; i <= SelPts; i++){
if(XRev && (SrcPos[i].x < 0.0)) NewVal[i][1] = DistXr;
else NewVal[i][1] = DistX;
if(YRev && (SrcPos[i].y < 0.0)) NewVal[i][2] = DistYr;
else NewVal[i][2] = DistY;
if(ZRev && (SrcPos[i].z < 0.0)) NewVal[i][3] = DistZr;
else NewVal[i][3] = DistZ;
}
}else{
for(i = 1; i <= SelPts; i++){
NewVal[i][1] = DistX;
NewVal[i][2] = DistY;
NewVal[i][3] = DistZ;
}
}
break;
case MODE_MULTI:
for(i = 1; i <= SelPts; i++){
NewVal[i][1] = SrcVal[i][1] * PercX;
NewVal[i][2] = SrcVal[i][2] * PercY;
NewVal[i][3] = SrcVal[i][3] * PercZ;
}
break;
default :
break;
}
switch(SelAxiz){
case 1:
for(i = 1; i <= SelPts; i++){
SrcVal[i][1] = NewVal[i][1];
Val = SrcVal[i];
vmap.setValue(points[i], Val);
}
break;
case 2:
for(i = 1; i <= SelPts; i++){
SrcVal[i][2] = NewVal[i][2];
Val = SrcVal[i];
vmap.setValue(points[i], Val);
}
break;
case 3:
for(i = 1; i <= SelPts; i++){
NewVal[i][3] = SrcVal[i][3];
Val = NewVal[i];
vmap.setValue(points[i], Val);
}
break;
case 4:
for(i = 1; i <= SelPts; i++){
SrcVal[i][3] = NewVal[i][3];
Val = SrcVal[i];
vmap.setValue(points[i], Val);
}
break;
case 5:
for(i = 1; i <= SelPts; i++){
NewVal[i][2] = SrcVal[i][2];
Val = NewVal[i];
vmap.setValue(points[i], Val);
}
break;
case 6:
for(i = 1; i <= SelPts; i++){
NewVal[i][1] = SrcVal[i][1];
Val = NewVal[i];
vmap.setValue(points[i], Val);
}
break;
case 7:
for(i = 1; i <= SelPts; i++){
Val = NewVal[i];
vmap.setValue(points[i], Val);
}
break;
default:
break;
}
editend();
if(RecentMap != vmap.name) store("RecentMap", vmap.name);
if(RecentType != ModType) store("RecentType", ModType);
}
// --------------------------
maskVal: v
{ return(v != 3); }
maskPer: v
{ return(v > 2); }
changeActDeact: v
{
// LS25のctlchoiceへ外部からsetvalueする時は0,1,2
// LS26のctlchoiceへ外部からsetvalueする時は1,2、3
@if version == 2.5
v -= 1;
@end
setvalue(cX, v);
setvalue(cY, v);
setvalue(cZ, v);
}
changeInc
{
setvalue(dX, getvalue(dX) + 0.001);
setvalue(dY, getvalue(dY) + 0.001);
setvalue(dZ, getvalue(dZ) + 0.001);
}
changeDec
{
setvalue(dX, getvalue(dX) - 0.001);
setvalue(dY, getvalue(dY) - 0.001);
setvalue(dZ, getvalue(dZ) - 0.001);
}
changeReset
{
setvalue(dX, 0.0);
setvalue(dY, 0.0);
setvalue(dZ, 0.0);
}