Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
276 commits
Select commit Hold shift + click to select a range
abac369
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Nov 23, 2023
5dcfbfc
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Nov 23, 2023
f4c7731
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Nov 29, 2023
60dc8ea
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Nov 29, 2023
99eeab4
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Dec 7, 2023
9688148
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Dec 7, 2023
5bc3f31
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Dec 7, 2023
4d0e6c4
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Dec 7, 2023
92ea0d9
Switch to using regular Unity Audio Source
andybak Dec 7, 2023
d69ed99
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Dec 20, 2023
4d44d47
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Dec 20, 2023
8bce9af
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Jan 1, 2024
f872037
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Jan 1, 2024
e4d601c
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Feb 28, 2024
1bb4ce3
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Feb 28, 2024
15d69e0
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Mar 5, 2024
5843f6c
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Mar 5, 2024
ecb1ecf
Merge branch 'main' into feature/audio-widget
andybak Mar 10, 2024
b009637
Remove broken custom drawer and fix corrupted value
andybak Mar 10, 2024
47fb115
The initial clip is playing at least...
andybak Mar 10, 2024
b67e917
Handle most supported audio formats.
andybak Mar 10, 2024
a9f0c66
Save play state properly.
andybak Mar 10, 2024
514c31f
Visual tweaks to sound widget
andybak Mar 11, 2024
795afc0
Merge branch 'main' into feature/audio-widget
andybak Mar 11, 2024
7084c19
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Apr 3, 2024
8712b5d
dotnet-format
andybak Apr 3, 2024
cbedfc4
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Apr 3, 2024
377cde6
dotnet-format
andybak Apr 3, 2024
738090e
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Apr 7, 2024
002a540
Merge remote-tracking branch 'upstream/main' into feature/push-pull
andybak Apr 7, 2024
98c4505
Merge remote-tracking branch 'upstream/main' into feature/audio-widget
andybak Apr 27, 2024
ca0f1a5
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak May 2, 2024
83b7d13
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak May 2, 2024
c29954f
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak May 3, 2024
76ee573
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak May 3, 2024
c00daff
Post-merge fixes
andybak May 4, 2024
48defae
Formatting
andybak May 5, 2024
3226029
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak May 19, 2024
e85604a
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Sep 15, 2024
2d91bb6
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Sep 15, 2024
0cd20fc
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Dec 22, 2024
a34108d
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Dec 22, 2024
51d6248
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Jan 13, 2025
c4ad870
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Jan 13, 2025
3954289
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Feb 27, 2025
c5223b0
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Feb 27, 2025
159f5bc
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Apr 21, 2025
2f81602
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Apr 21, 2025
ad96512
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak May 1, 2025
b2a006e
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak May 1, 2025
b2387ab
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak May 1, 2025
225df96
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak May 1, 2025
0b39553
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Jun 25, 2025
1b918f8
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Jun 25, 2025
52a499c
Post-merge fix
andybak Jun 25, 2025
46784bd
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Jun 26, 2025
60687be
[CI BUILD]
andybak Jun 26, 2025
df29659
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Jun 26, 2025
e509ad2
[CI BUILD]
andybak Jun 26, 2025
9d2119d
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Dec 10, 2025
18f542e
Merge remote-tracking branch 'origin/main' into feature/audio-widget
andybak Dec 10, 2025
297d2c3
Editor helper to generate support files for https://github.com/icosa-…
andybak Dec 21, 2025
944704b
Merge branch 'main' into feature/various-plugin-improvements
andybak Jan 1, 2026
4078d6a
Add SharpQuill library and load.quill API endpoint
andybak Jan 1, 2026
e2e2f83
Add meta file for SharpQuill folder
andybak Jan 1, 2026
ea38818
Add missing SharpQuill files to fix compilation errors
andybak Jan 1, 2026
68a7aed
Add SharpQuill
andybak Jan 1, 2026
beca078
Initial implementation
andybak Jan 1, 2026
5523ba8
Fix comments
andybak Jan 1, 2026
7748d9d
More efficient loading
andybak Jan 1, 2026
bc7c3b1
Reasonable MVP version
andybak Jan 2, 2026
fc94ce4
Support for elliptical tube brushes
andybak Jan 2, 2026
f88598b
dotnet-format
andybak Jan 3, 2026
0c789f3
Fix IL2CPP issues
andybak Jan 3, 2026
a4ad023
Per-point color support
andybak Jan 10, 2026
3af937d
Simplify control point color code slightly
andybak Jan 10, 2026
f2d09da
Fix save format for backwards compat
andybak Jan 10, 2026
221f4f3
Merge remote-tracking branch 'origin/main' into feature/quill-import
andybak Jan 10, 2026
f16bfd9
Remove unused imports
andybak Jan 11, 2026
ec347d6
Support color overrides while painting and related fixes
andybak Jan 11, 2026
e0a0ab7
Fix save/load now we are using list not array
andybak Jan 11, 2026
9a63026
my No OP Refactor contained an error
andybak Jan 11, 2026
26880c0
Per point color for remaining brushes (except for Hull)
andybak Jan 11, 2026
db09090
Start on DrawStrokes support for per point color
andybak Jan 11, 2026
1ffd2fe
dotnet format
andybak Jan 11, 2026
ec2532c
Per point color support for hull brushes
andybak Jan 11, 2026
6b8ff80
Lua commands for setting all pointer color overrides
andybak Jan 11, 2026
cbdd507
Support nullables in color override list and fix the tilt save/load t…
andybak Jan 13, 2026
b24dbd6
typo
andybak Jan 13, 2026
c07445f
dotnet format
andybak Jan 13, 2026
7c431b9
Create prefabs and assets for Quill brushes
andybak Jan 13, 2026
e4efa77
Assign prefabs
andybak Jan 13, 2026
c425fcc
Use marker as the material for quill brushes
andybak Jan 13, 2026
682bd03
Getting better fidelity to original Quill meshes
andybak Jan 13, 2026
9007e03
order independent transparency
andybak Jan 14, 2026
2881600
Merge branch 'main' into feature/quill-import
andybak Jan 14, 2026
accf1bc
Revert unintentional changes to Quality Settings
andybak Jan 14, 2026
4a2a326
Move Quill handling code into it's own class
andybak Jan 14, 2026
b5d250a
Disable width smoothing for Quill brush
andybak Jan 14, 2026
44b7ab1
Respect vertex opacity for quill import
andybak Jan 14, 2026
3197462
Brushscript subclasses specifically for Quill
andybak Jan 14, 2026
d59ef3c
Superclass changes to support the new subclasses
andybak Jan 14, 2026
547f5d6
Switch prefabs to use the new subclasses
andybak Jan 14, 2026
3412fac
Don't overwrite alpha for flat brushes
andybak Jan 14, 2026
c47fcd5
Layer transform fixes
andybak Jan 15, 2026
418a7d9
Move Quill brushes to "compatibility" list so they don't appear in th…
andybak Jan 15, 2026
180089e
Quill brush name localization strings
andybak Jan 15, 2026
07fcb0e
dotnet-format
andybak Jan 15, 2026
f5ebf14
Quill image layer support
andybak Jan 17, 2026
408896b
add some parameters to tweak alpha response
andybak Jan 17, 2026
f27a243
Merge branch 'feature/various-plugin-improvements' into feature/quill…
andybak Jan 22, 2026
9c1fa93
Fix paths for skill generator output
andybak Jan 22, 2026
24ec349
Add ColorOverrideMode enum to lua api
andybak Jan 22, 2026
56b3419
Auto-generated lua automcomplete update
andybak Jan 22, 2026
e913f15
Rider plugin package update
andybak Jan 22, 2026
d1fa844
Cosmetic changes to manifest
andybak Jan 22, 2026
84ed1f0
Update packages-lock.json
andybak Jan 22, 2026
5b5a10f
Merge branch 'main' into feature/quill-import
andybak Feb 2, 2026
973f85a
Example plugins for color override
andybak Feb 4, 2026
f03583d
Extend quill support to include IMM files
andybak Feb 4, 2026
d95e680
Merge branch 'feature/quill-import' of https://github.com/icosa-found…
andybak Feb 4, 2026
e6dbab3
Better handling of nested layer properties
andybak Feb 5, 2026
26de44d
dotnet format
andybak Feb 5, 2026
0a4a590
Point to git for the ImmStrokeReader plugin instead of embedding locally
andybak Feb 6, 2026
caf8873
Improve stroke orientation in quill import.
JoanCharmant Jan 31, 2026
aa06fe1
Make sure to use the override of ComputeFrame for small distances bet…
JoanCharmant Jan 31, 2026
9426339
Quill import: fix color space.
JoanCharmant Jan 31, 2026
bde29e4
QuillEllipse brush: fix minor scale value that was reset to the defau…
JoanCharmant Feb 1, 2026
c9aa760
TubeBrush: fix in ModifySilhouetteOfSegment to use directions relativ…
JoanCharmant Feb 1, 2026
a69956b
TubeBrush: minor refactoring and ensure displacement direction is alw…
JoanCharmant Feb 1, 2026
b887daf
Quill brushes: deduplicate the function that calculates the safe orie…
JoanCharmant Feb 1, 2026
9e963c1
Merge branch 'pr-994' into feature/quill-import
andybak Feb 7, 2026
49bcd4e
Initial implementation of a UI for quill and Imm files
andybak Feb 8, 2026
92a0123
Merge branch 'main' into feature/audio-widget
andybak Feb 9, 2026
1c44761
UI and path fixes
andybak Feb 9, 2026
9015910
Fix some stuff broken in previous merges from main
andybak Feb 9, 2026
dc110b6
Merge branch 'main' into feature/quill-import
andybak Feb 9, 2026
edffb70
Merge remote-tracking branch 'origin/main' into feature/push-pull
andybak Feb 10, 2026
1844775
Merge branch 'main' into feature/quill-import
andybak Feb 10, 2026
f5f5b75
Post-merge fixes
andybak Feb 10, 2026
785d312
Switch to upm branch for upm package and remove dup SharpQuill code f…
andybak Feb 11, 2026
2c13607
Update packages-lock.json
andybak Feb 11, 2026
0b09d41
Merge branch 'main' into feature/push-pull
andybak Feb 13, 2026
f6ea0d9
Merge remote-tracking branch 'origin/feature/quill-import' into featu…
andybak Feb 13, 2026
093002e
Merge branch 'main' into feature/audio-widget
andybak Feb 13, 2026
2e94014
Merge remote-tracking branch 'origin/feature/quill-import' into featu…
andybak Feb 13, 2026
43b6dfd
Tint Color Tool (wip)
andybak Feb 13, 2026
aa040d5
Fix merge issue
andybak Feb 13, 2026
21cf990
Fix script errors
andybak Feb 13, 2026
e940b71
defensive null stuff for secrets
andybak Feb 14, 2026
4d5447d
catch another null error
andybak Feb 14, 2026
0a287cf
defensive null stuff for secrets
andybak Feb 14, 2026
99809d6
Basic working color tint tool prototype
andybak Feb 14, 2026
00d5f3b
Constant size for audio widgets
andybak Feb 14, 2026
10ea00a
Tweak UI / waveform display (wip)
andybak Feb 14, 2026
f95137a
Update packages-lock.json
andybak Feb 15, 2026
c5ebba8
Audio and UI fixes
andybak Feb 16, 2026
d1b7386
Quill Panel UI Fixes
andybak Feb 16, 2026
51747e4
update stroke reader package
andybak Feb 16, 2026
fdc0517
wip
andybak Feb 16, 2026
86936b0
Merge remote-tracking branch 'origin/feature/push-pull' into feature/…
andybak Feb 16, 2026
f73c0be
Fix bug with selections on transformed layers
andybak Feb 16, 2026
6129af9
Add back in new tool prefabs
andybak Feb 16, 2026
853e1aa
Tools start off disabled
andybak Feb 16, 2026
9c51af2
Fix selection grabbing for layers with non-identity transforms
andybak Feb 16, 2026
41e71a4
Remove debug logging
andybak Feb 16, 2026
4a375ef
Revert "Fix bug with selections on transformed layers"
andybak Feb 17, 2026
2422846
Force identity transforms for all layers
andybak Feb 17, 2026
227bd5a
Cosmetic
andybak Feb 17, 2026
3c00ebd
HasInstances was left over from video code and doesn't work here
andybak Feb 17, 2026
aff4c36
Sound clip widget UI and bug fixes
andybak Feb 17, 2026
4776e97
dotnet format
andybak Feb 17, 2026
f27770c
Tint and push/pull tool UI fixes
andybak Feb 17, 2026
68ea80a
Move tint and push/pull to labs panel
andybak Feb 18, 2026
a9f4e65
Load quill scenes like sketches - confirm if needed and load in compo…
andybak Feb 18, 2026
c5bc59b
Tint amount slider
andybak Feb 18, 2026
68f955f
Clear to black when loading Quill sketches
andybak Feb 18, 2026
b7e8511
Open Quill panel from Extra panel button
andybak Feb 18, 2026
c541d81
Quill panel UI fixes
andybak Feb 18, 2026
d33aafd
Single undo for tint color uses
andybak Feb 18, 2026
61e7786
Tweak some constants
andybak Feb 18, 2026
f3561bc
Group the undo for push/pull
andybak Feb 18, 2026
939ac91
Tools begin inactive
andybak Feb 18, 2026
843481c
Some automatic Photon changes
andybak Feb 18, 2026
13c5999
Add Steam Audio as a UPM package
andybak Feb 18, 2026
eb93043
Utility script to copy old Resonance settings to Steam Audio
andybak Feb 18, 2026
feccdde
Enable spatialization on soundclip widget
andybak Feb 19, 2026
1dd8390
Update CopyGvrToAudioSource.cs
andybak Feb 19, 2026
2ab6a75
the results of running the editor script to set spatialisation proper…
andybak Feb 19, 2026
7206a24
Export sound clips to gltf
andybak Feb 19, 2026
c931727
Basic audio import
andybak Feb 19, 2026
a1fe1d7
Fixes for gltf audio import
andybak Feb 20, 2026
de51cef
Handle audio more correctly when breaking apart gltf models
andybak Feb 20, 2026
211d4e2
Apply Quill background color when loading a sketch
andybak Feb 20, 2026
d655926
disable the gltf export standin by default
andybak Feb 20, 2026
aa864da
360 background image for quill import
andybak Feb 21, 2026
6dc5103
wip1
andybak Feb 21, 2026
3d88967
notes
andybak Feb 21, 2026
8e23a78
wip2
andybak Feb 21, 2026
b6173b1
WIP chapter refactor
andybak Feb 22, 2026
bc57a02
Quill chapter support and UI cleanup
andybak Feb 23, 2026
c6291d2
chapter fixes for Quill Files
andybak Feb 24, 2026
ac4aad0
Search for Quill/IMM panel
andybak Feb 25, 2026
8186509
dotnet-format
andybak Feb 25, 2026
8f2e6f5
Random file button. Quaternion bugfix
andybak Feb 25, 2026
36593fd
Merge branch 'main' into feature/quill-import
andybak Feb 26, 2026
558dadd
Fix bug bugs in path scaling and update moonsharp with json negative …
andybak Feb 27, 2026
195f93d
Avoid error when calculating the center of empty paths. Change how "c…
andybak Feb 28, 2026
c3cfa52
update moonshar plus some cosmetic changes to manifest
andybak Mar 1, 2026
086511d
Fix a couple more plugin api bugs
andybak Mar 1, 2026
14ef07d
Nicer syntax for exception handling
andybak Mar 1, 2026
c23cf56
Missing brace in manifest
andybak Mar 1, 2026
a04b283
accidentally pushed the file reference to manifest so might as well u…
andybak Mar 2, 2026
daae20b
Merge branch 'main' into feature/quill-import
andybak Mar 3, 2026
ef808a8
Background color to black to mitigate alpha2coverage issues
andybak Mar 5, 2026
84499ba
Merge branch 'main' into feature/quill-import
andybak Mar 6, 2026
8083cf0
Our custom UnityGLTF export relies on all brush shaders being prefixe…
andybak Mar 6, 2026
adb9a26
better wording for the comment about brush Uniqueness
andybak Mar 6, 2026
b66638f
Sync to latest branch changes and new svg files
andybak Mar 8, 2026
eab62dc
Merge branch 'main' into fix/viverse-bugfix-2
andybak Mar 8, 2026
93e2ce8
remember Quill sketch name and use it as default name for new saves
andybak Mar 8, 2026
f154b1a
Merge remote-tracking branch 'origin/fix/viverse-bugfix-2' into featu…
andybak Mar 8, 2026
764bd4a
Merge branch 'main' into feature/quill-import
andybak Mar 11, 2026
18b3a14
Merge branch 'main' into feature/quill-import
andybak Apr 1, 2026
2e6de52
accidentally committed local package path
andybak Apr 3, 2026
7af63c6
Merge branch 'main' into feature/quill-import
andybak Apr 3, 2026
03bad4c
Update packages-lock.json
andybak Apr 4, 2026
f39d2fe
Merge remote-tracking branch 'origin/main' into feature/quill-import
andybak Apr 16, 2026
14c138d
wip
andybak Jun 3, 2026
f8a1a96
Progress
andybak Jun 4, 2026
ed51f92
Add audio reactive button to mobile brushes (temp)
andybak Jun 4, 2026
6216689
Android mic capture
andybak Jun 4, 2026
ef4eb6b
Add System/Other app as a source on Android
andybak Jun 4, 2026
2788207
Catch hard quit in builds. Missing meta files
andybak Jun 4, 2026
17a1bb7
Don't switch to audio reactive on brush selection
andybak Jun 4, 2026
a1f004b
Don't update coefficients unless freq has changed more than an epsilon
andybak Jun 5, 2026
c2b8f88
Don't log so much in builds
andybak Jun 5, 2026
4c1994d
Instrumentation / logging
andybak Jun 5, 2026
7540574
More diagnostics
andybak Jun 5, 2026
81632e0
Foreground capture service
andybak Jun 6, 2026
158bf74
Add new service to manifest
andybak Jun 6, 2026
721685c
Ensure we don't fall through to mic input when testing system capture
andybak Jun 6, 2026
29addab
Give up on capturing app audio on android
andybak Jun 6, 2026
ef9affe
Merge remote-tracking branch 'origin/main' into feature/quill-import
andybak Jun 6, 2026
5138ec7
Remove empty brush descriptor
andybak Jun 6, 2026
d761f79
Fix overlapping buttons
andybak Jun 6, 2026
e24fdee
Update packages-lock.json
andybak Jun 6, 2026
df3648f
Merge branch 'feature/android-audio-reactivity' into feature/quill-im…
andybak Jun 6, 2026
9550c76
Merge branch 'main' into feature/quill-import
andybak Jun 11, 2026
37b039d
Merge branch 'main' into feature/quill-import
andybak Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Assets/Editor/BuildTiltBrush.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1512,7 +1512,7 @@ public static void DoBuild(TiltBuildOptions tiltOptions)
? StereoRenderingPath.SinglePass : StereoRenderingPath.MultiPass))
using (var unused3 = new TempDefineSymbols(
target,
tiltOptions.Il2Cpp ? "DISABLE_AUDIO_CAPTURE" : null,
tiltOptions.Il2Cpp ? "DISABLE_SYSTEM_AUDIO_CAPTURE" : null,
tiltOptions.AutoProfile ? "AUTOPROFILE_ENABLED" : null))
using (var unused4 = new TempHookUpSingletons())
using (var unused5 = new TempSetScriptingBackend(target, tiltOptions.Il2Cpp))
Expand Down
116 changes: 116 additions & 0 deletions Assets/Editor/CopyGvrToAudioSource.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;

public class CopyGvrToAudioSource : Editor
{
private static string currentSceneOrPrefabName;
private static int copiedCount;
private static int addedCount;

[MenuItem("Open Brush/Copy GvrAudioSource Properties to AudioSource")]
public static void Run()
{
copiedCount = 0;
addedCount = 0;

// Save current scene state before iterating
EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();

// Iterate through scenes in the project Assets only (not package scenes)
string[] sceneGUIDs = AssetDatabase.FindAssets("t:Scene", new[] { "Assets" });
foreach (string sceneGuid in sceneGUIDs)
{
string scenePath = AssetDatabase.GUIDToAssetPath(sceneGuid);
var scene = EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single);
currentSceneOrPrefabName = scene.name;

bool sceneModified = false;
foreach (GameObject obj in scene.GetRootGameObjects())
{
sceneModified |= IterateHierarchy(obj.transform);
}

if (sceneModified)
{
EditorSceneManager.SaveScene(scene);
Debug.Log($"[CopyGvr] Saved scene: {scene.name}");
}
}

// Iterate through all prefabs
string[] prefabGUIDs = AssetDatabase.FindAssets("t:Prefab");
foreach (string prefabGuid in prefabGUIDs)
{
string prefabPath = AssetDatabase.GUIDToAssetPath(prefabGuid);
GameObject prefab = PrefabUtility.LoadPrefabContents(prefabPath);

currentSceneOrPrefabName = prefab.name;
bool prefabModified = IterateHierarchy(prefab.transform);

if (prefabModified)
{
PrefabUtility.SaveAsPrefabAsset(prefab, prefabPath);
Debug.Log($"[CopyGvr] Saved prefab: {prefab.name}");
}

PrefabUtility.UnloadPrefabContents(prefab);
}

Debug.Log($"[CopyGvr] Done. Copied properties on {copiedCount} objects, added AudioSource on {addedCount} objects.");
}

private static bool IterateHierarchy(Transform transform)
{
bool modified = CopyGvrSource(transform.gameObject);
foreach (Transform child in transform)
{
modified |= IterateHierarchy(child);
}
return modified;
}

private static bool CopyGvrSource(GameObject go)
{
var gvr = go.GetComponent<GvrAudioSource>();
if (gvr == null) return false;

var audioSource = go.GetComponent<AudioSource>();
if (audioSource == null)
{
audioSource = go.AddComponent<AudioSource>();
addedCount++;
Debug.Log($"[CopyGvr] Added AudioSource to {currentSceneOrPrefabName}/{go.name}");
}

audioSource.bypassEffects = gvr.bypassRoomEffects;
audioSource.bypassListenerEffects = gvr.bypassRoomEffects;
audioSource.clip = gvr.sourceClip;
audioSource.loop = gvr.sourceLoop;
audioSource.mute = gvr.sourceMute;
audioSource.pitch = gvr.sourcePitch;
audioSource.playOnAwake = gvr.playOnAwake;
audioSource.priority = gvr.sourcePriority;
audioSource.spatialBlend = gvr.sourceSpatialBlend;
audioSource.spatialize = gvr.hrtfEnabled;
audioSource.dopplerLevel = gvr.sourceDopplerLevel;
audioSource.spread = gvr.sourceSpread;
audioSource.volume = gvr.sourceVolume;
audioSource.rolloffMode = gvr.sourceRolloffMode;
audioSource.maxDistance = gvr.sourceMaxDistance;
audioSource.minDistance = gvr.sourceMinDistance;

// Log properties that would require a SteamAudioSource component to migrate fully
if (gvr.occlusionEnabled)
Debug.LogWarning($"[CopyGvr] {currentSceneOrPrefabName}/{go.name}: occlusionEnabled=true — needs SteamAudioSource.occlusion");
if (gvr.directivityAlpha > 0f)
Debug.LogWarning($"[CopyGvr] {currentSceneOrPrefabName}/{go.name}: directivityAlpha={gvr.directivityAlpha} — needs SteamAudioSource.dipoleWeight/dipolePower");
if (gvr.gainDb != 0f)
Debug.LogWarning($"[CopyGvr] {currentSceneOrPrefabName}/{go.name}: gainDb={gvr.gainDb} — no Steam Audio equivalent, consider baking into volume");

copiedCount++;
Debug.Log($"[CopyGvr] Copied GvrAudioSource properties to AudioSource on {currentSceneOrPrefabName}/{go.name}");

return true;
}
}
11 changes: 11 additions & 0 deletions Assets/Editor/CopyGvrToAudioSource.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

