// ===== UV Cut + Unfold (+ Pack / Texel Density / Padding) — Stable MEL (Maya 2026) =====
global proc uvCU_RunPad(float $td, int $mapSize, int $doSetTD, int $doPack, float $padding)
{
if ($doSetTD && $td <= 0.0) error "Texel Density must be > 0.";
if ($doSetTD && $mapSize <= 0) error "Map Size must be > 0.";
string $edges[] = `filterExpand -sm 32 -ex 1`;
if (!size($edges)) error "Select polygon edges (UV seams) first.";
string $owners[] = `ls -o $edges`;
string $xforms[];
for ($o in $owners) {
string $p[] = `listRelatives -p -pa $o`;
if (size($p)) {
int $seen = 0; for ($t in $xforms){ if ($t==$p[0]){$seen=1;break;} }
if (!$seen) $xforms[size($xforms)] = $p[0];
}
}
select -r $edges;
polyMapCut;
// Select ALL UVs on those meshes
select -cl;
for ($t in $xforms) {
string $uvs[] = `polyListComponentConversion -toUV $t`;
select -add $uvs;
}
select -r `filterExpand -sm 35 -ex 1`;
// If no UVs yet, seed a quick projection & reselect UVs
if (!size(`ls -sl -fl`)) {
for ($t in $xforms) {
select -r $t;
polyAutoProjection -lm 0 -pb 0 -ibd 1 -cm 0 -l 2 -sc 1 -o 1 -p 6 -ps 0.2 -ch 0;
}
select -cl;
for ($t in $xforms) {
string $uvs2[] = `polyListComponentConversion -toUV $t`;
select -add $uvs2;
}
select -r `filterExpand -sm 35 -ex 1`;
}
// Unfold (Unfold3D tool entry)
u3dUnfold;
// Optional Texel Density
if ($doSetTD) {
texSetTexelDensity $td $mapSize;
}
// Optional Pack (padding in UV units 0..1)
if ($doPack) {
polyLayoutUV -l 2 -sc 1 -fr 1 -ps $padding -ch 0;
}
string $msg = "[UV] Cut + Unfold";
if ($doSetTD) $msg += " + TD";
if ($doPack) $msg += (" + Pack (Padding: " + $padding + ")");
print ($msg + ".\n");
}
// Camera planar from current view (your requested flags)
global proc uvCU_PlanarFromCamera()
{
string $sel[] = `ls -sl`;
if (!size($sel)) error "Select mesh components or objects to project.";
string $faces[] = `filterExpand -sm 34 -ex 1`;
if (!size($faces)) {
string $toFaces[] = `polyListComponentConversion -toFace $sel`;
$faces = `filterExpand -sm 34 -ex 1 $toFaces`;
}
if (!size($faces)) error "Could not resolve faces from selection.";
select -r $faces;
polyProjection -type Planar -md p -constructionHistory 1;
print "[UV] Camera-based planar projection applied from view.\n";
}
// Button callback — query controls by explicit names and run
global proc uvCU_OnRun()
{
float $td = `floatFieldGrp -q -value1 uvCU_tdFld`;
int $ms = `intFieldGrp -q -value1 uvCU_msFld`;
int $doTD = `checkBox -q -v uvCU_cbTD`;
int $doPack = `checkBox -q -v uvCU_cbPack`;
float $padding = `floatFieldGrp -q -value1 uvCU_padFld`;
optionVar -fv "uvCU_texelDensity" $td;
optionVar -iv "uvCU_mapSize" $ms;
optionVar -iv "uvCU_doSetTD" $doTD;
optionVar -iv "uvCU_doPack" $doPack;
optionVar -fv "uvCU_padding" $padding;
uvCU_RunPad($td, $ms, $doTD, $doPack, $padding);
}
// UI — controls are created with fixed names so callbacks never break
global proc uvCU_UI()
{
string $win = "uvCutUnfoldTDWin";
if (`window -exists $win`) deleteUI -window $win;
window -title "ChatGPT X CS UV Tool" -widthHeight 420 300 $win;
columnLayout -adj true -rs 6;
float $defTD = (`optionVar -exists "uvCU_texelDensity"`) ? `optionVar -q "uvCU_texelDensity"` : 8.0;
int $defMap = (`optionVar -exists "uvCU_mapSize"`) ? `optionVar -q "uvCU_mapSize"` : 2048;
int $defDoTD = (`optionVar -exists "uvCU_doSetTD"`) ? `optionVar -q "uvCU_doSetTD"` : 1;
int $defPack = (`optionVar -exists "uvCU_doPack"`) ? `optionVar -q "uvCU_doPack"` : 1;
float $defPad = (`optionVar -exists "uvCU_padding"`) ? `optionVar -q "uvCU_padding"` : 0.005;
// Name each control explicitly (last arg)
floatFieldGrp -label "Texel Density (px/unit)" -numberOfFields 1 -value1 $defTD uvCU_tdFld;
intFieldGrp -label "Map Size (px)" -numberOfFields 1 -value1 $defMap uvCU_msFld;
checkBox -l "Scale to density after unfold" -v $defDoTD uvCU_cbTD;
checkBox -l "Pack after unfold" -v $defPack uvCU_cbPack;
floatFieldGrp -label "UV Padding (0..1)" -numberOfFields 1 -value1 $defPad uvCU_padFld;
separator -style "in";
rowLayout -nc 3 -cw3 180 160 60 -ct3 "both" "both" "both" -co3 2 2 2;
button -label "CameraBased Planar" -c "uvCU_PlanarFromCamera();";
button -label "Cut + Unfold" -c "uvCU_OnRun();";
button -label "Close" -c ("deleteUI -window " + $win);
setParent ..;
showWindow $win;
}
// Launch
uvCU_UI();
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter