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