195 changes: 195 additions & 0 deletions Assets/Editor/QuillChapterControlsSetup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
// Copyright 2026 The Open Brush Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using TMPro;
using UnityEditor;
using UnityEngine;

namespace TiltBrush
{
/// <summary>
/// Editor utility: adds chapter nav controls (prev/next buttons + label) to the
/// QuillFileButton prefab. Run once from Open Brush > Quill > Add Chapter Controls.
/// Re-running is safe; existing controls are detected and skipped.
/// </summary>
public static class QuillChapterControlsSetup
{
private const string k_PrefabPath =
"Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab";

// The font used by existing TMP labels in the button (loaded by GUID).
private const string k_FontGuid = "ec48085d8b1ed18499cf1411d42005a0";

[MenuItem("Open Brush/Quill/Add Chapter Controls to File Button")]
public static void Run()
{
// Resolve font asset once.
string fontPath = AssetDatabase.GUIDToAssetPath(k_FontGuid);
TMP_FontAsset font = string.IsNullOrEmpty(fontPath)
? null
: AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(fontPath);

if (font == null)
{
Debug.LogWarning(
"QuillChapterControlsSetup: could not resolve font GUID; " +
"TMP labels will use the TMP default font.");
}

// Load the prefab for in-memory editing.
GameObject prefabRoot = PrefabUtility.LoadPrefabContents(k_PrefabPath);
if (prefabRoot == null)
{
Debug.LogError($"QuillChapterControlsSetup: prefab not found at '{k_PrefabPath}'");
return;
}

try
{
var fileButton = prefabRoot.GetComponent<QuillFileButton>();
if (fileButton == null)
{
Debug.LogError("QuillChapterControlsSetup: QuillFileButton component not found on prefab root.");
return;
}

// Idempotency check via SerializedObject.
var soBefore = new SerializedObject(fileButton);
if (soBefore.FindProperty("m_ChapterControls").objectReferenceValue != null)
{
Debug.Log("QuillChapterControlsSetup: chapter controls already present; skipping.");
return;
}

int layer = prefabRoot.layer;

// ── ChapterControls container ──────────────────────────────────────
// Positioned just below the existing label text (y ≈ -0.04).
// Starts inactive; RefreshChapterControls() enables it for multi-chapter files.
var chapterControls = new GameObject("ChapterControls");
chapterControls.layer = layer;
chapterControls.transform.SetParent(prefabRoot.transform, false);
chapterControls.transform.localPosition = new Vector3(0f, -0.043f, -0.003f);
chapterControls.transform.localRotation = Quaternion.identity;
chapterControls.transform.localScale = Vector3.one;
chapterControls.SetActive(false);

// ── Prev button (<) ────────────────────────────────────────────────
var prevGO = CreateNavButton(chapterControls.transform,
label: "<", isNext: false, layer: layer, font: font);
prevGO.transform.localPosition = new Vector3(-0.38f, 0f, 0f);

// ── Chapter label (Ch X / N) ───────────────────────────────────────
var labelGO = new GameObject("ChapterLabel");
labelGO.layer = layer;
labelGO.transform.SetParent(chapterControls.transform, false);
var labelTmp = labelGO.AddComponent<TextMeshPro>();
ConfigureTmp(labelTmp, font, fontSize: 5f, text: "Ch - / -",
anchoredPos: Vector2.zero, sizeDelta: new Vector2(6f, 1.2f));
labelGO.transform.localPosition = new Vector3(0f, 0f, 0f);
labelGO.transform.localScale = Vector3.one * 0.1f;

// ── Next button (>) ────────────────────────────────────────────────
var nextGO = CreateNavButton(chapterControls.transform,
label: ">", isNext: true, layer: layer, font: font);
nextGO.transform.localPosition = new Vector3(0.38f, 0f, 0f);

// ── Wire serialized fields on QuillFileButton ──────────────────────
var so = new SerializedObject(fileButton);

so.FindProperty("m_ChapterControls").objectReferenceValue = chapterControls;
so.FindProperty("m_ChapterLabel").objectReferenceValue = labelTmp;
so.FindProperty("m_PrevChapterButton")
.objectReferenceValue = prevGO.GetComponent<QuillChapterNavButton>();
so.FindProperty("m_NextChapterButton")
.objectReferenceValue = nextGO.GetComponent<QuillChapterNavButton>();

so.ApplyModifiedProperties();

// ── Save ───────────────────────────────────────────────────────────
PrefabUtility.SaveAsPrefabAsset(prefabRoot, k_PrefabPath);
Debug.Log($"QuillChapterControlsSetup: chapter controls added to '{k_PrefabPath}'.");
}
finally
{
PrefabUtility.UnloadPrefabContents(prefabRoot);
}
}

// Creates a nav button child GO with BoxCollider, QuillChapterNavButton, and a TMP label.
private static GameObject CreateNavButton(
Transform parent, string label, bool isNext, int layer, TMP_FontAsset font)
{
// Button root — keep as regular Transform so BoxCollider works cleanly.
var go = new GameObject(isNext ? "NextChapterButton" : "PrevChapterButton");
go.layer = layer;
go.transform.SetParent(parent, false);
go.transform.localRotation = Quaternion.identity;
go.transform.localScale = Vector3.one;

// BoxCollider for VR raycast interaction.
var col = go.AddComponent<BoxCollider>();
col.size = new Vector3(0.18f, 0.03f, 0.05f);
col.center = Vector3.zero;

// Chapter nav behaviour.
var nav = go.AddComponent<QuillChapterNavButton>();
var soNav = new SerializedObject(nav);
soNav.FindProperty("m_IsNext").boolValue = isNext;
// Give it reasonable base-button defaults (no audio, subtle hover).
soNav.FindProperty("m_ButtonHasPressedAudio").boolValue = true;
soNav.FindProperty("m_ZAdjustHover").floatValue = -0.005f;
soNav.FindProperty("m_ZAdjustClick").floatValue = 0.005f;
soNav.FindProperty("m_HoverScale").floatValue = 1.05f;
soNav.FindProperty("m_HoverBoxColliderGrow").floatValue = 0.1f;
soNav.ApplyModifiedProperties();

// TMP label child (< or >) — child so the button root keeps a plain Transform.
var labelGO = new GameObject("Label");
labelGO.layer = layer;
labelGO.transform.SetParent(go.transform, false);
var tmp = labelGO.AddComponent<TextMeshPro>();
ConfigureTmp(tmp, font, fontSize: 6f, text: label,
anchoredPos: Vector2.zero, sizeDelta: new Vector2(2f, 1.2f));
labelGO.transform.localScale = Vector3.one * 0.1f;

return go;
}

private static void ConfigureTmp(
TextMeshPro tmp, TMP_FontAsset font, float fontSize, string text,
Vector2 anchoredPos, Vector2 sizeDelta)
{
// Assigning tmp.font during prefab editing triggers TMP's LoadFontAsset()
// which can NullRef in Editor context; leave font as TMP default.
_ = font;
tmp.fontSize = fontSize;
tmp.text = text;
tmp.color = Color.white;
tmp.alignment = TextAlignmentOptions.Center;
tmp.enableWordWrapping = false;
tmp.overflowMode = TextOverflowModes.Overflow;

var rt = tmp.GetComponent<RectTransform>();
rt.anchorMin = new Vector2(0.5f, 0.5f);
rt.anchorMax = new Vector2(0.5f, 0.5f);
rt.anchoredPosition = anchoredPos;
rt.sizeDelta = sizeDelta;

// Local position / rotation come from the parent GO's transform, not the RectTransform.
rt.localPosition = new Vector3(rt.localPosition.x, rt.localPosition.y, -0.001f);
rt.localRotation = Quaternion.identity;
}
}
}
11 changes: 11 additions & 0 deletions Assets/Editor/QuillChapterControlsSetup.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading