Product Material Manager

StudioFlyMonkey_ in Presets


Product Material Manager:root{ --paper:#F3F3F0; --surface:#FFFFFF; --surface-2:#E9E9E4; --ink:#15181C; --ink-2:#474D56; --ink-3:#767D87; --rule:#D9D9D2; --rule-2:#C4C4BC; --accent:#2C5C9E; --accent-2:#1E4478; --accent-soft:#E2EAF5; --mark:#E9A227; --mark-ink:#241905; --warn:#A9501B; --warn-soft:#F7E9DC; --good:#2E6A4E; --blender-region:#2E2E2E; --blender-box:#3A3A3A; --blender-sunken:#232323; --blender-widget:#565656; --blender-select:#4772B3; --blender-text:#DCDCDC; --blender-dim:#9A9A9A; --f-display:"Archivo","TeX Gyre Heros","Helvetica Neue",Arial,sans-serif; --f-body:"Source Serif 4",Charter,"Bitstream Charter",Caladea,Georgia,"Times New Roman",serif; --f-mono:"JetBrains Mono","DejaVu Sans Mono",ui-monospace,"SF Mono",Menlo,Consolas,monospace; --step--1:0.815rem; --step-0:1.03rem; --step-1:1.28rem; --step-2:1.6rem; --step-3:2.1rem; --step-4:2.9rem;}@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){ --paper:#131518; --surface:#1B1E22; --surface-2:#23272C; --ink:#E9EAEC; --ink-2:#AFB5BD; --ink-3:#7C848E; --rule:#2C3137; --rule-2:#3A4047; --accent:#7FA9E6; --accent-2:#A6C4F0; --accent-soft:#1B2735; --mark:#E9A227; --mark-ink:#241905; --warn:#DE8B52; --warn-soft:#2A1F16; --good:#6DBE94; }}:root[data-theme="dark"]{ --paper:#131518; --surface:#1B1E22; --surface-2:#23272C; --ink:#E9EAEC; --ink-2:#AFB5BD; --ink-3:#7C848E; --rule:#2C3137; --rule-2:#3A4047; --accent:#7FA9E6; --accent-2:#A6C4F0; --accent-soft:#1B2735; --mark:#E9A227; --mark-ink:#241905; --warn:#DE8B52; --warn-soft:#2A1F16; --good:#6DBE94;}*{box-sizing:border-box}body{ margin:0; background:var(--paper); color:var(--ink); font-family:var(--f-body); font-size:var(--step-0); line-height:1.62; -webkit-font-smoothing:antialiased;}/* ---------- masthead ---------- */.masthead{ border-bottom:1px solid var(--rule); background:var(--surface);}.masthead-inner{ max-width:1180px; margin:0 auto; padding:52px 32px 44px; display:grid; gap:28px; grid-template-columns:minmax(0,1fr) auto; align-items:end;}.eyebrow{ font-family:var(--f-mono); font-size:var(--step--1); letter-spacing:0.14em; text-transform:uppercase; color:var(--ink-3); margin:0 0 14px;}.masthead h1{ font-family:var(--f-display); font-weight:700; font-size:var(--step-4); line-height:1.02; letter-spacing:-0.022em; margin:0 0 16px; text-wrap:balance;}.masthead p{ margin:0; max-width:52ch; color:var(--ink-2); font-size:var(--step-1); line-height:1.5;}.meta{ display:flex; flex-direction:column; gap:8px; font-family:var(--f-mono); font-size:var(--step--1); color:var(--ink-3); text-align:right; white-space:nowrap;}.meta b{color:var(--ink);font-weight:500}.meta a{color:var(--accent);text-decoration:none;border-bottom:1px solid var(--rule-2)}.meta a:hover{border-bottom-color:var(--accent)}/* ---------- shell ---------- */.shell{ max-width:1180px; margin:0 auto; padding:0 32px 96px; display:grid; gap:56px; grid-template-columns:212px minmax(0,1fr); align-items:start;}nav.toc{ position:sticky; top:24px; padding-top:44px; font-family:var(--f-display); font-size:var(--step--1); line-height:1.5;}nav.toc h2{ font-family:var(--f-mono); font-size:0.7rem; letter-spacing:0.16em; text-transform:uppercase; color:var(--ink-3); margin:0 0 12px; font-weight:500;}nav.toc ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}nav.toc a{ display:block; padding:5px 10px; color:var(--ink-2); text-decoration:none; border-left:2px solid var(--rule); transition:color .15s,border-color .15s,background .15s;}nav.toc a:hover{color:var(--ink);border-left-color:var(--accent);background:var(--surface)}main{padding-top:44px;min-width:0}/* ---------- sections ---------- */section{ margin:0 0 72px; scroll-margin-top:24px;}section > h2{ font-family:var(--f-display); font-weight:700; font-size:var(--step-3); letter-spacing:-0.018em; line-height:1.12; margin:0 0 6px; text-wrap:balance;}.sec-num{ font-family:var(--f-mono); font-size:var(--step--1); font-weight:500; letter-spacing:0.12em; color:var(--mark); display:block; margin-bottom:10px;}.lede{ font-size:var(--step-1); color:var(--ink-2); max-width:62ch; margin:0 0 28px; line-height:1.5;}h3{ font-family:var(--f-display); font-weight:600; font-size:var(--step-1); letter-spacing:-0.01em; margin:38px 0 10px;}h4{ font-family:var(--f-mono); font-weight:500; font-size:var(--step--1); letter-spacing:0.1em; text-transform:uppercase; color:var(--ink-3); margin:30px 0 10px;}p{margin:0 0 16px;max-width:66ch}a{color:var(--accent)}strong{font-weight:600;color:var(--ink)}code{ font-family:var(--f-mono); font-size:0.86em; background:var(--surface-2); padding:0.12em 0.38em; border-radius:3px; color:var(--ink);}/* control name pill */.ui{ font-family:var(--f-display); font-weight:600; font-size:0.9em; background:var(--accent-soft); color:var(--accent-2); padding:0.1em 0.45em; border-radius:3px; white-space:nowrap;}/* ---------- figures ---------- */figure{ margin:32px 0; background:var(--surface); border:1px solid var(--rule); border-radius:6px; overflow:hidden;}figure .fig-body{padding:26px 26px 8px;display:flex;justify-content:center}figure svg{max-width:100%;height:auto;display:block}figcaption{ font-family:var(--f-mono); font-size:var(--step--1); color:var(--ink-3); padding:14px 26px 18px; border-top:1px solid var(--rule); margin-top:18px; line-height:1.5;}figcaption b{color:var(--ink-2);font-weight:500}/* ---------- callout key ---------- */ol.key{ list-style:none; margin:24px 0 8px; padding:0; display:grid; gap:14px; counter-reset:key;}ol.key li{ display:grid; grid-template-columns:26px minmax(0,1fr); column-gap:14px; row-gap:1px; align-items:start; max-width:70ch;}/* the ::before marker owns row 1 of column 1; every real child stacks in column 2 */ol.key li > *{grid-column:2}ol.key li::before{ grid-column:1; grid-row:1; counter-increment:key; content:counter(key); font-family:var(--f-mono); font-weight:700; font-size:0.76rem; width:26px;height:26px; display:grid;place-items:center; background:var(--mark); color:var(--mark-ink); border-radius:50%; margin-top:2px;}/* only the label directly under the li becomes a block; inline stays inline */ol.key li > b{ font-family:var(--f-display); font-weight:600; display:block; color:var(--ink); margin-bottom:1px;}ol.key li > span{color:var(--ink-2);display:block;line-height:1.5}/* ---------- steps ---------- */ol.steps{ counter-reset:step; list-style:none; margin:24px 0; padding:0; display:grid; gap:20px;}ol.steps > li{ counter-increment:step; display:grid; grid-template-columns:38px minmax(0,1fr); column-gap:18px; row-gap:1px; max-width:70ch;}ol.steps > li > *{grid-column:2}ol.steps > li::before{ grid-column:1; grid-row:1; content:counter(step,decimal-leading-zero); font-family:var(--f-mono); font-size:0.78rem; font-weight:700; color:var(--accent); padding-top:4px; letter-spacing:0.04em;}ol.steps > li > b{ font-family:var(--f-display); font-weight:600; display:block; margin-bottom:2px;}ol.steps p{margin:0;color:var(--ink-2)}ol.steps p b{font-family:var(--f-display);font-weight:600;color:var(--ink)}/* ---------- tables ---------- */.table-wrap{overflow-x:auto;margin:24px 0;border:1px solid var(--rule);border-radius:6px;background:var(--surface)}table{border-collapse:collapse;width:100%;font-size:0.94rem}th,td{text-align:left;padding:12px 16px;border-bottom:1px solid var(--rule);vertical-align:top}th{ font-family:var(--f-mono); font-size:0.7rem; letter-spacing:0.12em; text-transform:uppercase; color:var(--ink-3); font-weight:500; white-space:nowrap; background:var(--surface-2);}tr:last-child td{border-bottom:none}td:first-child{font-family:var(--f-display);font-weight:600;white-space:nowrap}td span{color:var(--ink-2)}/* ---------- notes ---------- */.note{ border-left:3px solid var(--accent); background:var(--surface); padding:16px 20px; margin:24px 0; border-radius:0 5px 5px 0; max-width:70ch;}.note.warn{border-left-color:var(--warn);background:var(--warn-soft)}.note p{margin:0;color:var(--ink-2)}.note p + p{margin-top:10px}.note .tag{ font-family:var(--f-mono); font-size:0.68rem; letter-spacing:0.14em; text-transform:uppercase; color:var(--accent); display:block; margin-bottom:6px; font-weight:500;}.note.warn .tag{color:var(--warn)}/* ---------- faq ---------- */.faq{border-top:1px solid var(--rule);margin-top:24px}.faq details{border-bottom:1px solid var(--rule)}.faq summary{ font-family:var(--f-display); font-weight:600; padding:16px 30px 16px 0; cursor:pointer; position:relative; list-style:none;}.faq summary::-webkit-details-marker{display:none}.faq summary::after{ content:"+"; position:absolute;right:6px;top:15px; font-family:var(--f-mono); color:var(--ink-3); font-size:1.2rem; line-height:1;}.faq details[open] summary::after{content:"\2212"}.faq summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.faq .answer{padding:0 0 18px;color:var(--ink-2)}.faq .answer p:last-child{margin-bottom:0}/* ---------- support ---------- */.support{ background:var(--surface); border:1px solid var(--rule); border-radius:6px; padding:32px; display:grid; gap:20px; grid-template-columns:minmax(0,1fr) auto; align-items:center;}.support h3{margin:0 0 6px}.support p{margin:0;color:var(--ink-2)}.ig{ font-family:var(--f-display); font-weight:600; font-size:var(--step-1); color:var(--accent); text-decoration:none; border:1px solid var(--accent); padding:12px 22px; border-radius:5px; white-space:nowrap; transition:background .15s,color .15s;}.ig:hover{background:var(--accent);color:var(--surface)}footer{ border-top:1px solid var(--rule); margin-top:40px; padding-top:24px; font-family:var(--f-mono); font-size:var(--step--1); color:var(--ink-3);}/* ---------- responsive ---------- */@media (max-width:900px){ .shell{grid-template-columns:minmax(0,1fr);gap:0;padding:0 22px 64px} nav.toc{position:static;padding-top:32px;border-bottom:1px solid var(--rule);padding-bottom:22px} nav.toc ol{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:2px} .masthead-inner{grid-template-columns:minmax(0,1fr);padding:40px 22px 34px} .meta{text-align:left;flex-direction:row;flex-wrap:wrap;gap:16px} .support{grid-template-columns:minmax(0,1fr)} .ig{justify-self:start}}@media (max-width:520px){ :root{--step-4:2.1rem;--step-3:1.62rem}}@media (prefers-reduced-motion:reduce){ *{transition:none!important;animation:none!important}}/* ---------- print ---------- */@media print{ :root{--paper:#fff;--surface:#fff;--surface-2:#f2f2ef;--ink:#000;--ink-2:#333;--ink-3:#666;--rule:#ccc} body{font-size:10.2pt;line-height:1.5} nav.toc{display:none} .shell{display:block;max-width:none;padding:0 0 0} .masthead{border-bottom:2px solid #000} .masthead-inner{padding:0 0 22px;display:block} .masthead h1{font-size:26pt} .meta{text-align:left;margin-top:14px;flex-direction:row;gap:18px} main{padding-top:22px} section{margin-bottom:26pt;page-break-inside:auto} section > h2{font-size:16pt;page-break-after:avoid;break-after:avoid} h3{page-break-after:avoid;break-after:avoid} /* keep the heading block with the figure it introduces, so a tall figure that jumps to the next page does not strand a heading above a blank one */ .sec-num,.lede{page-break-after:avoid;break-after:avoid} figure{page-break-inside:avoid;break-inside:avoid;border:1px solid #bbb} /* and cap tall diagrams so they fit a page alongside that heading */ figure svg{max-height:105mm;width:auto} figure .fig-body{padding:16px 16px 4px} figcaption{padding:10px 16px 12px} ol.key li,ol.steps > li,.note,tr{page-break-inside:avoid} .faq details{page-break-inside:avoid} .faq .answer{display:block!important} .faq summary::after{display:none} a{color:#000;text-decoration:none} .ig{border:1px solid #000;color:#000}}

Blender Add-on · User Guide · v1.0.0

Product Material Manager

Save a product's materials as named looks, then switch between them from a thumbnail grid — or keyframe them to change across a render.

Version 1.0.0 Requires Blender 5.0+ By tonydoes3d instagram.com/tonydoes3d

Contents

  1. What it does
  2. Install
  3. Quick start
  4. The panel, mapped
  5. Products & objects
  6. Versions
  7. Version setup
  8. How it thinks
  9. Object-linked slots
  10. Animating
  11. Options
  12. Import & export
  13. Troubleshooting
  14. Support
01

What it does

You have one product model and five colourways to render. This add-on stops you from rebuilding the material setup five times.

You tell it which objects make up your product — the bottle, the cap, the label. You set the materials the way you want them and press +. That look is now saved as a version, with every material on every slot remembered.

Change the materials, press + again, and you have a second version. From then on, clicking a thumbnail puts that whole look back on the model instantly. Nothing is duplicated, nothing is baked — it simply reassigns the material slots.

Because the version number is an animatable property, you can also keyframe it. Frame 1 renders the red one, frame 2 the yellow one, and a 5-frame render gives you your whole range.

Good to know

It manages which material sits in which slot. It does not copy, edit, or generate materials — you build those yourself in the Shading workspace, exactly as you always have.

02

Install

Three steps, about twenty seconds.

  1. Open the add-ons list

    In Blender, go to Edit › Preferences › Add-ons.

  2. Install from disk

    Click the dropdown arrow at the top right of that window and choose Install from Disk…. Pick product_material_manager-1.0.0.zip.

  3. Find the panel

    Hover over the 3D Viewport and press N to open the sidebar. There is a new tab down the right edge called Product Materials.

Where your setups are saved

Everything you build lives inside the .blend file itself, so it travels with your scene. To move a setup to a different file, use Export Full Setup — see section 12.

03

Quick start

A worked example: one perfume bottle, two colourways. Five minutes.

  1. Create a product

    Press the + beside the product list. Double-click its name to rename it — say, Perfume Bottle.

  2. Tell it which objects belong to the product

    Select the bottle, the cap and the label in the viewport, then press Add Selected. Only mesh objects are accepted; anything else in your selection is ignored.

  3. Build your first look

    Assign materials normally, in the Material Properties tab. Get the model looking exactly the way you want the first variant to look.

  4. Capture it

    Press the + under Versions. Every material slot on all three objects is recorded. Rename it to RedAndPink in Selected Version Setup.

  5. Build the second look

    Change the materials to your yellow variant. Press + again. You now have two versions.

  6. Switch between them

    Click either thumbnail. The whole model changes at once. The version currently applied shows as a pressed-in button.

  7. Add thumbnails

    Render or screenshot each variant, then load the image into the version's thumbnail slot in Selected Version Setup. Now the grid shows real previews instead of placeholder icons.

04

The panel, mapped

Everything lives in one sidebar tab. Here is what each zone is for, top to bottom.

Product Material Manager Products: Bottle + − Tracked Objects (6) + Add Selected Sync Slots Versions: RedAndPink Yellow Blue Red + − ⧉ Version (keyframe to animate) 1 Selected Version Setup Name: Yellow Untitled.004 Update From Scene Material Overrides: Bottle Glass Glass_Red Options Import / Export Data Help & Support continued 1 2 3 4 5 6 7
Figure 1. The whole sidebar tab, split into two columns to fit the page — the right column continues below the left. Zones 6 and 7 are collapsed sub-panels; click their headers to open them. Diagrams in this guide are drawn to match the add-on's layout; your Blender theme may colour things differently.
  1. ProductsOne entry per product you are managing. A scene can hold several, each with its own objects and versions.
  2. Tracked ObjectsWhich meshes belong to the selected product. Versions only ever touch these.
  3. VersionsThe saved looks, as a thumbnail grid. Click one to apply it.
  4. Version sliderThe same choice as a number. This is the property you keyframe to animate variants.
  5. Selected Version SetupRename the current version, give it a thumbnail, and fine-tune individual material slots.
  6. OptionsBehaviour and grid appearance, plus two repair buttons.
  7. Import / Export and HelpSave the whole setup to a JSON file, and the link for reporting bugs.
05

Products & tracked objects

A product is a named group of mesh objects. Everything else hangs off it.

Products: Bottle Gift Box + − Tracked Objects (3) + Add Selected Sync Slots Bottle Cap Label 1 2 3 4 5 6
Figure 2. The products list and the tracked-objects box. Markers 3–6 only appear once a product exists.
  1. Product listClick a row to make it the active product. Double-click the name to rename it. Everything below the list applies to whichever product is highlighted.
  2. Add & remove product+ creates a product. − deletes the highlighted one along with all of its versions — there is no confirmation, but Ctrl‑Z undoes it.
  3. Expand arrowShows or hides the list of tracked objects. The number in brackets is how many objects are currently tracked, so you can check the count without expanding.
  4. Add SelectedAdds every selected mesh object to this product. Non-mesh objects are skipped, and objects already tracked are not added twice.
  5. Sync SlotsRe-scans your objects and updates every version to match their current material slots. Run this whenever you add or remove a material slot after having captured versions — see the note below.
  6. Remove objectStops tracking that object and strips its entries out of every version. The object itself is untouched.
When to press Sync Slots

A version records one entry per material slot, captured at the moment you pressed +. If you later add a fourth slot to the bottle, your existing versions know nothing about it and will leave it alone.

Sync Slots fixes that: it adds the missing slot to every version (using whatever material is on it right now) and drops entries for slots that no longer exist.

06

Versions

Each version is one complete look: every slot, on every tracked object, remembered together.

Versions: RedAndPink Yellow Blue Red + − ⧉ Version (keyframe to animate) 1 1 2 3 4 5 6 7 8
Figure 3. Versions in list mode — the default view. Each row shows the version's thumbnail as a small swatch. The blue row is the version currently applied to the model.
  1. Grid toggleSwitches to the thumbnail grid (Figure 4). List mode is the compact view: better when you have many versions or a narrow sidebar, and you can rename a version by clicking its name directly.
  2. SwatchThe version's thumbnail image, shown small. Versions without a thumbnail show a generic material icon instead.
  3. Active versionThe highlighted row is the look currently on your model. Click any row to apply it.
  4. Add versionCaptures the materials currently on your tracked objects as a new version, and switches to it.
  5. Remove versionDeletes the active version.
  6. Duplicate versionCopies the active version, including its thumbnail. Useful when a new variant differs from an existing one in only one or two materials.
  7. Move up / downReorders versions. Order matters if you are animating, because the slider steps through them by position.
  8. Version sliderThe active version as a number, starting at 0. Right-click it to insert a keyframe.

Thumbnail grid

Switch the grid toggle on and the same versions become large previews. A Columns field appears next to the toggle, and Thumbnail Size in Options controls how big each preview is drawn.

Versions: 2 RedAndPink Yellow Version (keyframe to animate) 0 1 2 3 4
Figure 4. Grid mode. The toggle turns blue when it is on, and the Columns field appears beside it.
  1. Grid toggle, switched onBlue means the grid is active. The same button in Options is labelled Thumbnail Grid.
  2. ColumnsHow many thumbnails sit side by side. Only appears while the grid is on. Two or three suits a normal sidebar width.
  3. PreviewThe version's thumbnail, drawn large. Set its size with Thumbnail Size in Options.
  4. Version buttonClick to apply. The version currently on the model is drawn pressed in, so you can always see which look is live.
07

Selected Version Setup

Where you name a version, give it a thumbnail, and adjust individual slots without re-capturing everything.

Selected Version Setup Name: Yellow Untitled.004 Update From Scene Material Overrides: Bottle Glass Glass_Red Cap Body Cap_Red 1 2 3 4 5 6
Figure 5. The setup box for one version. Overrides are grouped into a sub-box per object, so a product with six objects shows six groups.
  1. NameRename the version. This is the text shown on its button in the grid, so keep it short — Matte Black reads better than Version 3 final v2.
  2. ThumbnailBlender's standard image picker. The folder icon loads an image from disk — that is the one you want. The icon on the far left drops down a list of images already in the file, the shield keeps the image saved even when nothing uses it, and × clears the thumbnail. Render each variant to a small square image and load it here.
  3. Update From SceneOverwrites this version with whatever is currently assigned in the scene. Use it when you have tweaked a material and want the version to remember the change rather than undo it next time you switch away and back.
  4. Object groupOne sub-box per tracked object, so you can see at a glance which object a slot belongs to.
  5. Slot nameThe material slot's name on that object, exactly as it appears in Material Properties.
  6. Material for this versionChange what this one slot uses in this one version, without touching any other version. This is the surgical edit — useful for a one-material change that does not justify re-capturing the whole look.
Update From Scene vs. editing a slot here

Editing a material field here changes one slot in this version. Update From Scene replaces every slot in this version with the scene's current state. Reach for the first when you know exactly what you want to change, and the second after a round of free-form material work.

08

How it thinks

One diagram that makes the rest of the add-on obvious.

Everything is stored in your .blend file, on the scene. A product owns two lists: the objects it tracks, and the versions you have captured. A version is nothing more than a table of rows, one row per material slot.

Scene Product “Perfume Bottle” tracks remembers Tracked Objects Bottle Cap Label Versions RedAndPink Yellow one row per slot Version “RedAndPink” — material overrides object slot material link Bottle0Glass_Redobject Bottle1Metal_Pinkobject Cap0Cap_Redobject
Figure 6. Applying a version means walking its rows and writing each material into the named slot. That is the whole mechanism.

Three consequences fall out of this, and they explain most of the behaviour people ask about:

Because… …this happens
Rows are captured once Adding a material slot later leaves old versions blind to it, until you press Sync Slots.
Rows point at real datablocks Deleting a material or object leaves gaps. Clean Up Missing Data removes the dead rows.
Only listed slots are written Any object you have not tracked is never touched, no matter how many versions you switch through.
09

Object-Linked Slots

The one option worth understanding properly. It matters the moment you use linked duplicates.

In Blender, every material slot is attached to one of two things: the mesh data, or the object. Data is the default. It rarely matters — until you make linked duplicates with Alt‑D, where several objects share a single mesh.

Share a mesh, and a data-linked slot is shared too. Assign a material to one bottle and all six bottles on the shelf change together. That is exactly wrong for a shelf of colourways.

Option OFF — slots linked to mesh data Bottle.001 Bottle.002 Bottle.003 shared mesh data slot 0 → Glass_Red All three change together one slot, three objects Option ON — slots linked to each object Bottle.001 slot 0 → Red Bottle.002 slot 0 → Yellow Bottle.003 slot 0 → Blue shared mesh data geometry only Each can differ one mesh, three slots
Figure 7. The only difference is where the material slot lives. Geometry stays shared either way — you keep the memory savings of linked duplicates.

So which should you use?

Situation Setting
A shelf of linked duplicates, each a different colourway On. This is what the option exists for.
Only ordinary duplicates (Shift‑D), separate meshes Makes no difference. Leave it on.
You want linked copies to change together, on purpose Off. Keeps them ganged.
You have hand-tuned slot links and want them left alone Off. The add-on will not touch the link setting.
This changes your objects

With the option on, applying a version switches the managed slots to object-linked. That is a real edit to your scene, not just a display setting — and it is what makes per-copy variants possible. It only ever affects slots on tracked objects.

10

Animating variants

Render your whole range in one go by keyframing the version number.

  1. Go to the frame you want

    Set the playhead to frame 1.

  2. Pick the version

    Click the thumbnail for your first variant.

  3. Keyframe it

    Right-click the Version (keyframe to animate) slider and choose Insert Keyframe.

  4. Repeat for each frame

    Move to frame 2, click the next thumbnail, insert another keyframe. Continue for every variant.

  5. Set the interpolation to Constant

    In the Graph Editor or Dope Sheet, select the keyframes and press T › Constant. Without this, Blender smoothly interpolates the number and you get the wrong variant on in-between frames.

  6. Render the animation

    Render frames 1 to n. Each frame comes out as a different colourway.

How it works

The add-on listens for frame changes and re-applies the active version of every product. That means the variant is correct during a background or command-line render, not just in the viewport.

11

Options

Two behaviour settings, two appearance settings, two repair buttons.

Options Object-Linked Slots Thumbnail Grid Columns 3 Thumbnail Size 5.0 Re-apply All Products Clean Up Missing Data 1 2 3 4 5 6
Figure 8. The Options sub-panel, shown with both switches on. Turn Thumbnail Grid off and the Columns and Thumbnail Size fields grey out. The small dot at the right of each row is Blender's keyframe marker.
  1. Object-Linked SlotsPins managed slots to the object rather than the mesh, so linked duplicates can hold different variants. On by default. Explained in full in section 09.
  2. Thumbnail GridThe same toggle as the small grid icon beside the Versions heading. Off gives you a compact name list.
  3. ColumnsHow many thumbnails per row.
  4. Thumbnail SizeHow large each preview is drawn. Raise it for a contact-sheet look; lower it to fit more versions on screen.
  5. Re-apply All ProductsForces every product back onto its active version. Use it if something has drifted — you hand-edited a material, appended objects, or undid past a version switch.
  6. Clean Up Missing DataRemoves tracked objects and override rows that point at deleted data. The panel warns you in red when there is anything to clean.
12

Import & export

Move a setup between files, or keep it under version control.

Export Full Setup writes every product, version and material assignment to a JSON file. Import Setup reads one back. Both live in the Import / Export Data sub-panel.

Import offers a Replace Existing Products checkbox. Leave it off to append the imported products alongside what you already have; switch it on to clear the list first.

Matching is by name

Import finds your objects and materials by their names. If the target file calls the bottle Bottle.001 instead of Bottle, that row is skipped.

When anything is skipped you get a warning saying how many objects and materials were missing, and the full list is printed to Window › Toggle System Console.

What a file contains

Each product stores its name, its tracked object names, and its versions. Each version stores its name, its thumbnail path, and one row per material slot — the object name, the slot number, the material name, and whether the slot was object- or data-linked.

Thumbnail paths are written relative to the .blend where possible. If a thumbnail cannot be found at import time, the add-on also looks for a file of the same name sitting next to the JSON.

13

Troubleshooting

The things people hit first.

Switching versions does nothing

Almost always the object is not tracked. Expand Tracked Objects and check it is listed — the count in brackets tells you quickly.

If it is listed, the version may have been captured before that object was added. Press Sync Slots, then Update From Scene on each version.

All my linked duplicates change at once

Switch on Object-Linked Slots in Options, then click each version once to re-apply it. See section 09 for why.

A new material slot is being ignored

Versions record slots as they were when captured. Press Sync Slots to bring every version up to date with the object's current slots.

Thumbnails are blank or show a generic icon

A generic material icon means no image is assigned — load one via Open in Selected Version Setup.

If an image is assigned but shows blank, the file has probably moved. Blender's Image Editor will show it as missing. Consider File › External Data › Pack Resources to embed thumbnails in the .blend.

Red warning: deleted objects still referenced

You deleted an object that was being tracked. Press Clean Up in the warning, or Clean Up Missing Data in Options. Nothing is broken in the meantime — dead rows are skipped when versions are applied.

The wrong variant appears on in-between frames

Your keyframes are interpolating. Select them in the Dope Sheet and set interpolation to Constant with T.

I can't find the panel

Hover the mouse over the 3D Viewport and press N to open the sidebar, then look for the Product Materials tab down the right edge. If the tab is not there, the add-on is installed but not ticked — check Edit › Preferences › Add-ons and search for “Product Material Manager”.

14

Support

Found a bug, or stuck on something?

Send me a message on Instagram. To get a useful answer fast, include your Blender version, what you were doing when it broke, and anything printed in Window › Toggle System Console.

@tonydoes3d

There is a shortcut to this in two places inside Blender: the Help & Support sub-panel at the bottom of the sidebar, and the add-on's own entry in Preferences.

Product Material Manager 1.0.0 · requires Blender 5.0 or newer · GPL-2.0-or-later · by tonydoes3d
$5

Support Period Included

Includes 12 months of

Extend this product’s Support Period +12 months: 50% of product price

Have questions before purchasing?
Login to message

Details
Blender Extension Compatible Yes
Published about 2 months ago
Blender Version 4.5 - 5.2
Extension Type Add-on
Render Engine Used Arnold, Cycles, Eevee, Octane
License GPL