// Round UV Value 0.216 // UV値をPixel境界に合わせて丸める。 @name "Round UV Value" @version 2.5 @warnings @script modeler @define DESCRIPT "Round UV Value" // 整列基準点:1=画素中央、2=画素境界 @define INIT_BORDER 2 // 対象UV軸:1=U、2=V、3=U&V @define INIT_TARGET 3 // 想定テクスチャ解像度 1=128、2=256、3=512、4=768、5=1024、6=1536、7=2048 @define INIT_RESOLT 5 main { var vmap; vmap = VMap(VMTEXTURE); if(vmap == nil){ error("
Not Found UV Map"); return; } var VMapNames; while(vmap && vmap.type == VMTEXTURE){ VMapNames += vmap.name; vmap = vmap.next(); } var RecentMap; @if version == 2.5 RecentMap = recall("RecentMap", "--None--"); @else vmap = VMap(VMTEXTURE, 0); if(vmap == nil) RecentMap = recall("RecentMap", "--None--"); else RecentMap = vmap.name; @end var ListIdx; var MapCnt; ListIdx = 1; MapCnt = VMapNames.size(); for(i = 1; i <= MapCnt; i++){ if(RecentMap == VMapNames[i]){ ListIdx = i; break; } } reqbegin(DESCRIPT); reqsize(300,125); c0 = ctlpopup("", ListIdx, VMapNames); ctlposition(c0, 40, 2); t0 = ctltext("","UVmap:"); ctlposition(t0, 4, 6); c1 = ctlchoice("", INIT_BORDER, @"< Center >","< Border >"@, false); ctlposition(c1, 40, 22); t1 = ctltext("","Align :"); ctlposition(t1, 4, 26); c2 = ctlchoice("", INIT_TARGET, @" < U >"," < V >","< U&V >"@, false); ctlposition(c2, 40, 42); t2 = ctltext("","Target:"); ctlposition(t2, 4, 46); c3 = ctlchoice("", INIT_RESOLT, @" 128"," 256"," 512"," 768","1024","1536","2048"@, false); ctlposition(c3, 40, 62); t3 = ctltext("","Reso :"); ctlposition(t3, 4, 66); return if !reqpost(); var SelIdx = getvalue(c0); var SelType = getvalue(c1); var ModType = getvalue(c2); var ResoSel = getvalue(c3); reqend(); var TxtSize[8]; var UnitSize; var UnitMod; TxtSize = @128,256,512,768,1024,1536,2048@; UnitSize = 1.0 / TxtSize[ResoSel]; if(SelType == 1) UnitMod = UnitSize * 0.5; else UnitMod = 0.0; vmap = VMap(VMTEXTURE, VMapNames[SelIdx]); var Val[2]; var p; selmode(USER); editbegin(); if(ModType == 1){ foreach(p, points){ if(vmap.isMapped(p)){ Val = vmap.getValue(p); Val[1] = round(Val[1] / UnitSize, 0) * UnitSize + UnitMod; vmap.setValue(p, Val); } } }else if(ModType == 2){ foreach(p, points){ if(vmap.isMapped(p)){ Val = vmap.getValue(p); Val[2] = round(Val[2] / UnitSize, 0) * UnitSize + UnitMod; vmap.setValue(p, Val); } } }else{ foreach(p, points){ if(vmap.isMapped(p)){ Val = vmap.getValue(p); Val[1] = round(Val[1] / UnitSize, 0) * UnitSize + UnitMod; Val[2] = round(Val[2] / UnitSize, 0) * UnitSize + UnitMod; vmap.setValue(p, Val); } } } editend(); if(RecentMap != vmap.name) store("RecentMap", vmap.name); }