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