interpBlendShape is a custom MPxDeformerNode and target-authoring workflow for Autodesk Maya. It extends conventional blend-shape deformation with NURBS-surface interpolation, target and in-between management, paintable weights, direct component editing, and surface-aware Sticky and Smooth sculpt brushes.
Version 1.1.0 includes interactive sculpt preview, undoable strokes, dense-mesh prewarming, and deferred target transfers for direct vertex edits and sculpt brushes. The Edit column shows pending changes and transfer state, and commits happen automatically at editing boundaries. The deformer supports TBB-parallel CPU evaluation and an optional OpenCL Maya GPU Override path.
0x00140541.
The Windows build documented here targets Autodesk Maya 2024, Windows x64, and an AVX2-capable CPU. GPU evaluation also needs a compatible OpenCL device and runtime; CPU evaluation is available. Other Maya releases and operating systems require a separately built and tested plug-in.
A module package uses the following layout. Keep the module file and its matching plug-in, scripts, and resources together.
InterpBlendShape/
├── interpBlendShape.mod
└── interpBlendShape/
├── plug-ins/interpBlendShape.mll
├── icons/
├── AETemplates/
└── scripts/
├── interpBlendShape_ui.py
├── interpBlendShape_activation.py
└── resources/LICENSE.txt
- Close Maya before replacing an installed build.
- Extract the module package into a permanent folder. Add that folder to
MAYA_MODULE_PATH, or place the module file and its sibling folder in your Maya usermodulesdirectory. - Start Maya 2024 and load
interpBlendShapein Plug-in Manager, then open the editor with the code below. - Complete offline activation before creating or evaluating target geometry.
import maya.cmds as cmds cmds.loadPlugin("interpBlendShape", quiet=True) print(cmds.pluginInfo("interpBlendShape", query=True, path=True)) from interpBlendShape_ui import showUI showUI()
.mll by its full path and add its matching scripts directory to sys.path.
Create a deformer: select one or more matching target meshes first, select the base mesh last, then choose Create → Create InterpBlendShape. Selecting only the base creates a node without an initial target.
Add a target: select a target mesh, select the InterpBlendShape node or a target row in the editor, then choose Create → Add Selection as Target. With no valid target selected, the command creates an empty target.
Add an in-between: select the in-between mesh and its parent target row, choose Create → Add Selection as In-Between Target, and enter a weight strictly between 0.0 and 1.0.
The editor manages targets, in-betweens, weights, cache state, live mode, surface assignment, and edit tools. Target operations include duplicate, merge, split, rebuild, mirror, and flip. Drag and drop can reorder targets, and column layout is saved per user.
| Edit state | Purpose | Important behavior |
|---|---|---|
| Edit | Direct Maya vertex editing and Maya mesh sculpt tools. | Updates the visible mesh while edits wait for automatic transfer. |
| Stick | Sticky moves points while following the assigned NURBS guide surface. | Requires UV Blend and a valid surface driver. |
| Smth | Smooth relaxes the sculpted target with surface-aware motion. | Holding Shift temporarily switches Sticky to Smooth. |
Sticky and Smooth use a private preview mesh. The Edit column keeps its short mode label and adds an amber dot when changes are pending. See Editing & Automatic Commit for transfer timing and status indicators.
The affected target’s weight controls are unavailable while edits are pending or transferring. They also remain unavailable while Sticky, Smooth, or a Maya mesh sculpt brush is active. Leave the brush to adjust weights and inspect the committed result.
Direct vertex edits, Maya mesh brushes, and Sticky/Smooth strokes update the visible mesh as you work. Changes are accumulated without copying the full target mesh after every drag or stroke.
Pending edits transfer automatically when you:
- Leave the current tool or switch to another tool.
- Change the target or in-between being edited.
- Turn Edit off.
- Save the scene.
No manual Apply step is required. Saving transfers pending edits before writing the scene. You can continue editing afterward; new changes wait for the next automatic commit.
| Edit-column display | Meaning | Behavior |
|---|---|---|
| Edit Stick Smth | Current editing mode. | The short mode label remains visible while editing. |
| Edit | Amber dot: edits are pending. | The visible mesh has changes waiting to transfer. Undoing those changes back to the original state clears the dot. |
| ... | Transferring and rebuilding. | Appears before the copy starts and stays through the output rebuild. |
| 42% | Preparing the brush cache. | The existing preparation percentage is separate from target transfer. |
... indicator is painted beforehand and remains visible until the operation completes. Transfer timing depends on the mesh and scene.
The amber Edit dot tracks uncommitted edits. The separate Cache column describes target-cache readiness.
Create an interpBlendShape node on a mesh or NURBS curve. The node inherits from MPxDeformerNode and follows the standard Maya deformer connection convention (inputGeom / outputGeom).
# Create node on selected mesh mc.deformer("pSphere1", type="interpBlendShape")
The node ships with optional OpenCL GPU acceleration support, registered via MPxGPUStandardDeformer. The GPU path handles all deformation modes — non-UV blend, UV blend, and Bezier blend — fully on the GPU, allowing the deformer to benefit from Maya's parallel evaluation graph when GPU override is active.
GPU evaluation uses the same cached data built during the CPU bind pass, so there is no extra bind cost when switching between evaluation modes. The node automatically falls back to CPU evaluation if GPU resources are unavailable or if the Evaluation Manager has GPU override disabled for the node.
The Sticky/Smooth sculpt workflow also uses GPU-assisted surface processing when available, with a CPU fallback. This interactive sculpt path is separate from Maya’s deformer GPU Override decision.
Parallel mode with GPU override enabled. Go to Windows → Settings/Preferences → Evaluation Manager, set mode to Parallel, then enable GPU Override.
Built for dense meshes, many active targets, and GPU-accelerated inbetween playback.
* In the inbetween test, Maya fell back to CPU with GPU Override enabled; interpBlendShape ran on GPU. These figures describe the reported benchmark workloads and builds. Results depend on Maya version, hardware, target setup, and evaluation mode. Brush interaction and final edit transfers have separate costs.
Dense mesh performance as target count grows
1,000,000 vertices. The measured GPU playback advantage grows as more targets are active.
Higher FPS is better. † The first target count is inferred from the doubling sequence.
View detailed 1M results and test notes
| Targets | DG | EMS | EMP + GPU Override |
|---|---|---|---|
| 7† | 18.8917 / 11.9808 | 150 / 157.895 | 200 / 200 |
| 14 | 11 / 9.48167 | 158.539 / 168.539 | 205 / 263.158 |
| 28 | 7.29572 / 7.59878 | 144.231 / 178.571 | 154.639 / 208.333 |
| 56 | 4.16898 / 5.66893 | 96.1538 / 135.135 | 96.7742 / 142.857 |
DG = Dependency Graph, EMS = Evaluation Manager Serial, and EMP = Evaluation Manager Parallel. GPU Override was enabled for the reported EMP measurements, as confirmed by the tester. † The first block is labeled seven targets by inference from the 7 → 14 → 28 → 56 sequence. These are separately reported playback results.
Compare all deformation modes · DG and GPU
100,000 vertices · eight active groups · dense 100% target coverage. Compare both deformers in the same workload, or compare DG and GPU Override across the row. Each group contains a final target plus the specified middle targets.
Regular linear (non-UV)
One regular inbetween
Two regular inbetweens
UV
Bezier · one middle
Bezier · two middles
UV + Bezier · one middle
UV + Bezier · two middles
Higher FPS is better. Each column uses its own fixed scale to keep DG bars readable: DG 0–100 FPS; GPU Override 0–500 FPS. Compare bar lengths within the same column.
* Maya used CPU fallback for inbetweens with GPU Override enabled; interpBlendShape used verified GPU execution. UV and Bezier are plugin-only features with no equivalent Maya fixture in this test. Regular linear GPU playback was similar, with overlapping trial ranges.
Median of five playback trials · Maya 2024 · Intel Core i7-10700 · RTX 2060 SUPER · September 6, 2026. Results vary with mesh, target count, and scene setup.
Explore more configurations
Explore the full benchmark
Choose a workload, mesh size, and target setup to compare playback speed and evaluation time. The explorer works offline.
Only measured group counts and densities are available for each workload. Each group has a final target plus the specified middle targets.
| Node / requested mode | CPU read ms ↓ | Update + redraw ms ↓ | Playback FPS ↑ |
|---|
N/A: CPU output-read timing was omitted for all GPU-requested runs, including native CPU fallbacks.
About these measurements
Controlled tests used Maya 2024, an Intel Core i7-10700, and an RTX 2060 SUPER, with Cached Playback off. Results are medians of five trials on 10K and 100K meshes; the overall comparison uses 100K vertices and eight active groups with dense targets. Playback FPS measures actual viewport playback; CPU read and redraw times measure different parts of evaluation. The 1M-vertex chart uses separately reported tests with GPU Override enabled for EMP. Maya used CPU fallback in the controlled inbetween GPU comparisons, as marked above. Performance varies with scene setup.
| Long Name | Short | Type | Default | Description |
|---|---|---|---|---|
| rebind | rb | bool | false | Trigger a full rebind of all target data and surface caches. Resets to false automatically on completion. |
| precision | prec | double | 0.001 | Global tolerance for delta culling. Vertices whose delta is smaller than precision × targetPrecision are skipped and not stored. Range: 0–100. |
| origin | or | long | 1 (local) | Coordinate space for deformation. 0 = world space, 1 = local space. Local is slightly faster and recommended for most rigs. |
| weight | wt | double[] | — | Per-target blend weight array. Index matches inputTargetGroup logical index. Keyable. Soft range 0–1. |
| profilingEnabled | pe | bool | false | Enables per-section performance profiling. When active, averaged timing data is printed to the Script Editor at the interval set by profilingSampleRate. Intended for performance troubleshooting, not normal use. Non-keyable. |
| profilingSampleRate | psr | long | 30 | Number of frames to accumulate before printing the averaged profiling report. Higher values smooth out per-frame variance. Minimum: 1. Non-keyable. |
Each entry in inputTargetGroup[] defines one blend target and its behaviour. These are children of inputTarget[geomIndex].inputTargetGroup[targetIndex].
| Long Name | Short | Type | Default | Description |
|---|---|---|---|---|
| targetOffset | to | double | 1.0 | Controls how far vertices lift off the guide surface. At 0, all affected vertices snap directly onto the surface and track it as it moves — no stored delta is applied. At 1, the full point delta is applied so vertices sit at their authored offset above the surface. Animating this value between 0 and 1 creates an attach-to-surface / peel-off effect. Range: 0–1. |
| targetCurvature | tc | float | 1.0 | Arc strength multiplier for Bezier blends. Internally computed as curvature × 2.0. Values above 1 exaggerate the arc; 0 produces a straight linear path. |
| targetBlendUV | tbuv | bool | false | Enables UV-space sliding on the guide NURBS surface. Requires a connected inputSurface. |
| targetBlendBezier | tbb | bool | false | Enables Bezier arc interpolation. Inbetween targets become control points. Supports quadratic (1 mid), cubic (2 mids), and arbitrary degree via de Casteljau. |
| targetBlendLive | tbl | bool | false | Recomputes closest-point binding every frame from the live connected geometry. Disables the target data cache for this group. |
| targetSurfaceId | tsi | long | -1 | Index into the inputSurface[] array used for UV-blend operations. Assign a valid surface index before enabling Sticky Sculpt. |
| targetRebind | trb | bool | false | Triggers a partial rebind for this specific target group only, without invalidating the rest of the cache. |
| targetPrecision | tp | double | 1.0 | Per-target precision multiplier. Final threshold = precision × targetPrecision. Range: 0–100. |
| targetCacheState | tcs | enum | Unknown | Hidden, stored status consumed by the editor Cache column: Unknown, Pending, Cached, Live, Empty, or Failed. |
The inputSurface[] compound array holds one or more guide NURBS surfaces used for UV-blend operations.
| Long Name | Short | Type | Description |
|---|---|---|---|
| inputTargetSurface | is | NurbsSurface | The guide NURBS surface. Connect the .worldSpace[0] or .local output of the surface shape here. |
| inputSurfaceOrigin | iso | long | Space for the surface. 0 = world, 1 = local. Overrides the global origin for this surface. |
| inputRelativePoints | idp | PointArray | Cached base delta vectors from surface-closest-point to base geometry, expressed in the surface tangent frame. Auto-populated on rebind. |
| inputSurfacePoints | isp | PointArray | Cached base surface closest-point positions. Auto-populated on rebind. |
| inputSurfaceUV | isuv | DoubleArray | Cached UV parameters of the base geometry on the surface. Stored as interleaved [u0, v0, u1, v1, ...]. Auto-populated on rebind. |
| Long Name | Short | Type | Default | Description |
|---|---|---|---|---|
| targetWeights | tw | double[] | 1.0 | Per-vertex weight map for this target group. Index = vertex ID. Default 1.0 (full influence). Paintable via paintTargetWeights. |
| baseWeights | bw | double[] | 1.0 | Per-vertex base mask applied across all targets for this geometry. Equivalent to the deformer envelope mask. |
| targetOffsetWeights | tow | double[] | 1.0 | Per-vertex mask for targetOffset. Values from 0–1 control where the surface-attach / peel-off offset is applied. Paintable through the editor. |
| targetWeightLock | twl | bool | false | Prevents paint normalization from modifying this target's weights. Locked targets are excluded from the redistribution pool. |
| targetWeightNormalization | twn | bool | false | When painting, weights across all normalization-enabled targets in the group sum to 1.0 per vertex. Locked targets are excluded from redistribution. |
Sticky and Smooth provide undoable strokes with interactive Viewport 2.0 preview. The default session brush radius is 15.0. Hold B and left-drag to adjust radius, or M and left-drag to adjust strength.
Activating a sculpt mode prewarms the spatial and surface data needed by both Sticky and Smooth. Dense meshes can briefly show a preparation progress state before the brush is ready. Prewarming on activation avoids placing that cold-start cost on the first stroke.
While Sticky is active, hold Shift to temporarily use Smooth; releasing Shift returns to Sticky. If Smooth is already the active mode, Shift does not change the mode.
The editor’s Cache column reflects the node’s current per-target state. Creation and target-add callbacks are synchronized with an immediate state check so fast cache completion is not missed.
| State | Meaning | Action |
|---|---|---|
| Pending | Cache creation or refresh is waiting to complete. | Wait, or click to request a rebuild. |
| Cached | Static target data is ready. | Click to rebuild when source data changed. |
| Live | A connected live target is evaluated directly. | No static target cache is used. |
| Empty | The target contains no geometry data. | Populate or sculpt the target; no cache is required yet. |
| Failed | Cache construction failed. | Check topology and the Script Editor, then click to retry. |
| Unknown | The target has not been evaluated yet. | Evaluate the node or request a rebuild. |
UV blend mode projects each vertex onto a guide NURBS surface at bind time, stores UV coordinates and a tangent-space delta, then re-evaluates the surface at the blended UV each frame. This allows deformation targets to slide with the surface normal and tangent frame rather than blending naively in object space.
Keep the following constraints in mind when setting up UV blend targets:
Collapsed poles and degenerate regions — tangent vectors can collapse near a pole or singularity. The stability guards reduce sudden changes, but guide shape and parameterisation still affect the result. Test deformation and sculpting near these regions, and use a guide with well-defined tangent frames wherever possible.
Surface parameterisation quality — highly non-uniform parameterisation (very dense knot spacing in one region, sparse in another) causes UV deltas to be inconsistent across the surface, making fine-tuning difficult. Prefer surfaces rebuilt with uniform or chord-length parameterisation.
Rebind required after guide surface edits — modifying the guide surface shape after binding does not automatically update the cached UV correspondences. Trigger a rebind (rebind = 1) or enable targetBlendLive on the affected target group after any surface edit.
Performance — UV blend performs a surface evaluation per affected vertex per frame. On meshes with a large number of UV-blend vertices this is the dominant deformation cost. Use the profiling attributes to measure it and consider reducing the affected vertex count via per-vertex weight painting.
Guide surface choice — open and periodic U/V forms are supported. Choose a guide whose shape and parameterisation suit the intended motion, and inspect the result near boundaries and collapsed poles. Multiple guide surfaces can help isolate regions that need different surface behavior.
# Enable UV blend on target group 0 mc.setAttr("interpBlendShape1.inputTarget[0].inputTargetGroup[0].targetBlendUV", 1) mc.setAttr("interpBlendShape1.inputTarget[0].inputTargetGroup[0].targetSurfaceId", 0) # Connect guide surface mc.connectAttr( "nurbsSurface1.worldSpace[0]", "interpBlendShape1.inputSurface[0].inputTargetSurface" )
When targetBlendBezier is enabled, inbetween targets act as Bezier control points. With one inbetween the path is quadratic; with two it is cubic; additional inbetweens use de Casteljau evaluation.
The targetCurvature attribute scales how far the middle control points pull away from the chord. A value of 0 collapses all arcs to straight lines; 1 (default) uses the authored control-point positions; higher values amplify the arc.
Live blend (targetBlendLive) bypasses the target data cache and recomputes closest-point evaluation per frame directly from the connected target geometry. This is useful for corrective shapes driven by animated meshes, but carries a per-frame closest-point cost. For static targets, always leave live blend off.
Multiple entries in inputTargetItem[] create an inbetween sequence. Item logical index encodes weight: index 5000 = weight 0, index 6000 = weight 1.0, index 5500 = weight 0.5. The deformer linearly interpolates between adjacent items based on the current weight[] value.
# Index = 5000 + (weight * 1000) # weight 0.0 → index 5000 # weight 0.5 → index 5500 # weight 1.0 → index 6000 inbetween_index = 5000 + int(weight * 1000)
The deformer exposes base weights (a per-vertex envelope applied to all targets), target weights (per-target influence), and target-offset weights (a mask for surface attach / peel-off). They can be edited with Maya’s paintable-deformer workflow or the InterpBlendShape editor.
Target weights support two additional per-target controls:
| Control | Description |
|---|---|
| Lockable | Lock a target's weights to prevent them from being affected when other targets in the same normalize group are painted. |
| Normalizable | Targets marked with the colour icon are part of the normalize group. Painting one target's weights will redistribute the remainder across the other non-locked targets in the same group to keep the total at 1.0. |
Group a small set of related targets into a normalize group — typically two or three that represent competing influences on the same region. Lock all targets outside the group before painting.
Always paint weights between two or three targets at a time with the rest locked. Painting across too many active targets at once makes normalization behaviour harder to predict and control.
import maya.cmds as mc # 1. Create deformer node = mc.deformer("pSphere1", type="interpBlendShape")[0] # 2. Connect guide surface mc.connectAttr("nurbsSurface1.worldSpace[0]", node + ".inputSurface[0].inputTargetSurface") # 3. Connect target mesh mc.connectAttr("pSphereTarget.worldMesh[0]", node + ".inputTarget[0].inputTargetGroup[0].inputTargetItem[6000].inputGeomTarget") # 4. Enable UV blend mc.setAttr(node + ".inputTarget[0].inputTargetGroup[0].targetBlendUV", 1) # 5. Bind mc.setAttr(node + ".rebind", 1) # 6. Animate weight mc.setAttr(node + ".weight[0]", 0.75)
// Create and bind string $node[] = deformer("pSphere1" -type "interpBlendShape"); connectAttr "nurbsSurface1.worldSpace[0]" ($node[0] + ".inputSurface[0].inputTargetSurface"); setAttr ($node[0] + ".rebind") 1;
The interpBlendShape command adds connected targets, creates empty targets, and removes target data from an existing deformer. It operates in edit mode only and is fully undoable. Targets can be full-weight shapes or in-between shapes at fractional weights.
| Long Name | Short | Type | Description |
|---|---|---|---|
| -name | -n | string | Optional name for the target weight alias. |
| -inBetween | -ib | bool | When set, the target or removal operation applies to an inbetween item rather than the full target. Required when removing a specific inbetween weight. |
| -target | -t | string, uint, string, double | Edit-mode only. Arguments: [baseMesh, targetIndex, targetMesh, weight]. Connects targetMesh as a new blend target on the deformer driving baseMesh, at the given logical targetIndex and blend weight. Weight 1.0 creates a full target; fractional values (e.g. 0.5) create inbetween shapes. |
| -emptyTarget | -et | string, uint | Edit-mode only. Arguments: [baseMesh, targetIndex]. Creates an empty target group that can be populated or sculpted later. |
| -removeTarget | -rt | string, double | Arguments: [targetName, weight]. Pass weight=1.0 to remove the entire target group including all inbetweens. Pass the inbetween weight (e.g. 0.5) with -ib to remove only that specific inbetween item. Inbetween weights are limited to three decimal places. |
import maya.cmds as mc # Add a full target at weight index 1 mc.interpBlendShape("interpBlendShape1", e=True, target=["baseMesh", 1, "targetMesh", 1.0]) # Create an empty target at weight index 2 mc.interpBlendShape("interpBlendShape1", e=True, emptyTarget=["baseMesh", 2]) # Add an inbetween at weight 0.5 on the same target slot mc.interpBlendShape("interpBlendShape1", e=True, target=["baseMesh", 1, "inbetweenMesh", 0.5]) # Remove only the 0.5 inbetween from target "targetMesh" mc.interpBlendShape("interpBlendShape1", e=True, ib=True, removeTarget=["targetMesh", 0.5]) # Remove the entire target group (all items including inbetweens) mc.interpBlendShape("interpBlendShape1", e=True, removeTarget=["targetMesh", 1.0])
The interpBlendShapeEdit command mirrors, flips, splits, duplicates, merges, or rebuilds target data. Geometry edits trigger the appropriate partial rebind on the affected group. The command supports mesh and NURBS curve targets where applicable and is fully undoable.
Internally it uses a BVH (Bounding Volume Hierarchy) for fast closest-vertex lookup during mirroring, and supports four surface association modes for controlling how mirrored deltas are sampled from the source side.
| Long Name | Short | Type | Description |
|---|---|---|---|
| -destinationDeformer | -dd | string | Name of the destination interpBlendShape deformer node. |
| -destinationShape | -ds | string | Name of the target shape to write mirrored points into. Must be a shape driven by the destination deformer. |
| -mirrorMode | -mm | string | Symmetry plane. Accepted values: "YZ" (mirrors across X), "XZ" (mirrors across Y), "XY" (mirrors across Z). |
| -mirrorInverse | -mi | bool | Reverses the mirror direction — copies from the negative side to the positive side instead of the default positive-to-negative. |
| -flipTarget | -ft | bool | Flip mode: instead of one-sided mirroring, copies each half of the mesh to the opposite side simultaneously, creating a fully symmetrical result from the existing deltas. |
| -surfaceAssociation | -sa | string | Controls how mirrored deltas are sampled. Options: "closestPoint" (BVH nearest vertex), "closestComponent", "closestUVGlobal" (UV-space interpolation, mesh only), "closestUVShellCenter" (UV shell centre as mirror axis, mesh only). |
| -splitTarget | -st | bool | Splits the named destination target into directional target data. Use -splitFalloff to control the transition width. |
| -splitFalloff | -sf | double | Non-negative falloff used by -splitTarget. Default: 0.02. |
| -duplicateTarget | -dt | bool | Duplicates the selected target item and its stored target data. |
| -mergeTarget | -mt | bool | Merges the source target specification into the destination target item. |
| -targetItem | -ti | long | Logical target item index used by merge or rebuild operations. The main target item is 6000. |
| -sourceTargets | -sts | string | Serialized source-target specification used by merge operations. Prefer invoking this through the editor UI. |
| -rebuildTargetSource | -rts | bool | Reconstructs editable source geometry from stored target data for the selected target item. |
import maya.cmds as mc # Mirror target from +X to -X using closest point mc.interpBlendShapeEdit( dd="interpBlendShape1", ds="targetMesh", mm="YZ", sa="closestPoint") # Mirror from -X to +X (inverse direction) mc.interpBlendShapeEdit( dd="interpBlendShape1", ds="targetMesh", mm="YZ", mi=True, sa="closestPoint") # Flip entire target symmetrically using UV space mc.interpBlendShapeEdit( dd="interpBlendShape1", ds="targetMesh", mm="YZ", ft=True, sa="closestUVGlobal")
The copyInterpBlendWeights command copies, mirrors, or flips per-vertex weight maps between deformer nodes. It works with both standard Maya blendShape nodes and interpBlendShape nodes as source or destination. The command is fully undoable and uses TBB parallelism and a BVH for fast mirrored-vertex lookup on large meshes.
blendShape into an interpBlendShape and vice versa.
| Long Name | Short | Type | Description |
|---|---|---|---|
| -destinationDeformer | -dd | string | Name of the deformer to write weights into. |
| -destinationShape | -ds | string | Target shape node on the destination deformer to write weights onto. |
| -sourceDeformer | -sd | string | Name of the deformer to read weights from. Omit to mirror within the destination deformer. |
| -sourceShape | -ss | string | Source shape node to read weights from. |
| -mirrorMode | -mm | string | Symmetry plane for mirroring. Accepted values: "YZ", "XZ", "XY". |
| -mirrorInverse | -mi | bool | Reverses the mirror direction (negative to positive side). |
| -noMirror | -nm | bool | Copies weights directly without any mirroring — straight source-to-destination transfer. |
| -flipWeights | -fw | bool | Flip mode: symmetrically swaps weights across the mirror plane, affecting both sides simultaneously. |
| -ignoreNormalize | -in | bool | Skips the weight normalization pass after copying. Useful when you want to set raw values and normalize manually. |
| -surfaceAssociation | -sa | string | Controls vertex matching during mirror. Options: "closestPoint" (BVH nearest vertex, default), "closestComponent". |
import maya.cmds as mc # Mirror weights from +X to -X within the same deformer mc.copyInterpBlendWeights( dd="interpBlendShape1", ds="pSphereShape1", mm="YZ", sa="closestPoint") # Copy weights from a standard blendShape into interpBlendShape (no mirror) mc.copyInterpBlendWeights( sd="blendShape1", ss="pSphereShape1", dd="interpBlendShape1", ds="pSphereShape1", nm=True) # Flip weights symmetrically using closest component mc.copyInterpBlendWeights( dd="interpBlendShape1", ds="pSphereShape1", mm="YZ", fw=True, sa="closestComponent")
Measured on a 250K vertex mesh. The cluster column is included as a reference comparison for weight painting workflows — not a direct equivalent. NA indicates the operation is not supported by that deformer.
| Operation | interpBlendShape | Maya blendShape | cluster |
|---|---|---|---|
| mirrorTarget | 0.109 s | 6.616 s | — |
| flipTarget | 0.098 s | 6.557 s | — |
| mirrorWeights | 0.743 s | — | 358.62 s |
| flipWeights | 1.112 s | — | 360.14 s |
| copyWeights | 1.274 s | — | 401.00 s |
| Feature | interpBlendShape | Maya blendShape |
|---|---|---|
| Requires topological symmetry | No | For best results |
| Works on asymmetric topology | Yes — cleaner vertex matching | Yes — may vary at center seam |
| Cross-mesh weight transfer | Yes | No |
| Vertex matching method | BVH closest-point | Symmetry table |
| Flip mode | Yes (-fw) |
Yes |
| Normalize control | Yes (-in) |
No |
Enable profilingEnabled to print averaged per-section timing to the Script Editor. Results are averaged over profilingSampleRate frames to smooth per-frame variance before printing. The accumulator resets automatically after each report.
# Enable profiling, print every 60 frames mc.setAttr("interpBlendShape1.profilingEnabled", 1) mc.setAttr("interpBlendShape1.profilingSampleRate", 60)
[InterpBlendShape Timing] interpBlendShape1[0] avg(30) total=2.14ms (467 fps) surfCache=0.00 | targetCache=0.00 | partialCache=0.00 envW=0.01 | baseW=0.00 | targetLoop=2.12 uvLoop=1.87 | uvEval=1.54 | nonUvLoop=0.25
| Area | Highlights |
|---|---|
| Sculpt | Surface-aware Sticky and Smooth brushes, Shift-to-Smooth override, immediate private preview, undoable strokes, and dense-mesh prewarming. Target copies are deferred until an automatic commit boundary. |
| UV Stability | Improved handling near NURBS surface edges, periodic seams, and collapsed poles. Sticky/Smooth soften outward motion at open edges while preserving movement along the edge, wrap UVs across periodic seams, and stabilize motion near poles in both CPU and GPU sculpt paths. |
| Editing | Direct vertex edits and Maya mesh brush changes remain visible while transfer is deferred. Tool exit, target changes, Edit off, and saving commit automatically. The Edit column shows an amber pending dot and ... during transfer. |
| Performance | Improved CPU/DG cache reuse, Maya GPU Override buffer handling, dense-mesh preview uploads, refresh scheduling, and target-weight evaluation while editing. |
| Targets | Duplicate, merge, split, rebuild, mirror, and flip operations, plus direct component-edit capture. |
| Weights | New paintable per-vertex targetOffsetWeights layer for controlling where each target uses surface attach / peel-off offset. |
| Cache | Per-target Pending, Cached, Live, Empty, Failed, and Unknown states, with rebuild and retry behavior. |
| UI | Compact editing indicators, separate brush-preparation progress, updated tooltips, diagnostics, and offline activation under Help. |
| Licensing | Signed, machine-bound, perpetual offline activation replaces the previous hardcoded expiry. Workstations and render machines each require activation. |
| Fixes | Sculpt topology checks, retained edits after transfer failure, cancelled saves when transfer fails, deferred per-stroke target copies, selection flashes, duplicate preview wireframes, and cache-state synchronization. |
Wrong build loaded: run the code below. If the path or version is wrong, close the editor and restart Maya before loading the intended build.
import maya.cmds as cmds print(cmds.pluginInfo("interpBlendShape", query=True, path=True)) print(cmds.pluginInfo("interpBlendShape", query=True, version=True))
Edit state out of sync: choose Help → Troubleshooting → Refresh Edit Mode. Use Print Diagnostics to create a support report in the Script Editor.
Amber dot after editing: changes are still pending. Leave the tool, turn Edit off, change targets, or save to transfer them automatically.
Three dots and a brief pause: Maya is copying pending edits and rebuilding the output. Dense meshes and UV/surface binding can make the final commit take a few seconds.
Transfer failed or saving was cancelled: edits remain pending. Restore a deleted target or fix the reported issue, then retry. Keep the scene open until the transfer succeeds.
Target topology does not match: use the base mesh’s vertex count, vertex order, and polygon connectivity. UV Blend does not remap incompatible mesh topology for sculpt editing.
Weight controls are disabled: finish the transfer and leave the active sculpt brush before changing the edited target’s weight.
Cache shows Failed: confirm matching topology, review the Script Editor message, then click the cache state to retry.
GPU unavailable: enable Parallel evaluation and GPU Override, and confirm Maya recognizes a compatible OpenCL device. CPU fallback remains available.
Activation required: choose Help → Activate License..., export a request for this computer, and import its signed license. A license from another computer will not activate this machine.
License agreement appears repeatedly: confirm Maya can write the current user’s preferences. Acceptance is stored locally with the InterpBlendShape UI settings.
The plug-in requires a signed, machine-bound, perpetual offline license for authoring, CPU/GPU evaluation, playback, and rendering. Each workstation and render machine needs its own activation. Maya can load the plug-in and open the activation dialog before activation; geometry evaluation requires a valid license.
There is no hardcoded expiry date or internet check. Windows reinstallation and RAM, GPU, or disk replacement normally preserve the hardware binding. A motherboard replacement or firmware identity change requires a new activation request.
- Open Help → Activate License... in the editor.
- Click Export Request… and send the JSON request to your license provider.
- Click Import License… to import the signed
.ibslicfile returned for this computer. - Confirm the dialog reports Activated, then retry node creation or evaluation.
from interpBlendShape_activation import showUI showUI() import maya.cmds as cmds print(cmds.interpBlendShapeLicense(status=True)) print(cmds.interpBlendShapeLicense(licensePath=True))
The default Windows license location is %LOCALAPPDATA%/InterpBlendShape/license.ibslic. A studio can set INTERPBLENDSHAPE_LICENSE_PATH to an explicit license-file path; the file still needs a valid signature and must match the current computer.
The first editor launch displays the InterpBlendShape End User License Agreement. Acceptance is stored for the current OS user and is requested again only when the agreement version changes. The agreement can be reviewed later from Help → License Agreement.
Individual and Studio license terms below apply in addition to machine activation. Individual users also need a signed activation file.
- Independent individuals and freelancers may use InterpBlendShape without charge on personally controlled equipment, including for paid freelance work.
- Use by or within a studio, company, organization, production team, educational institution, or government body requires a separate Studio License.
- An organization cannot satisfy its Studio License requirement by having workers obtain multiple Individual Licenses.
- Baked or exported deliverables that no longer depend on the plug-in do not require the recipient to hold a license.
- A recipient that loads, evaluates, edits, or renders a scene or rig requiring InterpBlendShape must hold the appropriate license.
scripts/resources/LICENSE.txt included with the software, the full agreement controls.