// Transfer Any VMap 0.113
// 背景同位置頂点のVmap値を前景頂点に適用
@name "TransfAnyVMap"
@version 2.5
@warnings
@script modeler
@define DESCRIPT "Transfer Any VMap"
@define WEIGHT_MAPS 1
@define MORPH_MAPS 2
@define UV_MAPS 3
var lw, lm, lu;
var WMapNames, MMapNames, UMapNames;
var WMapNum, MMapNum, UMapNum;
var WMapInit, MMapInit, UMapInit;
var WMapFlag, MMapFlag, UMapFlag;
main
{
var FGlyr, BGlyr;
FGlyr = lyrfg();
BGlyr = lyrbg();
if((FGlyr.size() != 1)||(BGlyr.size() != 1)){
error("
Accept/Need 1 FG & 1 BG Layer.");
return;
}
if((lyremptyfg() != nil)||(lyremptybg() != nil)){
error("
FG or BG is EMPTY.");
return;
}
selmode(DIRECT);
var SelPtsFG = pointcount();
// 90/92/93 はpoint/poly countでUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
if(!SelPtsFG){
error("
Plz Select Pts");
return;
}
// VMAPリスト作成
var vmap = VMap(VMWEIGHT);
if(vmap != nil){
while(vmap && vmap.type == VMWEIGHT){
if(vmap.name != "Edge Weight") WMapNames += vmap.name;
vmap = vmap.next();
}
WMapNum = WMapNames.size();
WMapFlag = true;
for(i = 1; i <= WMapNum; i++) WMapInit[i] = i;
}else{
WMapNames = @"--None--"@;
WMapNum = 1;
WMapFlag = false;
WMapInit[1] = 1;
}
vmap = VMap(VMMORPH);
if(vmap != nil){
while(vmap && vmap.type == VMMORPH){
MMapNames += vmap.name;
vmap = vmap.next();
}
MMapNum = MMapNames.size();
MMapFlag = true;
for(i = 1; i <= MMapNum; i++) MMapInit[i] = i;
}else{
MMapNames = @"--None--"@;
MMapNum = 1;
MMapFlag = false;
MMapInit[1] = 1;
}
vmap = VMap(VMTEXTURE);
if(vmap != nil){
while(vmap && vmap.type == VMTEXTURE){
UMapNames += vmap.name;
vmap = vmap.next();
}
UMapNum = UMapNames.size();
UMapFlag = true;
for(i = 1; i <= UMapNum; i++) UMapInit[i] = i;
}else{
UMapNames = @"--None--"@;
UMapNum = 1;
UMapFlag = false;
UMapInit[1] = 1;
}
// VMapが無い
if((!WMapFlag) && (!MMapFlag) && (!UMapFlag)){
error("
Not Found VMaps");
return;
}
reqbegin(DESCRIPT);
reqsize(190,364);
lw = ctllistbox("MapType: Weight",160, 280, "lb_WCount", "lb_WName");
ctlposition(lw, 5, 3);
lm = ctllistbox("MapType: Morph", 160, 280, "lb_MCount", "lb_MName");
ctlposition(lm, 5, 3);
lu = ctllistbox("MapType: UV", 160, 280, "lb_UCount", "lb_UName");
ctlposition(lu, 5, 3);
cw1 = ctlbutton("SelAll Weight",80, "lb_WSelect");
ctlposition(cw1, 6,286);
cw2 = ctlbutton("DeSelAl Wgt", 80, "lb_WDeselect");
ctlposition(cw2,85,286);
cm1 = ctlbutton("SelAll Morph", 80, "lb_MSelect");
ctlposition(cm1, 6,286);
cm2 = ctlbutton("DeSelAl Mrh", 80, "lb_MDeselect");
ctlposition(cm2,85,286);
cu1 = ctlbutton("SelAll UVs", 80, "lb_USelect");
ctlposition(cu1, 6,286);
cu2 = ctlbutton("DeSelAl UV", 80, "lb_UDeselect");
ctlposition(cu2,85,286);
c0 = ctlchoice("", 1, @"Weight","Morph","UV map"@);
ctlposition(c0, 0,310);
ctlvisible(c0, "changeLB_Wpane", lw, cw1, cw2);
ctlvisible(c0, "changeLB_Mpane", lm, cm1, cm2);
ctlvisible(c0, "changeLB_Upane", lu, cu1, cu2);
return if !reqpost();
var SelType = getvalue(c0);
var WSel = getvalue(lw);
var MSel = getvalue(lm);
var USel = getvalue(lu);
reqend();
var SelNames;
var ActType;
switch(SelType){
case WEIGHT_MAPS:
if(!WMapFlag || (WSel == nil)){
error("
Not Select Weight Maps");
return;
}
for(i = WSel.size(); i >= 1; i--) SelNames[i] = WMapNames[WSel[i]];
ActType = VMWEIGHT;
break;
case MORPH_MAPS:
if(!MMapFlag || (MSel == nil)){
error("
Not Select Morph Maps");
return;
}
for(i = MSel.size(); i >= 1; i--) SelNames[i] = MMapNames[MSel[i]];
ActType = VMMORPH;
break;
case UV_MAPS:
if(!UMapFlag || (USel == nil)){
error("
Not Select UV Maps");
return;
}
for(i = USel.size(); i >= 1; i--) SelNames[i] = UMapNames[USel[i]];
ActType = VMTEXTURE;
break;
default:
break;
}
var MapNum = SelNames.size();
// FG頂点情報の取得
var FG_Pts[SelPtsFG];
var FG_Vec[SelPtsFG];
editbegin();
for(i = 1; i <= SelPtsFG; i++){
FG_Pts[i] = points[i];
FG_Vec[i] = pointinfo(points[i]);
}
editend();
// 90/92/93 は変化の無いeditbeginでもUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
// BG頂点の選択
lyrswap();
selmode(USER);
for(i = 1; i <= SelPtsFG; i++) selpoint(SET, VOLUME, FG_Vec[i], FG_Vec[i]);
var SelPtsBG = editbegin();
moninit((SelPtsFG + SelPtsBG) * MapNum);
// BG頂点情報の保存
var BG_Pts[SelPtsBG];
var BG_Vec[SelPtsBG];
var BG_Buf[SelPtsBG];
var Val;
for(i = 1; i <= SelPtsBG; i++){
BG_Pts[i] = points[i];
BG_Vec[i] = pointinfo(points[i]);
monstep();
}
for(x = 1; x <= MapNum; x++){
vmap = VMap(ActType, SelNames[x]);
// BG頂点VMAP値の取得
for(i = 1; i <= SelPtsBG; i++){
if(vmap.isMapped(BG_Pts[i])){
Val = vmap.getValue(BG_Pts[i]);
BG_Buf[i] = Val;
}else{
BG_Buf[i] = nil;
}
monstep();
}
// FGの再処理
var j = 1;
for(i = 1; i <= SelPtsFG; i++){
for(c = j; c <= SelPtsBG; c++){
if(FG_Vec[i] == BG_Vec[c]){
if(BG_Buf[c] != nil){
vmap.setValue(FG_Pts[i], BG_Buf[c]);
}else{
if(vmap.isMapped(FG_Pts[i])) vmap.setValue(FG_Pts[i], nil);
}
j = c;
break;
}
}
monstep();
}
}
monend();
editend();
lyrswap();
selpoint(SET, POINTID, FG_Pts);
info("
Transfer Done");
// 90/92/93 はeditbegin/end の後のselpoint/polyでUndoバッファを消費する
@if version < 2.2
undo();
@end
@if version > 2.7
undo();
@end
}
// ---------------------------
changeLB_Wpane: v
{
if(v == 1) return(true);
else return(false);
}
changeLB_Mpane: v
{
if(v == 2) return(true);
else return(false);
}
changeLB_Upane: v
{
if(v == 3) return(true);
else return(false);
}
lb_WCount
{ return(WMapNum); }
lb_MCount
{ return(MMapNum); }
lb_UCount
{ return(UMapNum); }
lb_WName: Index
{ return(WMapNames[Index]); }
lb_MName: Index
{ return(MMapNames[Index]); }
lb_UName: Index
{ return(UMapNames[Index]); }
lb_WSelect
{ if(WMapFlag) setvalue(lw, WMapInit); }
lb_WDeselect
{ setvalue(lw, nil); }
lb_MSelect
{ if(MMapFlag) setvalue(lm, MMapInit); }
lb_MDeselect
{ setvalue(lm, nil); }
lb_USelect
{ if(UMapFlag) setvalue(lu, UMapInit); }
lb_UDeselect
{ setvalue(lu, nil); }