What's new 1.0.70 I stopped ticking Override for Windows, Mac, Linux when you cap texture max size. Maps that need to stay sharp were getting blotched and blurred — a freckles texture was the one that showed it. Max size writes the Default size only now. If a texture already had that override on, I still update that platform size. On Textures, On / Off / Ignore and Confirm sets that Unity override on every listed texture. Confirm writes now. You do not need Apply after that. It is all on or all off for the whole model. I may add per-texture control later. For now it stays your choice, and it starts off so those maps stay sharp. Scan no longer leaves that extra assemble window open after it builds the On Upload copy. UI — Textures (PC): Override for Windows, Mac, Linux sits under Max Size By Type, above Max Sizes Only. On / Off / Ignore, then Confirm. 1.0.69 I added a cap for Action and Expression Menu icons. On Upload walks the assembled menus and only resizes icons that are actually on those controls. 256, 128, or 64. If none are larger than the pick, I skip that step. Copies stay on the upload clone. An icon that is also on a material stays on that material; the menu gets its own copy. Textures can write the same cap on the importer. That row starts off. I only list icons from the menus on the avatar in the scene, and I leave an icon that is also on a material alone. Menus that only show up after upload assembly are not in that list — use On Upload for those. UI — On Upload: Cap Action / Expression Menu icons sits under Menus, after Contacts. It starts on at 256 when Apply on upload is ticked. UI — Textures: Action / Expression Menu icons sits at the bottom of Max Size By Type. 256, 128, or 64. It starts off. A note under the type list says to use On Upload for menus that appear only after assembly. 1.0.68 I added Merge basic meshes on On Upload. It is off unless you turn it on. It combines always-visible MeshRenderer bits that share a parent — hair clips, glasses, that kind of thing. Extra renderer components come off; the objects stay. Toggles, transform animations, and anything another component still points at stay separate. UI — On Upload: Merge basic meshes sits under Meshes, after Merge skinned meshes. It starts off. 1.0.67 I fixed On Upload stuffing extras onto the body when they still have their own bones. You would change the pants and the tail or the straps would jump. Those stay on their own bones now. I do not dump leftover weights onto Chest. If another upload pass is still on the copy, I wait. I do not take those components off. EditorOnly objects that still have something on them stay. PhysBones on those leftovers stay too. 1.0.66 I added unused contacts to On Upload. It takes off contact senders and receivers that are disabled and never turn on. Enabled senders stay, so other avatars can still hit you. If a receiver still feeds a parameter into FX, menus, or Expression Parameters, I leave it. I also leave anything on your Ignore List, contact-system names, and anything else on the avatar that still points at a contact. You do not have to open the window for that default — Unity writes it when the project loads. Apply on upload stays off unless you already had it on. UI — On Upload: Remove unused contacts sits under Contacts, after PhysBones. It starts on when Apply on upload is ticked. UI — Profiles: the On Upload tab checkbox lists contacts. 1.0.65 Rank can Confirm mesh Read/Write On or Off. That writes the model importers now. PC still uploads if it stays off; rank stays Very Poor. I turned PC Enable mesh Read/Write off on Meshes by default. Quest Apply no longer writes that importer flag. On Quest, On Upload can copy unread meshes onto the upload clone so Quest sees them readable. The FBX in your project stays as it is. That needs Apply on upload. UI — Rank: Mesh Read/Write is a warning on PC, not red. On / Off / Ignore and Confirm sit under Hidden cost, below empty animator states. UI — Rank: Quest still uses red for Mesh Read/Write off. The color-key Red line is only on Quest / Android Workspace. UI — Meshes (PC): Enable mesh Read / Write is off by default. UI — Meshes (Quest): Enable mesh Read / Write is gone from this tab. UI — On Upload (Quest): Enable mesh Read / Write sits under Meshes. 1.0.64 On Upload now waits until other upload passes finish, and it only runs once on that copy. It can optimize finished unsaved meshes that are already on this avatar's skeleton. Dry Run On Upload, Create optimized copy, and Rank's On Upload column assemble those other passes on a hidden copy first when that pipeline is in your project. UI — On Upload: the intro and merge tooltip say finished meshes on this skeleton can merge, including unsaved ones copied into Generated. Extras that still have their own armature stay. UI — Rank: Unique Materials has Now, On Upload, and Change. A note under the On Upload header says whether the hidden copy was assembled. UI — Rank: the tab intro says the On Upload column is a hidden copy, assembled first when other upload passes are in the project. Texture VRAM stays on Now. UI — On Upload: Create optimized copy and the note under it say other upload passes run on the clone first when they are in the project. 1.0.63 I keep audio sources on On Upload, and the objects that hold them. UI — Textures: with Crunch Enable on, Reset all to 50 sits to the right of the global Crunch Compression % slider. UI — On Upload: Remove unused components and Remove unused GameObjects say audio sources stay. 1.0.62 I cut the header logo to half height. UI — The header logo is half as tall. UI — One short note sits above PC Workspace and Quest / Android Workspace: Confirm, Fix, and Apply write into this project and stay on the assets. Scan only reports. The avatar-only drop note and the per-workspace write notes are gone. 1.0.61 On Upload no longer cancels your VRChat upload when a leftover skinned renderer has no mesh. 1.0.60 On Upload leaves unused objects, bones, PhysBones, material slots, and meshes that other components on your avatar still point at. UI — On Upload: Remove unused GameObjects, Keep only weighted bones, Disable PhysBones when unused, Merge identical material slots, Allow shuffling material slots, and Merge skinned meshes say extra components keep what they reference. 1.0.59 On Upload keeps blend shapes that other components on your avatar still name. UI — On Upload: the Apply on upload note Follows this Unity editor, not the project. is orange. UI — On Upload: Remove unused blend shapes says those named shapes stay. 1.0.58 UI — On Upload: Apply on upload has a small note next to it: Follows this Unity editor, not the project. 1.0.57 UI — Setup: Drop your VRChat avatar here takes the avatar immediately. Contents Of Selected Model shows Reading this avatar… while that list fills. Ticking other options no longer rebuilds that list. 1.0.56 UI — Setup: one avatar slot. Dropping another replaces it instead of stacking. On Upload applies your Ignore List on VRChat's upload copy. Merge no longer turns extra objects off. I remove leftover renderers so PhysBones and contacts keep working and Skinned Meshes rank drops. Merge keeps extra UV channels, vertex colors, and extra bone weights, and expands bounds so combined extras do not clip. I leave meshes with material-swap animations alone. I still drop unused blend shapes even if Special has blend-shape import Off. UI — On Upload: the merge tooltip says extra objects stay so PhysBones and contacts keep working. 1.0.55 If On Upload stops, the Console shows you why I cancelled the VRChat upload. 1.0.54 UI — Textures On This Model: the list box is a little wider so the bottom scrollbar is gone. 1.0.53 UI — Setup: Clear Log Cache sits next to Write Log File. It deletes files under Logs/KaleidoVR/Optimizer and leaves the folder. 1.0.52 UI — Textures On This Model: with Crunch Enable on, each PC row shows a Crunch % slider under Current / New. A moved slider is remembered. Matching the global % follows that slider again. 1.0.51 UI — Textures: Crunch compression moved here and up in the list. 1.0.50 UI — On Upload: the Optimize FX warning is 18pt. Didn't like how big 24pt was. 1.0.49 UI — On Upload: the Optimize FX warning is twice as large. UI — Textures On This Model: only a small gap remains after the Ignore checkboxes. The empty strip to the right of the list is gone. 1.0.48 On Upload can merge extras after other upload passes have attached them to this avatar's skeleton. Extras that still use their own armature stay separate. Textures On This Model stays centered when the window is wide. 1.0.47 On Upload no longer parks hair, ears, and other extras in T-pose when meshes merge. Bind poses move with the vertices. I leave extras that still use their own armature alone until other upload passes attach them. 1.0.46 I made the Optimize FX warning a bit larger. 1.0.45 Optimize FX layer is off by default and shows a warning. Open the window once so existing projects pick that up. Hand gesture clips stay as-is when Optimize FX runs (detected by GestureLeft / GestureRight). After a successful VRChat upload, I clear Generated. Optimized Copies that used that cache are removed and the original is turned back on. 1.0.44 Create optimized copy asks first. The clone is for checking what a VRChat upload will do. Do not edit it or use it as the master. The original is turned off, not deleted. 1.0.43 Remove unused blend shapes keeps Eye Look blink / look-up / look-down and rewrites those descriptor indices, so idle no longer drives leftover smiles. Apply on upload is off by default. Open the window once so existing projects pick that up. On Upload has Clear cache for generated meshes and FX in Assets/KaleidoVR/Generated. With no avatar on Setup, Rank shows Select a model on Setup instead of Scan Performance. The On Upload splash stays on screen for the whole pass, with the loading bar inside it. 1.0.42 Splash and loading bar only appear on a VRChat upload. Create optimized copy in the scene no longer shows them, and no longer logs a layout error. 1.0.41 On Upload writes generated meshes and FX controllers as assets in Assets/KaleidoVR/Generated so VRChat can pack them. A missing mesh aborts the upload instead of sending an invisible avatar. A splash and a loading bar show while On Upload runs. The Special warning stays on the Special tab. Profiles is only for saving and loading. Apply on upload runs for any avatar once the tool is in the project. Turn it off on the On Upload tab if you want a raw upload. 1.0.40 On Upload meshes stay in the build so the avatar does not go invisible in-game or on the scene copy. A Kaleido splash and a Console line show when On Upload runs. Rank Scan / Dry Run adds Now / On Upload / Change next to the performance stats. 1.0.39 On Upload no longer bakes leftover blend-shape weights into the face. Unused shapes drop only at zero weight. Blink / wink / squint stay, and I restore weights by name after a strip. Merge same-ratio blend shapes is off by default. The two tab rows use the same four-column widths. Open the window once so existing projects pick up the new default. 1.0.38 I linked in features that were already in the works. On Upload tab: merge meshes that animate together, merge identical material slots, unused blend shapes, unused components, unused bones, unused PhysBones, and FX cleanup. Those options run on the assembled upload copy. Your scene and source assets stay as they are. I leave meshes and markers I did not create alone. Setup Ignore List skips those objects. Upload skips Play Mode. Scan, Dry Run, and Apply stay on importer, Scene, and Special writes. Dry Run On Upload and Create optimized copy live on that tab. Standard is the default built-in. Type max-size caps, format rewrite, weld, bone-quality cuts, Scene disables, and Special stay off. Open the window once so existing projects pick up the new defaults. 1.0.37 Ignore on Textures On This Model no longer greys out Set. Ignore skips the type cap; Set still writes that texture by hand. I remember Ignore and Set per texture so they come back on later runs. Undo on Enable / Disable rows clears the checkbox after a successful restore, so Recalculate bounds does not stay Enable. 1.0.36 Texture importer on/off options are Enable, Disable, or neither, with Current and New. Neither leaves each listed texture as-is. Special on/off options use the same layout. Enable can turn lights, cameras, stereo, and blend-shape import back on. Apply only shows the Special warning when a Special write is not at its default. Leaving Set compression, mesh compression, Humanoid, Recalculate bounds, and crunch at Disable does not prompt. Opening the window once turns Set compression off if an older install had left it on, so listed textures keep the author's format unless you Enable it. Dry Run / Apply log lists the chosen writes, then each texture as Old -> New. 1.0.35 Textures On This Model uses less inner padding, and the window opens wide enough to keep the Ignore checkboxes on screen. Current, New, and Ignore headers sit over their columns. Recalculate skinned bounds keeps Center Y at 0 so the 2 m cube sits on the mid-body instead of below it. 1.0.34 Recalculate skinned bounds writes a 2 m cube (inspector Extent 1 / 1 / 1) centered on the avatar middle, the same box on every skinned mesh. This replaces the old tiny local-space boxes that clipped meshes when Update When Offscreen was off. I skip light meshes used only for contact systems. After Apply has written a checked option, Undo sits beside it and restores the previous values. The Special tab shows a centered red Warning (Special Use Case). Apply asks again when any Special option is on. Apply mesh compression has a Compression Level dropdown (Off / Low / Medium / High). Crunch has a Crunch Compression % slider (1-100). Thanks to epic6g for reporting the Recalculate skinned bounds clip, and for catching that the body MainTex was landing under Other instead of Albedo (fixed in 1.0.33). 1.0.33 Textures used as the main color slot (MainTex, and the standard BaseMap / BaseColorMap slots) follow the Albedo / Diffuse / Main size checkbox instead of Other. Normals, masks, emission, and matcaps stay on their own checkboxes, including when the filename already says that. Other slots stay unclassified. Textures On This Model has an Ignore checkbox to the right of New max size. A checked row keeps its current max size. Dry Run and Apply skip that size write. Thanks to epic6g for reporting that the body MainTex was classified under Other. 1.0.32 Even space above and below the header logo, so it is not flush against the window or the title. 1.0.31 I cut the empty band above the header logo. The logo draws where the artwork starts. Kali_Logo.png is cropped to the art (400x209 instead of 400x400). 1.0.30 I centered the Scan / Dry Run / Apply color key under those buttons. The color words sit on the same line as the text beside them. 1.0.29 UI — The Scan / Dry Run / Apply color key sits on one straight line. 1.0.28 Normal map previews stay inside the texture list. UI — README: I resized the header image. 1.0.27 Normal maps preview in blue. I rebuild the channel BC5 drops. 1.0.26 Copyright is KaleidoVR. I dropped the open license. 1.0.25 I sized the Credits window to the logo, the text, and the buttons. 1.0.24 Scan is blue, Dry Run is orange, Apply is green. 1.0.23 I put KaleidoVR Credits last on the KaleidoVR menu. 1.0.22 UI — Rank: highlight colors sit at the top of the tab. 1.0.21 From Rank you can turn streaming mip maps on, and convert leftover Unity constraints. 1.0.20 Rank highlights problems. You can fix Write Defaults and empty states from that tab. 1.0.19 Scan, Dry Run, and Apply keep the same names in both workspaces. Switching back to PC Workspace works. 1.0.18 Rank scans VRAM and animator cost. I added Auto BC7/DXT1 and an Everything profile. 1.0.16 Apply Max Sizes Only stays on after a Dry Run that finds size writes. 1.0.15 Each texture Set dropdown starts at the size you already have, not the type cap. 1.0.14 Raising a texture Set asks you to Confirm or Cancel. 1.0.13 Raising a texture max size from a row selector asks you to Confirm first. 1.0.12 Type caps never raise a texture. A row that would go up shows orange. UI — Textures: Max Size By Type labels are shorter. 1.0.11 UI — Textures: Will apply and the arrow sit centered between Current and New. 1.0.10 UI — Textures: Will apply sits between Current and New. The extra status line is gone. 1.0.9 You can revert a texture max-size write one at a time. Max Sizes Only writes sizes and leaves the other importer flags alone. UI — Textures: the row labels are shorter. 1.0.8 UI — Textures On This Model: each row shows Current and New max size. 1.0.7 A texture Set dropdown writes that size when you change it. 1.0.6 UI — outlined scroll lists have more left and right padding so rows sit off the border. 1.0.5 PC and Quest are separate workspaces. Each has its own Scan, Dry Run, and Apply. 1.0.4 You can export and import profiles as JSON. UI — more space on the Setup drop and the texture list. 1.0.3 I added Textures On This Model, Quest settings, and Dry Run before Apply. 1.0.2 Rank limits match VRChat's avatar performance rules. 1.0.1 The tool lands in Assets/KaleidoVR/Editor with the other KaleidoVR Unity tools. 1.0.0 First public release. Install the GitHub .unitypackage, or copy KaleidoVR into Assets.