diff --git a/Assets/Editor/BuildTiltBrush.cs b/Assets/Editor/BuildTiltBrush.cs index a63f6ed928..d8a2f23ca0 100644 --- a/Assets/Editor/BuildTiltBrush.cs +++ b/Assets/Editor/BuildTiltBrush.cs @@ -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)) diff --git a/Assets/Editor/CopyGvrToAudioSource.cs b/Assets/Editor/CopyGvrToAudioSource.cs new file mode 100644 index 0000000000..66ae812cc9 --- /dev/null +++ b/Assets/Editor/CopyGvrToAudioSource.cs @@ -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(); + if (gvr == null) return false; + + var audioSource = go.GetComponent(); + if (audioSource == null) + { + audioSource = go.AddComponent(); + 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; + } +} diff --git a/Assets/Editor/CopyGvrToAudioSource.cs.meta b/Assets/Editor/CopyGvrToAudioSource.cs.meta new file mode 100644 index 0000000000..8bb4a84e03 --- /dev/null +++ b/Assets/Editor/CopyGvrToAudioSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d234809b222bb834f8b4b8e823f6ab1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/QuillChapterControlsSetup.cs b/Assets/Editor/QuillChapterControlsSetup.cs new file mode 100644 index 0000000000..f1d62bca75 --- /dev/null +++ b/Assets/Editor/QuillChapterControlsSetup.cs @@ -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 +{ + /// + /// 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. + /// + 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(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(); + 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(); + 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(); + so.FindProperty("m_NextChapterButton") + .objectReferenceValue = nextGO.GetComponent(); + + 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(); + col.size = new Vector3(0.18f, 0.03f, 0.05f); + col.center = Vector3.zero; + + // Chapter nav behaviour. + var nav = go.AddComponent(); + 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(); + 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(); + 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; + } + } +} diff --git a/Assets/Editor/QuillChapterControlsSetup.cs.meta b/Assets/Editor/QuillChapterControlsSetup.cs.meta new file mode 100644 index 0000000000..52d2fbdf60 --- /dev/null +++ b/Assets/Editor/QuillChapterControlsSetup.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 294774c6647fc2b4b98244e98625a38d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Tests/TestVisualizerManagedAnalysis.cs b/Assets/Editor/Tests/TestVisualizerManagedAnalysis.cs new file mode 100644 index 0000000000..0892942255 --- /dev/null +++ b/Assets/Editor/Tests/TestVisualizerManagedAnalysis.cs @@ -0,0 +1,141 @@ +// Copyright 2020 The Tilt 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 System; +using NUnit.Framework; + +namespace TiltBrush +{ + internal class TestVisualizerManagedAnalysis + { + private const int kFftSize = 512; + private const int kSampleRate = 48000; + + [Test] + public void ManagedFftDetectsSineNearExpectedBin() + { + const int expectedBin = 8; + float[] samples = GenerateSine(expectedBin * kSampleRate / kFftSize); + float[] fft = new float[kFftSize]; + var analyzer = new VisualizerManagedFft(1, kFftSize); + + analyzer.Add(samples, samples.Length); + analyzer.GetFftData(fft); + + int peakBin = FindPeakBin(fft, 1, kFftSize / 2); + Assert.That(peakBin, Is.InRange(expectedBin - 1, expectedBin + 1)); + Assert.That(fft[peakBin], Is.GreaterThan(fft[expectedBin + 8] * 5.0f)); + } + + [Test] + public void ManagedFftKeepsSilenceAtZero() + { + float[] samples = new float[kFftSize]; + float[] fft = new float[kFftSize]; + var analyzer = new VisualizerManagedFft(1, kFftSize); + + analyzer.Add(samples, samples.Length); + analyzer.GetFftData(fft); + + for (int i = 0; i < fft.Length; ++i) + { + Assert.That(fft[i], Is.EqualTo(0.0f).Within(1e-6f)); + } + } + + [Test] + public void ManagedFftUsesFirstChannelFromInterleavedSamples() + { + const int expectedBin = 8; + float[] mono = GenerateSine(expectedBin * kSampleRate / kFftSize); + float[] interleaved = new float[kFftSize * 2]; + for (int i = 0; i < mono.Length; ++i) + { + interleaved[i * 2] = mono[i]; + interleaved[i * 2 + 1] = 0.0f; + } + float[] fft = new float[kFftSize]; + var analyzer = new VisualizerManagedFft(2, kFftSize); + + analyzer.Add(interleaved, interleaved.Length); + analyzer.GetFftData(fft); + + int peakBin = FindPeakBin(fft, 1, kFftSize / 2); + Assert.That(peakBin, Is.InRange(expectedBin - 1, expectedBin + 1)); + } + + [Test] + public void ManagedLowPassAttenuatesHighFrequencies() + { + float[] low = GenerateSine(120); + float[] high = GenerateSine(4000); + var lowPass = new VisualizerManagedFilter(VisualizerManagedFilter.FilterType.Low, kSampleRate, 500); + + lowPass.Process(low); + lowPass = new VisualizerManagedFilter(VisualizerManagedFilter.FilterType.Low, kSampleRate, 500); + lowPass.Process(high); + + Assert.That(Rms(low), Is.GreaterThan(Rms(high) * 2.0f)); + } + + [Test] + public void ManagedHighPassAttenuatesLowFrequencies() + { + float[] low = GenerateSine(120); + float[] high = GenerateSine(4000); + var highPass = new VisualizerManagedFilter(VisualizerManagedFilter.FilterType.High, kSampleRate, 1000); + + highPass.Process(low); + highPass = new VisualizerManagedFilter(VisualizerManagedFilter.FilterType.High, kSampleRate, 1000); + highPass.Process(high); + + Assert.That(Rms(high), Is.GreaterThan(Rms(low) * 2.0f)); + } + + private static float[] GenerateSine(float frequency) + { + float[] samples = new float[kFftSize]; + for (int i = 0; i < samples.Length; ++i) + { + samples[i] = (float)Math.Sin(2.0 * Math.PI * frequency * i / kSampleRate); + } + return samples; + } + + private static int FindPeakBin(float[] fft, int start, int end) + { + int peakIndex = start; + float peak = fft[start]; + for (int i = start + 1; i < end; ++i) + { + if (fft[i] > peak) + { + peak = fft[i]; + peakIndex = i; + } + } + return peakIndex; + } + + private static float Rms(float[] samples) + { + double sumSquares = 0.0; + for (int i = 0; i < samples.Length; ++i) + { + sumSquares += samples[i] * samples[i]; + } + return (float)Math.Sqrt(sumSquares / samples.Length); + } + } +} diff --git a/Assets/Editor/Tests/TestVisualizerManagedAnalysis.cs.meta b/Assets/Editor/Tests/TestVisualizerManagedAnalysis.cs.meta new file mode 100644 index 0000000000..f31a8d0476 --- /dev/null +++ b/Assets/Editor/Tests/TestVisualizerManagedAnalysis.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ce784a22ea540ec9a4423b3a54f230b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Manifest.asset b/Assets/Manifest.asset index 2b3e93caaa..d6462faff6 100644 --- a/Assets/Manifest.asset +++ b/Assets/Manifest.asset @@ -98,3 +98,7 @@ MonoBehaviour: - {fileID: 11400000, guid: c0393f9ef118b8b4eac658e169ac8497, type: 2} - {fileID: 11400000, guid: 1928962e383e7f04696634b06de5ff25, type: 2} - {fileID: 11400000, guid: 2c424631fdf55254282d1aa5405ad63a, type: 2} + - {fileID: 11400000, guid: 126a9037e3ef7324ba28fafe3fb2175a, type: 2} + - {fileID: 11400000, guid: 665b886e3e4aaa448bf2ff0647172507, type: 2} + - {fileID: 11400000, guid: d0b9e3ef5d1db1842b037df6f7afb6b8, type: 2} + - {fileID: 11400000, guid: 2d1dd4d7dd0c1b1479e257a2e58d20d3, type: 2} diff --git a/Assets/Manifest_Experimental.asset b/Assets/Manifest_Experimental.asset index 35097f68c5..03448998e9 100644 --- a/Assets/Manifest_Experimental.asset +++ b/Assets/Manifest_Experimental.asset @@ -11,7 +11,7 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 23720096ebad012489fb3db6e44e0a4c, type: 3} m_Name: Manifest_Experimental - m_EditorClassIdentifier: + m_EditorClassIdentifier: Brushes: - {fileID: 11400000, guid: b24b145ee272a9345b7f0142039120ea, type: 2} - {fileID: 11400000, guid: daece1ae471373c41bd0ebe7f9e9ce4f, type: 2} diff --git a/Assets/Materials/SoundClipWidget.mat b/Assets/Materials/SoundClipWidget.mat new file mode 100644 index 0000000000..986bb2e619 --- /dev/null +++ b/Assets/Materials/SoundClipWidget.mat @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SoundClipWidget + m_Shader: {fileID: 4800000, guid: 7316425f699fd1d459c40d7e089fa760, type: 3} + m_ValidKeywords: [] + m_InvalidKeywords: + - _ALPHATEST_ON + - _LIGHTMAPPING_DYNAMIC_LIGHTMAPS + - _UVSEC_UV1 + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 32c1b6205fdb5af4996e2a51c4df9eb7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Occlusion: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: + - _Cull: 2 + m_Floats: + - _AlphaTestRef: 0.5 + - _Aspect: 1 + - _BumpScale: 1 + - _CullMode: 0 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EmissionScaleUI: 1 + - _Glossiness: 0 + - _Grayscale: 0 + - _Lightmapping: 1 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 0.99999994} + - _EmissionColorUI: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColorWithMapUI: {r: 1, g: 1, b: 1, a: 1} + - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + - _SpecularColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Resources/Brushes/New BrushDescriptor.asset.meta b/Assets/Materials/SoundClipWidget.mat.meta similarity index 64% rename from Assets/Resources/Brushes/New BrushDescriptor.asset.meta rename to Assets/Materials/SoundClipWidget.mat.meta index 2e53e7e253..e6fdeae439 100644 --- a/Assets/Resources/Brushes/New BrushDescriptor.asset.meta +++ b/Assets/Materials/SoundClipWidget.mat.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: 5fee29c4a0ed01c4d8a3dc6b770a4460 +guid: d8b1abdfad766cd448e1ea238af5f38d NativeFormatImporter: externalObjects: {} - mainObjectFileID: 11400000 + mainObjectFileID: 2100000 userData: assetBundleName: assetBundleVariant: diff --git a/Assets/Materials/sculpting.meta b/Assets/Materials/sculpting.meta new file mode 100644 index 0000000000..a4329535f2 --- /dev/null +++ b/Assets/Materials/sculpting.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0e41980b31ec41f0989fd917ed6ead77 +timeCreated: 1669378339 \ No newline at end of file diff --git a/Assets/Materials/sculpting/Interactor.mat b/Assets/Materials/sculpting/Interactor.mat new file mode 100644 index 0000000000..06e49ddf97 --- /dev/null +++ b/Assets/Materials/sculpting/Interactor.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Interactor + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _GlossMapScale: 1 + - _Glossiness: 0.639 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 3 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _Color: {r: 0, g: 0.85882354, b: 0.98039216, a: 0.43529412} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Materials/sculpting/Interactor.mat.meta b/Assets/Materials/sculpting/Interactor.mat.meta new file mode 100644 index 0000000000..5c4b2c1f45 --- /dev/null +++ b/Assets/Materials/sculpting/Interactor.mat.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 78b2ba5106bc41c28614887f70035dd4 +timeCreated: 1669378339 \ No newline at end of file diff --git a/Assets/Materials/sculpting/SculptOff.mat b/Assets/Materials/sculpting/SculptOff.mat new file mode 100644 index 0000000000..fec2c865f6 --- /dev/null +++ b/Assets/Materials/sculpting/SculptOff.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SculptOff + m_Shader: {fileID: 4800000, guid: 4ec22985cf4da3a489262499812ec6c7, type: 3} + m_ValidKeywords: [] + m_InvalidKeywords: + - _EMISSION + m_LightmapFlags: 2 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: c8848c12b4797314d8055899b5eef959, type: 3} + m_Scale: {x: 0.1, y: 4} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _TilingX: 3 + - _TilingY: 1 + - _UVSec: 0 + - _VectorX: 0 + - _VectorY: 1 + - _VectorZ: 1 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.6320754, g: 0.3488341, b: 0.3822964, a: 1} + - _EmissionColor: {r: 0.4665165, g: 0.018294765, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/sculpting/SculptOff.mat.meta b/Assets/Materials/sculpting/SculptOff.mat.meta new file mode 100644 index 0000000000..cd6b3ff245 --- /dev/null +++ b/Assets/Materials/sculpting/SculptOff.mat.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1f259984fed24d4fa141bf61d2abd10a +timeCreated: 1669378339 \ No newline at end of file diff --git a/Assets/Materials/sculpting/SculptOn.mat b/Assets/Materials/sculpting/SculptOn.mat new file mode 100644 index 0000000000..a1b4ac48d6 --- /dev/null +++ b/Assets/Materials/sculpting/SculptOn.mat @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SculptOn + m_Shader: {fileID: 4800000, guid: 4ec22985cf4da3a489262499812ec6c7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - _EMISSION + m_LightmapFlags: 2 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: c8848c12b4797314d8055899b5eef959, type: 3} + m_Scale: {x: 0.1, y: 4} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _TilingX: 1 + - _TilingY: 1 + - _UVSec: 0 + - _VectorX: 0 + - _VectorY: 0 + - _VectorZ: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.4309808, g: 0.6132076, b: 0.44813156, a: 1} + - _EmissionColor: {r: 0, g: 0.34943, b: 0.03293058, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/sculpting/SculptOn.mat.meta b/Assets/Materials/sculpting/SculptOn.mat.meta new file mode 100644 index 0000000000..743cbc93df --- /dev/null +++ b/Assets/Materials/sculpting/SculptOn.mat.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8b5b6cbbc43748d69daec5cecb3a06f4 +timeCreated: 1669378339 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools.meta b/Assets/Models/Input/Materials/Tools.meta new file mode 100644 index 0000000000..1c2a255940 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a0fbe9a408e749e4802f1ca7b76464c6 +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/ConeFused.mtl b/Assets/Models/Input/Materials/Tools/ConeFused.mtl new file mode 100644 index 0000000000..0ac6c9bb5e --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeFused.mtl @@ -0,0 +1,8 @@ +newmtl ConeFused:initialShadingGroup +illum 4 +Kd 0.50 0.50 0.50 +Ka 0.00 0.00 0.00 +Tf 1.00 1.00 1.00 +Ni 1.00 +Ks 0.50 0.50 0.50 +Ns 18.00 diff --git a/Assets/Models/Input/Materials/Tools/ConeFused.mtl.meta b/Assets/Models/Input/Materials/Tools/ConeFused.mtl.meta new file mode 100644 index 0000000000..0ed5c2b1e8 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeFused.mtl.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f45a98ef23d8405f9d310f6bcfad6890 +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/ConeFused.obj b/Assets/Models/Input/Materials/Tools/ConeFused.obj new file mode 100644 index 0000000000..527fce68f9 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeFused.obj @@ -0,0 +1,63 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib ConeFused.mtl +g default +v 0.020000 0.000000 -0.034641 +v -0.020000 0.000000 -0.034641 +v -0.040000 0.000000 0.000000 +v -0.020000 0.000000 0.034641 +v 0.020000 0.000000 0.034641 +v 0.040000 0.000000 0.000000 +v 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 -0.944911 +vn -0.818317 0.327327 -0.472456 +vn 0.000000 0.327327 -0.944911 +vn -0.818317 0.327327 -0.472456 +vn -0.818317 0.327327 0.472455 +vn 0.000000 0.327327 -0.944911 +vn -0.818317 0.327327 0.472455 +vn 0.000000 0.327327 0.944911 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 0.944911 +vn 0.818317 0.327327 0.472456 +vn 0.000000 0.327327 -0.944911 +vn 0.818317 0.327327 0.472456 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +s off +g Cone +usemtl ConeFused:initialShadingGroup +f 1/1/1 2/2/2 7/3/3 +f 2/4/4 3/5/5 7/6/6 +f 3/7/7 4/8/8 7/9/9 +f 4/10/10 5/11/11 7/12/12 +f 5/13/13 6/14/14 7/15/15 +f 6/16/16 1/17/17 7/18/18 +f 2/2/19 1/17/20 6/14/21 5/11/22 4/8/23 3/5/24 diff --git a/Assets/Models/Input/Materials/Tools/ConeFused.obj.meta b/Assets/Models/Input/Materials/Tools/ConeFused.obj.meta new file mode 100644 index 0000000000..2571fe1dd4 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeFused.obj.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 95bb363515b94f83bfbd5a3ecc483d0f +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/ConeTip.mtl b/Assets/Models/Input/Materials/Tools/ConeTip.mtl new file mode 100644 index 0000000000..c89145d907 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeTip.mtl @@ -0,0 +1,6 @@ +newmtl initialShadingGroup +illum 4 +Kd 0.50 0.50 0.50 +Ka 0.00 0.00 0.00 +Tf 1.00 1.00 1.00 +Ni 1.00 diff --git a/Assets/Models/Input/Materials/Tools/ConeTip.mtl.meta b/Assets/Models/Input/Materials/Tools/ConeTip.mtl.meta new file mode 100644 index 0000000000..9e619afc74 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeTip.mtl.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e8f494fb6ba14a01b87e24cbf813b820 +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/ConeTip.obj b/Assets/Models/Input/Materials/Tools/ConeTip.obj new file mode 100644 index 0000000000..407968901f --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeTip.obj @@ -0,0 +1,56 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib ConeTip.mtl +g default +v 0.020000 -0.050000 -0.034641 +v -0.020000 -0.050000 -0.034641 +v -0.040000 -0.050000 -0.000000 +v -0.020000 -0.050000 0.034641 +v 0.020000 -0.050000 0.034641 +v 0.040000 -0.050000 0.000000 +v 0.000000 0.050000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 -0.944911 +vn 0.000000 0.327327 -0.944911 +vn -0.818317 0.327327 -0.472456 +vn -0.818317 0.327327 -0.472456 +vn -0.818317 0.327327 -0.472456 +vn -0.818317 0.327327 0.472455 +vn -0.818317 0.327327 0.472455 +vn -0.818317 0.327327 0.472455 +vn 0.000000 0.327327 0.944911 +vn 0.000000 0.327327 0.944911 +vn 0.000000 0.327327 0.944911 +vn 0.818317 0.327327 0.472456 +vn 0.818317 0.327327 0.472456 +vn 0.818317 0.327327 0.472456 +vn 0.818317 0.327327 -0.472456 +vn 0.818317 0.327327 -0.472456 +vn 0.818317 0.327327 -0.472456 +s off +g ConeTip +usemtl initialShadingGroup +f 1/1/1 2/9/2 7/14/3 +f 2/2/4 3/10/5 7/15/6 +f 3/3/7 4/11/8 7/16/9 +f 4/4/10 5/12/11 7/17/12 +f 5/5/13 6/13/14 7/18/15 +f 6/6/16 1/7/17 7/8/18 diff --git a/Assets/Models/Input/Materials/Tools/ConeTip.obj.meta b/Assets/Models/Input/Materials/Tools/ConeTip.obj.meta new file mode 100644 index 0000000000..a2b2b19342 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/ConeTip.obj.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2799d0912a1b46b19122092cb62d5c32 +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/Materials.meta b/Assets/Models/Input/Materials/Tools/Materials.meta new file mode 100644 index 0000000000..b22826ed90 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b737b0a6a8884464a163e12685cb04e1 +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/Materials/ConeFused-ConeFused_initialShadingGroup.mat b/Assets/Models/Input/Materials/Tools/Materials/ConeFused-ConeFused_initialShadingGroup.mat new file mode 100644 index 0000000000..368ad5c75a --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials/ConeFused-ConeFused_initialShadingGroup.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ConeFused-ConeFused_initialShadingGroup + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Models/Input/Materials/Tools/Materials/ConeFused-ConeFused_initialShadingGroup.mat.meta b/Assets/Models/Input/Materials/Tools/Materials/ConeFused-ConeFused_initialShadingGroup.mat.meta new file mode 100644 index 0000000000..c9e48a6ea4 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials/ConeFused-ConeFused_initialShadingGroup.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ecbd20d64104646489ed8aa612b0cf5c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/Input/Materials/Tools/Materials/ConeMat.mat b/Assets/Models/Input/Materials/Tools/Materials/ConeMat.mat new file mode 100644 index 0000000000..ad98b9b9a2 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials/ConeMat.mat @@ -0,0 +1,73 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ConeMat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Glossiness: 0.5 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.8, g: 0.8, b: 0.8, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Models/Input/Materials/Tools/Materials/ConeMat.mat.meta b/Assets/Models/Input/Materials/Tools/Materials/ConeMat.mat.meta new file mode 100644 index 0000000000..9896743dbb --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials/ConeMat.mat.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 938e528e5a514e9588200309661db66b +timeCreated: 1669378276 \ No newline at end of file diff --git a/Assets/Models/Input/Materials/Tools/Materials/ConeTip-initialShadingGroup.mat b/Assets/Models/Input/Materials/Tools/Materials/ConeTip-initialShadingGroup.mat new file mode 100644 index 0000000000..013304cd2e --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials/ConeTip-initialShadingGroup.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ConeTip-initialShadingGroup + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Models/Input/Materials/Tools/Materials/ConeTip-initialShadingGroup.mat.meta b/Assets/Models/Input/Materials/Tools/Materials/ConeTip-initialShadingGroup.mat.meta new file mode 100644 index 0000000000..a20ed09210 --- /dev/null +++ b/Assets/Models/Input/Materials/Tools/Materials/ConeTip-initialShadingGroup.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c5b0afa292b37f247a7c04f36a8c6ac2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/Materials/Offsculptsphere-No Name.mat b/Assets/Models/Materials/Offsculptsphere-No Name.mat new file mode 100644 index 0000000000..d87a2d0d44 --- /dev/null +++ b/Assets/Models/Materials/Offsculptsphere-No Name.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Offsculptsphere-No Name + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Models/Materials/Offsculptsphere-No Name.mat.meta b/Assets/Models/Materials/Offsculptsphere-No Name.mat.meta new file mode 100644 index 0000000000..575ed567a2 --- /dev/null +++ b/Assets/Models/Materials/Offsculptsphere-No Name.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 526450b700ae89c468ea9681d5ae7c29 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/Materials/Onsculptsphere-No Name.mat b/Assets/Models/Materials/Onsculptsphere-No Name.mat new file mode 100644 index 0000000000..47c0a02e29 --- /dev/null +++ b/Assets/Models/Materials/Onsculptsphere-No Name.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Onsculptsphere-No Name + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Models/Materials/Onsculptsphere-No Name.mat.meta b/Assets/Models/Materials/Onsculptsphere-No Name.mat.meta new file mode 100644 index 0000000000..36dc0e88c7 --- /dev/null +++ b/Assets/Models/Materials/Onsculptsphere-No Name.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dbcc4ceb00e2dbb42b83a30246d09ba6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/Materials/creasetooltip-No Name.mat b/Assets/Models/Materials/creasetooltip-No Name.mat new file mode 100644 index 0000000000..8940a91fc1 --- /dev/null +++ b/Assets/Models/Materials/creasetooltip-No Name.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: creasetooltip-No Name + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Models/Materials/creasetooltip-No Name.mat.meta b/Assets/Models/Materials/creasetooltip-No Name.mat.meta new file mode 100644 index 0000000000..9da92333b9 --- /dev/null +++ b/Assets/Models/Materials/creasetooltip-No Name.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ccc38e59eb494244786ce3e8eed9d84c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/Offsculptsphere.fbx b/Assets/Models/Offsculptsphere.fbx new file mode 100644 index 0000000000..1540167939 Binary files /dev/null and b/Assets/Models/Offsculptsphere.fbx differ diff --git a/Assets/Models/Offsculptsphere.fbx.meta b/Assets/Models/Offsculptsphere.fbx.meta new file mode 100644 index 0000000000..1a23c9c460 --- /dev/null +++ b/Assets/Models/Offsculptsphere.fbx.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9ee386eabf8443feb60c6d298e498302 +timeCreated: 1669378157 \ No newline at end of file diff --git a/Assets/Models/Onsculptsphere.fbx b/Assets/Models/Onsculptsphere.fbx new file mode 100644 index 0000000000..5bee329b41 Binary files /dev/null and b/Assets/Models/Onsculptsphere.fbx differ diff --git a/Assets/Models/Onsculptsphere.fbx.meta b/Assets/Models/Onsculptsphere.fbx.meta new file mode 100644 index 0000000000..8708a21284 --- /dev/null +++ b/Assets/Models/Onsculptsphere.fbx.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6feef504b1a84ed9b440fa1d8a50ad17 +timeCreated: 1669378157 \ No newline at end of file diff --git a/Assets/Models/creasetooltip.fbx b/Assets/Models/creasetooltip.fbx new file mode 100644 index 0000000000..5fad1cd84e Binary files /dev/null and b/Assets/Models/creasetooltip.fbx differ diff --git a/Assets/Models/creasetooltip.fbx.meta b/Assets/Models/creasetooltip.fbx.meta new file mode 100644 index 0000000000..9253d44cb5 --- /dev/null +++ b/Assets/Models/creasetooltip.fbx.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fdf3f3531d0a4599b7ee63af630f24dc +timeCreated: 1669378157 \ No newline at end of file diff --git a/Assets/Prefabs/AudioLoop.prefab b/Assets/Prefabs/AudioLoop.prefab index ff10520700..17d571a06b 100644 --- a/Assets/Prefabs/AudioLoop.prefab +++ b/Assets/Prefabs/AudioLoop.prefab @@ -25,13 +25,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 166670} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &114000012757747538 MonoBehaviour: @@ -79,12 +79,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 0} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 1 m_Pitch: 1 Loop: 0 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 1 diff --git a/Assets/Prefabs/AudioOneShot.prefab b/Assets/Prefabs/AudioOneShot.prefab index 8068438791..b736a26ef8 100644 --- a/Assets/Prefabs/AudioOneShot.prefab +++ b/Assets/Prefabs/AudioOneShot.prefab @@ -25,13 +25,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 166670} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &114000012757747538 MonoBehaviour: @@ -79,12 +79,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 0} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 1 m_Pitch: 1 Loop: 0 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 1 diff --git a/Assets/Prefabs/Panels/AdvancedToolsPanel.prefab b/Assets/Prefabs/Panels/AdvancedToolsPanel.prefab index 047e0e72ce..18a7c41550 100644 --- a/Assets/Prefabs/Panels/AdvancedToolsPanel.prefab +++ b/Assets/Prefabs/Panels/AdvancedToolsPanel.prefab @@ -832,6 +832,9 @@ MonoBehaviour: m_Collider: {fileID: 65826497703903122} m_Mesh: {fileID: 1622068699690834} m_Border: {fileID: 23068761468747428} + m_BorderIsSplit: 0 + m_BorderTop: {fileID: 0} + m_BorderBottom: {fileID: 0} m_MeshCollider: {fileID: 65439514599846630} m_ParticleBounds: {x: 1.2, y: 1.2, z: 0} m_PanelPopUpMap: @@ -2466,7 +2469,7 @@ Transform: m_GameObject: {fileID: 5664627563248376400} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.211, y: -0.634, z: 0.05} + m_LocalPosition: {x: -0.201, y: -0.634, z: 0.05} m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2623,7 +2626,7 @@ Transform: m_GameObject: {fileID: 7793811069088501246} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.211, y: -0.634, z: 0.05} + m_LocalPosition: {x: 0.22099972, y: -0.634, z: 0.05} m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} m_ConstrainProportionsScale: 0 m_Children: [] diff --git a/Assets/Prefabs/Panels/BrushesPanel_Mobile.prefab b/Assets/Prefabs/Panels/BrushesPanel_Mobile.prefab index 05f48783bf..32426ea083 100644 --- a/Assets/Prefabs/Panels/BrushesPanel_Mobile.prefab +++ b/Assets/Prefabs/Panels/BrushesPanel_Mobile.prefab @@ -434,6 +434,9 @@ MonoBehaviour: m_Collider: {fileID: 65991805485152614} m_Mesh: {fileID: 1552050041013830} m_Border: {fileID: 23820205932647516} + m_BorderIsSplit: 0 + m_BorderTop: {fileID: 0} + m_BorderBottom: {fileID: 0} m_MeshCollider: {fileID: 65963000711119570} m_ParticleBounds: {x: 1.8, y: 1.8, z: 0} m_PanelPopUpMap: @@ -2430,6 +2433,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 5055727438838224756} - {fileID: 4218283724290616} - {fileID: 4520382599823132} - {fileID: 4404169667267474} @@ -4873,6 +4877,190 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &2749322605564373426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5055727438838224756} + - component: {fileID: 2588060367045938887} + - component: {fileID: 1820310711273447641} + - component: {fileID: 8705221730776530082} + - component: {fileID: 4100428454769645081} + m_Layer: 16 + m_Name: Button_AudioReactor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5055727438838224756 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2749322605564373426} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.008999884, y: -0.64299995, z: 0.05000011} + m_LocalScale: {x: 0.35767, y: 0.35, z: 0.38557994} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4262501330086264} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2588060367045938887 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2749322605564373426} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1820310711273447641 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2749322605564373426} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 7cc7758a4ea50e64c92f0fe15ccecf84, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &8705221730776530082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2749322605564373426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 72f3150b01c5d1640b75cb1fc28e87f9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: BRUSH_PANEL_AUDIOREACTOR_BUTTON_DESCRIPTION + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 5335959689994240 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: Music Visualization + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 0b9b3dffa74802347b4464ee95d62f3c, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 0 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Command: 11 + m_CommandParam: -1 + m_CommandParam2: -1 + m_RequiresPopup: 1 + m_CenterPopupOnButton: 0 + m_PopupOffset: {x: 0, y: 0, z: 0} + m_PopupText: BRUSH_PANEL_AUDIOREACTOR_POPUP + m_LocalizedPopup: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 5336069865971712 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_ToggleOnDescription: + m_LocalizedToggleOnDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_ToggleOnTexture: {fileID: 0} + m_AllowUnavailable: 0 + m_LinkedUIObject: {fileID: 0} + references: + version: 2 + RefIds: [] +--- !u!65 &4100428454769645081 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2749322605564373426} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.0000001, y: 1.0000001, z: 0.1} + m_Center: {x: 0, y: 0, z: 0} --- !u!1001 &1345002710036633993 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Panels/ExtraPanel.prefab b/Assets/Prefabs/Panels/ExtraPanel.prefab index a991cbaa78..757797c87e 100644 --- a/Assets/Prefabs/Panels/ExtraPanel.prefab +++ b/Assets/Prefabs/Panels/ExtraPanel.prefab @@ -360,6 +360,7 @@ Transform: - {fileID: 2183017126753138076} - {fileID: 689087006347697308} - {fileID: 6599179350145049481} + - {fileID: 2616682806549397252} - {fileID: 4159606566656768} - {fileID: 4082672982539268} - {fileID: 4924232686100982} @@ -1371,7 +1372,7 @@ Transform: m_GameObject: {fileID: 1250366089417740067} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.21, y: -0.648, z: 0.049999237} + m_LocalPosition: {x: 0, y: -0.648, z: 0.049999237} m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1842,7 +1843,7 @@ Transform: m_GameObject: {fileID: 4216200903523234662} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.21, y: -0.65, z: 0.049999237} + m_LocalPosition: {x: -0.422, y: -0.65, z: 0.049999237} m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} m_ConstrainProportionsScale: 0 m_Children: [] @@ -1970,6 +1971,163 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 1, y: 1, z: 0.01} m_Center: {x: 0, y: 0, z: -0.05} +--- !u!1 &5230964709736873681 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2616682806549397252} + - component: {fileID: 2223176146174551313} + - component: {fileID: 3977959882448491282} + - component: {fileID: 1223082829123031033} + - component: {fileID: 5408452049338922059} + m_Layer: 16 + m_Name: QuillLibrary + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2616682806549397252 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5230964709736873681} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.422, y: -0.648, z: 0.049999237} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4232412870837608} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2223176146174551313 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5230964709736873681} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &3977959882448491282 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5230964709736873681} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &1223082829123031033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5230964709736873681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 03222d9718beeb748bf9e9be379fea39, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: LABS_PANEL_SCRIPTS_BUTTON_DESCRIPTION + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 467449183412510720 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 22ca44880b645734b993dcfa04f5ea48, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 0 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Type: 11600 + m_AlwaysSpawn: 0 + references: + version: 2 + RefIds: [] +--- !u!65 &5408452049338922059 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5230964709736873681} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: 0} --- !u!1001 &4136892008545286871 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Panels/LabsPanel.prefab b/Assets/Prefabs/Panels/LabsPanel.prefab index 654a706027..ee6614211c 100644 --- a/Assets/Prefabs/Panels/LabsPanel.prefab +++ b/Assets/Prefabs/Panels/LabsPanel.prefab @@ -309,11 +309,14 @@ Transform: - {fileID: 4626429713668410} - {fileID: 1210818133549774434} - {fileID: 4000012572946912} + - {fileID: 8504243446603255984} + - {fileID: 7712825352091082891} - {fileID: 4000010460034712} - {fileID: 4000011251504288} - {fileID: 4000012282201364} - {fileID: 4000012490214276} - {fileID: 434412} + - {fileID: 1078279024169042964} - {fileID: 4000011486688576} - {fileID: 499404} - {fileID: 415298} @@ -901,6 +904,7 @@ Transform: - {fileID: 4000014070374570} - {fileID: 442914} - {fileID: 402684} + - {fileID: 8509009885981870405} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &114019824221785570 @@ -919,6 +923,9 @@ MonoBehaviour: m_Collider: {fileID: 6531256} m_Mesh: {fileID: 160772} m_Border: {fileID: 23000010265477920} + m_BorderIsSplit: 0 + m_BorderTop: {fileID: 0} + m_BorderBottom: {fileID: 0} m_MeshCollider: {fileID: 6547610} m_ParticleBounds: {x: 1.2, y: 1.2, z: 0} m_PanelPopUpMap: @@ -1053,7 +1060,7 @@ Transform: m_GameObject: {fileID: 1000010690061500} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: -0.3, z: 0.05} + m_LocalPosition: {x: -0.415, y: -0.3, z: 0.05} m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} m_ConstrainProportionsScale: 0 m_Children: [] @@ -2438,7 +2445,7 @@ MonoBehaviour: references: version: 2 RefIds: [] ---- !u!1 &4011871447704911063 +--- !u!1 &1078279024169258386 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2446,62 +2453,115 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1210818133549774434} - - component: {fileID: 4510907067803236372} - - component: {fileID: 8214681752030472003} - - component: {fileID: 5616146602988485478} - - component: {fileID: 2060444129593214251} + - component: {fileID: 1078279024168973654} + - component: {fileID: 1078279024167063070} m_Layer: 16 - m_Name: PanelButton_Webcam + m_Name: Collider m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &1210818133549774434 +--- !u!4 &1078279024168973654 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4011871447704911063} + m_GameObject: {fileID: 1078279024169258386} serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.415, y: 0.15, z: 0.049999237} - m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.295, y: 0.109721534, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 402684} + m_Father: {fileID: 1078279024169042964} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &4510907067803236372 +--- !u!65 &1078279024167063070 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169258386} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 0.9999999, y: 1, z: 0.040708233} + m_Center: {x: 0, y: 0, z: 0.004373991} +--- !u!1 &1078279024169266254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1078279024169020792} + - component: {fileID: 1078279024170313142} + - component: {fileID: 1078279024171315884} + - component: {fileID: 1108360326159039058} + m_Layer: 16 + m_Name: SliderPosition + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1078279024169020792 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169266254} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.1307, y: 0, z: 0} + m_LocalScale: {x: 0.01, y: 0.03, z: 0.015} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3089242035506690949} + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1078279024170313142 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4011871447704911063} - m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} ---- !u!23 &8214681752030472003 + m_GameObject: {fileID: 1078279024169266254} + m_Mesh: {fileID: 4300000, guid: 5ef960ddf11c1fd4983638f56f6a8be0, type: 3} +--- !u!23 &1078279024171315884 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4011871447704911063} + m_GameObject: {fileID: 1078279024169266254} m_Enabled: 1 m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 m_StaticShadowCaster: 0 m_MotionVectors: 1 - m_LightProbeUsage: 0 + m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + - {fileID: 2100000, guid: 3e92ccbfed650604686991e69902e663, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -2523,79 +2583,104 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!114 &5616146602988485478 +--- !u!114 &1108360326159039058 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4011871447704911063} + m_GameObject: {fileID: 1078279024169266254} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 03222d9718beeb748bf9e9be379fea39, type: 3} + m_Script: {fileID: 11500000, guid: 1aaefde5afe80784e908d27fcb05a101, type: 3} m_Name: m_EditorClassIdentifier: - m_DescriptionType: 0 - m_DescriptionYOffset: 0 - m_DescriptionText: Webcam - m_LocalizedDescription: - m_TableReference: - m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 - m_TableEntryReference: - m_KeyId: 129251051561549824 - m_Key: - m_FallbackState: 0 - m_WaitForCompletion: 0 - m_LocalVariables: [] - m_DescriptionTextExtra: - m_LocalizedDescriptionExtra: - m_TableReference: - m_TableCollectionName: - m_TableEntryReference: - m_KeyId: 0 - m_Key: - m_FallbackState: 0 - m_WaitForCompletion: 0 - m_LocalVariables: [] - m_DescriptionActivateSpeed: 12 - m_DescriptionZScale: 1 - m_ButtonTexture: {fileID: 2800000, guid: bc16ebd42512d3d479639955f68090a4, type: 3} - m_AtlasTexture: 1 - m_ToggleButton: 1 - m_LongPressReleaseButton: 0 - m_ButtonHasPressedAudio: 0 - m_ZAdjustHover: -0.02 - m_ZAdjustClick: 0.05 - m_HoverScale: 1.1 - m_HoverBoxColliderGrow: 0.2 - m_AddOverlay: 0 - m_Type: 5200 - m_AlwaysSpawn: 0 - references: - version: 2 - RefIds: [] ---- !u!65 &2060444129593214251 -BoxCollider: + m_OffsetOverride: -1 +--- !u!1 &1078279024169275744 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4011871447704911063} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 0.01} - m_Center: {x: 0, y: 0, z: -0.05} ---- !u!1 &6294566030148222674 + serializedVersion: 6 + m_Component: + - component: {fileID: 1078279024168982194} + - component: {fileID: 1078279024170260036} + - component: {fileID: 1078279024171303454} + m_Layer: 16 + m_Name: Cap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1078279024168982194 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169275744} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.1682, y: -0, z: 0.0002105044} + m_LocalScale: {x: 0.0375, y: 0.0375, z: 0.0375} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3253216253114574461} + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1078279024170260036 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169275744} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1078279024171303454 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169275744} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ca448c25e886c544796b10b98d8aa9cc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1078279024169312986 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2603,55 +2688,55 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6292014397156290862} - - component: {fileID: 6280797664358514420} - - component: {fileID: 6272788975588130916} - - component: {fileID: 6320537500852989196} - - component: {fileID: 6254052937444237984} + - component: {fileID: 1078279024168931616} + - component: {fileID: 1078279024170252798} + - component: {fileID: 1078279024171351784} + - component: {fileID: 1078279024179013614} m_Layer: 16 - m_Name: PanelButton_SaveStrokes + m_Name: MaxIcon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &6292014397156290862 +--- !u!4 &1078279024168931616 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6294566030148222674} + m_GameObject: {fileID: 1078279024169312986} serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.415, y: 0.6000004, z: 0.05} - m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: -0.7071068} + m_LocalPosition: {x: 0.2698, y: -0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 402684} + m_Children: + - {fileID: 5912165634192525737} + m_Father: {fileID: 1078279024169042964} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &6280797664358514420 +--- !u!33 &1078279024170252798 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6294566030148222674} - m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} ---- !u!23 &6272788975588130916 + m_GameObject: {fileID: 1078279024169312986} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &1078279024171351784 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6294566030148222674} - m_Enabled: 1 + m_GameObject: {fileID: 1078279024169312986} + m_Enabled: 0 m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 m_StaticShadowCaster: 0 m_MotionVectors: 1 - m_LightProbeUsage: 1 + m_LightProbeUsage: 0 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 @@ -2680,51 +2765,1182 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &6320537500852989196 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6294566030148222674} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 0.1} - m_Center: {x: -0.000000074505806, y: 0.000000022351742, z: 0} ---- !u!114 &6254052937444237984 +--- !u!114 &1078279024179013614 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6294566030148222674} + m_GameObject: {fileID: 1078279024169312986} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6c6859eec74651247968d56b594ac313, type: 3} + m_Script: {fileID: 11500000, guid: 0fda994627665a24b888af25f8c55ce4, type: 3} m_Name: m_EditorClassIdentifier: - m_DescriptionType: 0 - m_DescriptionYOffset: 0 - m_DescriptionText: Save selected strokes to media library - m_LocalizedDescription: - m_TableReference: - m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 - m_TableEntryReference: - m_KeyId: 235160207315525632 - m_Key: - m_FallbackState: 0 - m_WaitForCompletion: 0 - m_LocalVariables: [] + m_Icon: {fileID: 0} +--- !u!1 &1078279024169313268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1078279024169042964} + - component: {fileID: 1305364393919703062} + m_Layer: 16 + m_Name: Slider_TintAmount + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1078279024169042964 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169313268} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.000045075, y: -0.65205, z: -0.030232} + m_LocalScale: {x: 2.053, y: 2.053, z: 2.053} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 1078279024168973654} + - {fileID: 1078279024169018142} + - {fileID: 1078279024169020792} + - {fileID: 1078279024169052162} + - {fileID: 1078279024168982194} + - {fileID: 1078279024168975532} + - {fileID: 1078279024168931616} + - {fileID: 5458987894553289925} + - {fileID: 6660631767829584311} + m_Father: {fileID: 402684} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1305364393919703062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169313268} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a6a239b20194b669fed1c3d221b49d0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 10 + m_Nob: {fileID: 1078279024169266254} + m_Mesh: {fileID: 1078279024171333000} + m_Orientation: 0 + m_DisplayDecimalPlaces: 1 + m_Param1: 0 + m_Param2: 0 + m_safeMin: 0 + m_safeMax: 1 + m_unsafeMin: 0 + m_unsafeMax: 1 + m_SafeLimits: 1 + m_InitialValue: 1 + minText: {fileID: 6316592714180142911} + maxText: {fileID: 4180956646720609620} + valueText: {fileID: 5765733658020396941} + SliderType: 1 + onUpdateValue: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1305364393919703062} + m_TargetAssemblyTypeName: TiltBrush.TintColorAmountSlider, Assembly-CSharp + m_MethodName: HandleValueChanged + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_ShowOnToolType: 5101 + references: + version: 2 + RefIds: [] +--- !u!1 &1078279024169325698 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1078279024168975532} + - component: {fileID: 1078279024170320380} + - component: {fileID: 1078279024171345350} + - component: {fileID: 1078279024179011420} + m_Layer: 16 + m_Name: MinIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1078279024168975532 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169325698} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.2715, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4401791333330103866} + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1078279024170320380 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169325698} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &1078279024171345350 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169325698} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &1078279024179011420 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169325698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fda994627665a24b888af25f8c55ce4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Icon: {fileID: 0} +--- !u!1 &1078279024169328314 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1078279024169052162} + - component: {fileID: 1078279024170256632} + - component: {fileID: 1078279024171275684} + m_Layer: 16 + m_Name: Cap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1078279024169052162 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169328314} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 1, w: 0} + m_LocalPosition: {x: 0.1658, y: 0, z: 0.00021062419} + m_LocalScale: {x: 0.0375, y: 0.0375, z: 0.0375} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4296081577849744267} + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1078279024170256632 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169328314} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1078279024171275684 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169328314} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ca448c25e886c544796b10b98d8aa9cc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1078279024169347952 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1078279024169018142} + - component: {fileID: 1078279024171333000} + - component: {fileID: 1078279024170243292} + m_Layer: 16 + m_Name: Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1078279024169018142 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169347952} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3, y: 0.0375, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1078279024171333000 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169347952} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: db2d9e5107064e64ea8ce921e6f24458, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1078279024170243292 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1078279024169347952} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2450130080402730242 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3089242035506690949} + - component: {fileID: 750291175353026039} + - component: {fileID: 5765733658020396941} + m_Layer: 16 + m_Name: ValueText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3089242035506690949 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2450130080402730242} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.6666667} + m_LocalScale: {x: 51.7122, y: 17.2374, z: 57.458004} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1078279024169020792} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.00066519, y: -2.19} + m_SizeDelta: {x: 0.2, y: 0.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &750291175353026039 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2450130080402730242} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &5765733658020396941 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2450130080402730242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 99 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_sharedMaterial: {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -0.092847615, y: 0, z: -0.103544034, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 750291175353026039} + m_maskType: 0 +--- !u!1 &4011871447704911063 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1210818133549774434} + - component: {fileID: 4510907067803236372} + - component: {fileID: 8214681752030472003} + - component: {fileID: 5616146602988485478} + - component: {fileID: 2060444129593214251} + m_Layer: 16 + m_Name: PanelButton_Webcam + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1210818133549774434 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4011871447704911063} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.415, y: 0.15, z: 0.049999237} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 402684} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4510907067803236372 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4011871447704911063} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &8214681752030472003 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4011871447704911063} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &5616146602988485478 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4011871447704911063} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 03222d9718beeb748bf9e9be379fea39, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Webcam + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 129251051561549824 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: bc16ebd42512d3d479639955f68090a4, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 0 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Type: 5200 + m_AlwaysSpawn: 0 + references: + version: 2 + RefIds: [] +--- !u!65 &2060444129593214251 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4011871447704911063} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.05} +--- !u!1 &6265778997651245187 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5458987894553289925} + - component: {fileID: 7572873268515202481} + - component: {fileID: 6316592714180142911} + m_Layer: 16 + m_Name: MinText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5458987894553289925 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6265778997651245187} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.01} + m_LocalScale: {x: 0.6, y: 0.6, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.267, y: 0} + m_SizeDelta: {x: 0.2, y: 0.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &7572873268515202481 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6265778997651245187} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &6316592714180142911 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6265778997651245187} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 99 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_sharedMaterial: {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 7572873268515202481} + m_maskType: 0 +--- !u!1 &6285019765871003281 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7712825352091082891} + - component: {fileID: 2714904907121016610} + - component: {fileID: 8137723013039395825} + - component: {fileID: 7233644460132284582} + - component: {fileID: 3548459294935518280} + m_Layer: 16 + m_Name: Button_PushPull + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7712825352091082891 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6285019765871003281} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.415, y: -0.3, z: 0.05} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 402684} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2714904907121016610 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6285019765871003281} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &8137723013039395825 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6285019765871003281} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &7233644460132284582 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6285019765871003281} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.05} +--- !u!114 &3548459294935518280 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6285019765871003281} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 962894c5495cabc458506a8548e8a1e2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Push/Pull + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 9cd4500cf7cabfb48b7dff769cc4a0b4, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Tool: 5100 + m_EatGazeInputOnPress: 0 + references: + version: 2 + RefIds: [] +--- !u!1 &6294566030148222674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6292014397156290862} + - component: {fileID: 6280797664358514420} + - component: {fileID: 6272788975588130916} + - component: {fileID: 6320537500852989196} + - component: {fileID: 6254052937444237984} + m_Layer: 16 + m_Name: PanelButton_SaveStrokes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6292014397156290862 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6294566030148222674} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.415, y: 0.6000004, z: 0.05} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 402684} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6280797664358514420 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6294566030148222674} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &6272788975588130916 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6294566030148222674} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6320537500852989196 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6294566030148222674} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: -0.000000074505806, y: 0.000000022351742, z: 0} +--- !u!114 &6254052937444237984 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6294566030148222674} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6c6859eec74651247968d56b594ac313, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Save selected strokes to media library + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 235160207315525632 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] m_DescriptionTextExtra: Save Model m_LocalizedDescriptionExtra: m_TableReference: @@ -3131,3 +4347,1082 @@ MonoBehaviour: references: version: 2 RefIds: [] +--- !u!1 &8425070871067438622 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6660631767829584311} + - component: {fileID: 2609983249887674292} + - component: {fileID: 4180956646720609620} + m_Layer: 16 + m_Name: MaxText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6660631767829584311 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8425070871067438622} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.01} + m_LocalScale: {x: 0.6, y: 0.6, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1078279024169042964} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.269, y: 0} + m_SizeDelta: {x: 0.2, y: 0.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &2609983249887674292 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8425070871067438622} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &4180956646720609620 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8425070871067438622} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 99 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_sharedMaterial: {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 2609983249887674292} + m_maskType: 0 +--- !u!1 &8739216037758194650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8504243446603255984} + - component: {fileID: 1967913610249638616} + - component: {fileID: 8317599595908806246} + - component: {fileID: 6468340066826480351} + - component: {fileID: 654613445191600735} + m_Layer: 16 + m_Name: Button_ColorTint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8504243446603255984 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8739216037758194650} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.3, z: 0.05} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 402684} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1967913610249638616 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8739216037758194650} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &8317599595908806246 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8739216037758194650} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6468340066826480351 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8739216037758194650} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.05} +--- !u!114 &654613445191600735 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8739216037758194650} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 962894c5495cabc458506a8548e8a1e2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Color Tint + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 48c4e2e5ea2c3794fa991bd025329d44, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Tool: 5101 + m_EatGazeInputOnPress: 0 + references: + version: 2 + RefIds: [] +--- !u!1001 &4316005231933525512 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1078279024168931616} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: MaxLimits + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.x + value: 0.09374998 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.y + value: 0.09374998 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.z + value: 0.075 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverScale + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustClick + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustHover + value: -0.001 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: 609917f61fdca0d469c1bc06bfeb713b, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: Maximum Value + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionType + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverBoxColliderGrow + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionActivateSpeed + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1305364393919703062} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: HandleChangeLimits + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.PolyhydraSlider, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &5912165634192525737 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 4316005231933525512} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &4957339798040388060 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1078279024168982194} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: Decrement + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.x + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.y + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.z + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.322 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.01 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverScale + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustClick + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustHover + value: -0.001 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: f74f6eac3e3e3c640b1a343ec46ba2dd, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: Decrease + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionType + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverBoxColliderGrow + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionActivateSpeed + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1305364393919703062} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: HandleDecrement + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.PolyhydraSlider, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &3253216253114574461 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 4957339798040388060} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &5942222473019010090 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1078279024169052162} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: Increment + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.x + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.y + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.z + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.39 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.01000319 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverScale + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustClick + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustHover + value: -0.001 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: ab8b9a0b96b6cb74ca1e518f3c56b425, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: Increase + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionType + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverBoxColliderGrow + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionActivateSpeed + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1305364393919703062} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: HandleIncrement + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.PolyhydraSlider, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &4296081577849744267 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 5942222473019010090} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &6124879346495252891 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1078279024168975532} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: MinLimits + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.x + value: 0.09375 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.y + value: 0.09375 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.z + value: 0.09375 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverScale + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustClick + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ZAdjustHover + value: -0.001 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: 609917f61fdca0d469c1bc06bfeb713b, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: Minimum Value + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionType + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_HoverBoxColliderGrow + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionActivateSpeed + value: 12 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1305364393919703062} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: HandleChangeLimits + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.PolyhydraSlider, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &4401791333330103866 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 6124879346495252891} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8509669835185913993 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 485948} + m_Modifications: + - target: {fileID: 1503094713155990, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_Name + value: PushPullToolTray + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalScale.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalScale.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalScale.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalPosition.x + value: 0.751 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalPosition.y + value: -0.29 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: dda4e1331f7240fb94037b9b86b406e5, type: 3} +--- !u!4 &8509009885981870405 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4073457010706892, guid: dda4e1331f7240fb94037b9b86b406e5, + type: 3} + m_PrefabInstance: {fileID: 8509669835185913993} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Prefabs/Panels/QuillLibraryPanel.prefab b/Assets/Prefabs/Panels/QuillLibraryPanel.prefab new file mode 100644 index 0000000000..2e08b0eec0 --- /dev/null +++ b/Assets/Prefabs/Panels/QuillLibraryPanel.prefab @@ -0,0 +1,6917 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &102468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 474226} + - component: {fileID: 3392684} + - component: {fileID: 2344714} + - component: {fileID: 6548470} + - component: {fileID: 11400036} + m_Layer: 16 + m_Name: Nav_PrevPage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &474226 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102468} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.42, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.25, y: 0.25, z: 0.25} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3392684 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102468} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2344714 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102468} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6548470 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102468} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &11400036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 102468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: f74f6eac3e3e3c640b1a343ec46ba2dd, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 1 + m_GotoPage: 0 + m_InactiveColor: {r: 0, g: 0, b: 0, a: 0} + references: + version: 2 + RefIds: [] +--- !u!1 &109144 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 434670} + - component: {fileID: 3375698} + - component: {fileID: 2326410} + m_Layer: 16 + m_Name: TopBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &434670 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109144} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: -0.0025} + m_LocalScale: {x: 1, y: 0.02857143, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 447228} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3375698 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109144} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2326410 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109144} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &109932 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 405018} + - component: {fileID: 2478559423573741591} + - component: {fileID: 114513666115880546} + - component: {fileID: 5935905570315979955} + - component: {fileID: -6854766032583095187} + m_Layer: 16 + m_Name: QuillLibraryPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &405018 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109932} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 9143484893637275821} + - {fileID: 400638} + - {fileID: 473678} + - {fileID: 1567803981135407331} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2478559423573741591 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109932} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de42dd7c67225e547a781317d2062c31, type: 3} + m_Name: + m_EditorClassIdentifier: + m_PanelType: 11600 + m_Collider: {fileID: 6504288} + m_Mesh: {fileID: 138864} + m_Border: {fileID: 9132082403598193447} + m_BorderIsSplit: 0 + m_BorderTop: {fileID: 0} + m_BorderBottom: {fileID: 0} + m_MeshCollider: {fileID: 6509770} + m_ParticleBounds: {x: 1.2, y: 1.2, z: 0} + m_PanelPopUpMap: + - m_PopUpPrefab: {fileID: 1559017956401146, guid: 8ced6eb9a7ede9742b9b286df62170e0, + type: 3} + m_Command: 97 + - m_PopUpPrefab: {fileID: 137258, guid: d586fafd3f16ec74fbb637cb14b2e2a8, type: 3} + m_Command: 48 + - m_PopUpPrefab: {fileID: 1000011096639514, guid: 9dc4de2350b18cf46a350439738289d9, + type: 3} + m_Command: 29 + - m_PopUpPrefab: {fileID: 8644332587479430734, guid: 4abd2477ca9b56d4ebbc36af78d00b5d, + type: 3} + m_Command: 30 + - m_PopUpPrefab: {fileID: 1559017956401146, guid: 88ca2942036e7b64db2bcaea3ec9d0c9, + type: 3} + m_Command: 3 + - m_PopUpPrefab: {fileID: 1139289437610586, guid: 6cf675b77d4c76a45919feb2ac6bd176, + type: 3} + m_Command: 79 + - m_PopUpPrefab: {fileID: 1559017956401146, guid: 940c6d208ded9a0429e8c24e3d1a6614, + type: 3} + m_Command: 75 + - m_PopUpPrefab: {fileID: 8644332587479430734, guid: 4abd2477ca9b56d4ebbc36af78d00b5d, + type: 3} + m_Command: 95 + - m_PopUpPrefab: {fileID: 8644332587479430734, guid: 008e5015eae1e2d46aca43052484c98b, + type: 3} + m_Command: 94 + - m_PopUpPrefab: {fileID: 1106918886213026712, guid: 07da76f6641f4254a8e66e6eb62bb0e6, + type: 3} + m_Command: 99 + - m_PopUpPrefab: {fileID: 8644332587479430734, guid: bdb7d2ac05cca8346b210c2b576878cb, + type: 3} + m_Command: 5200 + - m_PopUpPrefab: {fileID: 8644332587479430734, guid: bdb7d2ac05cca8346b210c2b576878cb, + type: 3} + m_Command: 13002 + m_PanelDescription: QUILL_PANEL_DESCRIPTION + m_LocalizedPanelDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 467452096813817856 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_PanelDescriptionPrefab: {fileID: 0} + m_PanelDescriptionOffset: {x: 2.25, y: 0, z: 0} + m_PanelDescriptionColor: {r: 1, g: 1, b: 1, a: 1} + m_PanelFlairPrefab: {fileID: 0} + m_PanelFlairOffset: {x: 0, y: 0, z: 0} + m_DescriptionSpringK: 4 + m_DescriptionSpringDampen: 0.2 + m_DescriptionClosedAngle: -90 + m_DescriptionOpenAngle: 0 + m_DescriptionAlphaDistance: 90 + m_Decor: + - {fileID: 6764173967791837319} + - {fileID: 148956} + - {fileID: 135162} + - {fileID: 175552} + - {fileID: 1000012495519762} + - {fileID: 1000010134702830} + - {fileID: 1000013345196914} + - {fileID: 7091369650102597356} + - {fileID: 1644973727690454} + m_GazeHighlightScaleMultiplier: 1.1 + m_BorderMeshWidth: 0.02 + m_BorderMeshAdvWidth: 0.01 + m_PanelSensitivity: 0.1 + m_ClampToBounds: 1 + m_ReticleBounds: {x: 2.8, y: 2.6, z: 0} + m_BorderSphereHighlightRadius: 2.5 + m_PositioningSpheresBounds: {x: 1, y: 1} + m_PositioningSphereRadius: 0.4 + m_UseGazeRotation: 1 + m_MaxGazeRotation: 20 + m_GazeActivateSpeed: 8 + m_InitialSpawnPos: {x: 2, y: 13, z: 2} + m_InitialSpawnRotEulers: {x: 0, y: 0, z: 0} + m_WandAttachAngle: 0 + m_WandAttachYOffset: 0 + m_WandAttachHalfHeight: 1.1 + m_BeginFixed: 0 + m_CanBeFixedToWand: 1 + m_CanBeDetachedFromWand: 1 + m_PopUpGazeDuration: 0.2 + m_PromoBorders: [] + m_PrevButton: {fileID: 102468} + m_NextButton: {fileID: 196312} + m_PanelText: {fileID: 4976050102289928667} + m_PanelTitle: Quill Library + m_InfoText: {fileID: 8107708684278256853} + m_NoQuillData: {fileID: 7091369650102597356} + m_NoImmData: {fileID: 2531254965335807396} + m_RefreshingSpinner: {fileID: 1644973727690454} + m_ConfirmLoadPopUpPrefab: {fileID: 1559017956401146, guid: 8ced6eb9a7ede9742b9b286df62170e0, + type: 3} + m_ActionControlsContainer: {fileID: 3995945028474182159} + m_LoadButton: {fileID: 6926530793036629868} + m_MergeButton: {fileID: 4967946771090340288} + m_ChapterControls: {fileID: 8454802176067762854} + m_ChapterLabel: {fileID: 7599992808865908750} + m_PrevChapterButton: {fileID: 3003255307858151668} + m_NextChapterButton: {fileID: 6688077918051573314} + m_ChapterLoadingSpinner: {fileID: 1644973727690454} + references: + version: 2 + RefIds: [] +--- !u!114 &114513666115880546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109932} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 739d5b1996234d64992a2ae60c3723e9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &5935905570315979955 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109932} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 15156cc6acae14f44863628350e2508d, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &-6854766032583095187 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 109932} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6311d8a25dba6a443be8afe87803c545, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowDuration: 0.25 + m_GrabDistance: 0.5 + m_CollisionRadius: 0.95 + m_AllowTwoHandGrab: 0 + m_DestroyOnHide: 0 + m_AllowHideWithToss: 1 + m_DisableDrift: 0 + m_RecordMovements: 0 + m_AllowSnapping: 0 + m_SnapDisabledDelay: 0.2 + m_AllowPinning: 0 + m_AllowDormancy: 1 + m_TossDuration: 0 + m_TintableMeshes: + - {fileID: 9132082403598193447} + m_SpawnPlacementOffset: {x: 3.5, y: 0, z: 1.5} + m_IntroAnimSpinAmount: 360 + m_BoxCollider: {fileID: 6504288} + m_Mesh: {fileID: 405018} + m_HighlightMeshXfs: + - {fileID: 415298, guid: 87deb34c3f9672645984b6032a6c1f8d, type: 3} + m_ValidSnapRotationStickyAngle: 0 + m_SnapGhostMaterial: {fileID: 0} + m_Border: {fileID: 9143484897294705991} + m_GrabFixedMaxFacingAngle: 70 +--- !u!1 &116946 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 420674} + - component: {fileID: 2321406} + - component: {fileID: 10296668} + m_Layer: 16 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &420674 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116946} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0, z: -0.1} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 475426} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2321406 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116946} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 543b312efaeb6aa4aa25a9e07e815953, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &10296668 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116946} + m_Text: 99 + m_OffsetZ: 0 + m_CharacterSize: 0.06 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!1 &125268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 471736} + - component: {fileID: 3362976} + - component: {fileID: 2337496} + m_Layer: 16 + m_Name: BottomBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &471736 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125268} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.49999997, z: -0.002} + m_LocalScale: {x: 1, y: 0.028571434, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 458322} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3362976 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125268} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2337496 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125268} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &126012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 400638} + - component: {fileID: 6504288} + m_Layer: 16 + m_Name: Collider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400638 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126012} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 405018} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &6504288 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126012} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 2.44, y: 2.7, z: 0.5} + m_Center: {x: 0, y: -0.06, z: 0} +--- !u!1 &127584 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 490548} + - component: {fileID: 3366994} + - component: {fileID: 2359310} + - component: {fileID: 6529362} + - component: {fileID: 11443276} + m_Layer: 16 + m_Name: GalleryButton_Quill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &490548 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127584} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.84, y: 0.618, z: -0.0301} + m_LocalScale: {x: 0.436, y: 0.436, z: 0.436} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 447228} + - {fileID: 458322} + - {fileID: 431352} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3366994 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127584} + m_Mesh: {fileID: 4300000, guid: a25d7d3c2988d7b4eb7e46808a63b24c, type: 3} +--- !u!23 &2359310 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127584} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6529362 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127584} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.12, y: 0.73, z: 0.1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &11443276 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 127584} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 89df2240ec38bba4ab319c4701429927, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: SKETCHBOOK_PANEL_LOCALGALLERY_BUTTON_DESCRIPTION + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 8051469124870144 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: SKETCHBOOK_PANEL_LOCALGALLERY_BUTTON_DESCRIPTION_EXTRA + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 8051592198332416 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 8e9ef71c6619e4d4faf5027d2e486124, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.04 + m_ZAdjustClick: 0 + m_HoverScale: 1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_ButtonType: 0 + references: + version: 2 + RefIds: [] +--- !u!1 &129824 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 499328} + - component: {fileID: 3302166} + - component: {fileID: 2368448} + - component: {fileID: 6522364} + - component: {fileID: 11474338} + m_Layer: 16 + m_Name: JumpPage1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &499328 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129824} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.132, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 440846} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3302166 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129824} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2368448 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129824} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6522364 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129824} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: -0.1} +--- !u!114 &11474338 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 129824} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 6f4bc4516de64ce4e81679185dcd5d54, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.03 + m_HoverScale: 1.25 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 2 + m_GotoPage: 0 + m_InactiveColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} + references: + version: 2 + RefIds: [] +--- !u!1 &131562 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 408284} + - component: {fileID: 2305932} + - component: {fileID: 10216114} + m_Layer: 16 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &408284 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131562} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0, z: -0.1} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 423072} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2305932 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131562} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 543b312efaeb6aa4aa25a9e07e815953, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &10216114 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131562} + m_Text: 99 + m_OffsetZ: 0 + m_CharacterSize: 0.06 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!1 &135162 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 458322} + - component: {fileID: 3351754} + - component: {fileID: 2371844} + m_Layer: 16 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &458322 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 135162} + serializedVersion: 2 + m_LocalRotation: {x: 0.5000001, y: 0.5, z: -0.5, w: 0.49999994} + m_LocalPosition: {x: 0, y: 1.2142847, z: 0.4594286} + m_LocalScale: {x: 0.9142857, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 432950} + - {fileID: 471736} + m_Father: {fileID: 490548} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3351754 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 135162} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2371844 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 135162} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &136488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 432950} + - component: {fileID: 3389112} + - component: {fileID: 2396152} + m_Layer: 16 + m_Name: TopBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &432950 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136488} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.49999997, z: -0.002} + m_LocalScale: {x: 1, y: 0.028571434, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 458322} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3389112 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136488} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2396152 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136488} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &136962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 494534} + - component: {fileID: 3357382} + - component: {fileID: 2392464} + - component: {fileID: 6530300} + - component: {fileID: 11499286} + m_Layer: 16 + m_Name: JumpPage5 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &494534 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136962} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.63, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 440778} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3357382 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136962} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2392464 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136962} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6530300 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136962} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: -0.1} +--- !u!114 &11499286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136962} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 6f4bc4516de64ce4e81679185dcd5d54, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.03 + m_HoverScale: 1.25 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 2 + m_GotoPage: 0 + m_InactiveColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} + references: + version: 2 + RefIds: [] +--- !u!1 &138864 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 473678} + m_Layer: 16 + m_Name: Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &473678 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138864} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1427454329584301013} + - {fileID: 400022} + - {fileID: 2102482207915011070} + - {fileID: 8032093143194521323} + - {fileID: 7243569226208734911} + - {fileID: 2027476496811379697} + - {fileID: 7269933137035287502} + - {fileID: 3184482565529244241} + - {fileID: 379967199458009535} + - {fileID: 7051063518700674551} + - {fileID: 490548} + - {fileID: 4000010470004098} + - {fileID: 474226} + - {fileID: 499328} + - {fileID: 416688} + - {fileID: 475426} + - {fileID: 423072} + - {fileID: 494534} + - {fileID: 410012} + - {fileID: 4067235498706310} + - {fileID: 7854805381944268023} + - {fileID: 6319836514044199644} + - {fileID: 9143484897294705991} + - {fileID: 9145151597995822795} + - {fileID: 9145151597995804229} + - {fileID: 4000012925136122} + - {fileID: 2995495374077016843} + - {fileID: 6482394717467648649} + m_Father: {fileID: 405018} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &142258 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 423072} + - component: {fileID: 3356862} + - component: {fileID: 2386420} + - component: {fileID: 6563536} + - component: {fileID: 11408728} + m_Layer: 16 + m_Name: JumpPage4 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &423072 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142258} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.436, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 408284} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3356862 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142258} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2386420 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142258} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6563536 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142258} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: -0.1} +--- !u!114 &11408728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142258} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 6f4bc4516de64ce4e81679185dcd5d54, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.03 + m_HoverScale: 1.25 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 2 + m_GotoPage: 0 + m_InactiveColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} + references: + version: 2 + RefIds: [] +--- !u!1 &148956 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 447228} + - component: {fileID: 3365804} + - component: {fileID: 2369836} + m_Layer: 16 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &447228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148956} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071067} + m_LocalPosition: {x: 0, y: 0.35714287, z: 0.002285719} + m_LocalScale: {x: 1.7142856, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 434670} + - {fileID: 454538} + m_Father: {fileID: 490548} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3365804 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148956} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2369836 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148956} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &162048 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 427536} + - component: {fileID: 3335230} + - component: {fileID: 2385560} + m_Layer: 16 + m_Name: BottomBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &427536 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162048} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.49999997, z: 0.00228548} + m_LocalScale: {x: 1, y: 0.028571434, z: 0.9142854} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 431352} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3335230 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162048} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2385560 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 162048} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &167948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 494418} + - component: {fileID: 2384872} + - component: {fileID: 10229552} + m_Layer: 16 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &494418 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167948} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0, z: -0.1} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 416688} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2384872 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167948} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 543b312efaeb6aa4aa25a9e07e815953, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &10229552 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167948} + m_Text: 99 + m_OffsetZ: 0 + m_CharacterSize: 0.06 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!1 &168646 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 440846} + - component: {fileID: 2380942} + - component: {fileID: 10296426} + m_Layer: 16 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &440846 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168646} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.1} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 499328} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2380942 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168646} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 543b312efaeb6aa4aa25a9e07e815953, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &10296426 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168646} + m_Text: 99 + m_OffsetZ: 0 + m_CharacterSize: 0.06 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!1 &171976 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 475426} + - component: {fileID: 3376740} + - component: {fileID: 2344784} + - component: {fileID: 6556412} + - component: {fileID: 11406912} + m_Layer: 16 + m_Name: JumpPage3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &475426 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171976} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.245, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 420674} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3376740 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171976} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2344784 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171976} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6556412 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171976} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: -0.1} +--- !u!114 &11406912 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 171976} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 6f4bc4516de64ce4e81679185dcd5d54, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.03 + m_HoverScale: 1.25 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 2 + m_GotoPage: 0 + m_InactiveColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} + references: + version: 2 + RefIds: [] +--- !u!1 &173116 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 454538} + - component: {fileID: 3359794} + - component: {fileID: 2340116} + m_Layer: 16 + m_Name: BottomBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &454538 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173116} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.5, z: -0.0024999883} + m_LocalScale: {x: 1, y: 0.028571432, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 447228} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3359794 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173116} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2340116 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173116} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &174376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 416688} + - component: {fileID: 3373530} + - component: {fileID: 2347558} + - component: {fileID: 6519700} + - component: {fileID: 11468240} + m_Layer: 16 + m_Name: JumpPage2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &416688 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174376} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.058, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 494418} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3373530 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174376} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2347558 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174376} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6519700 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174376} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: -0.1} +--- !u!114 &11468240 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174376} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 6f4bc4516de64ce4e81679185dcd5d54, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.03 + m_HoverScale: 1.25 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 2 + m_GotoPage: 0 + m_InactiveColor: {r: 0.3529412, g: 0.3529412, b: 0.3529412, a: 1} + references: + version: 2 + RefIds: [] +--- !u!1 &175552 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 431352} + - component: {fileID: 3319242} + - component: {fileID: 2342500} + m_Layer: 16 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &431352 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175552} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071067} + m_LocalPosition: {x: 0, y: -1.0697142, z: 0.9165714} + m_LocalScale: {x: 4.5714283, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 441124} + - {fileID: 427536} + m_Father: {fileID: 490548} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3319242 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175552} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2342500 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175552} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &183652 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 440778} + - component: {fileID: 2397020} + - component: {fileID: 10216538} + m_Layer: 16 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &440778 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183652} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0, z: -0.1} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 494534} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2397020 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183652} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 543b312efaeb6aa4aa25a9e07e815953, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &10216538 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 183652} + m_Text: 99 + m_OffsetZ: 0 + m_CharacterSize: 0.06 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!1 &194474 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 441124} + - component: {fileID: 3334046} + - component: {fileID: 2345224} + m_Layer: 16 + m_Name: TopBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &441124 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 194474} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.49999997, z: 0.0022855483} + m_LocalScale: {x: 1, y: 0.028571434, z: 0.9142854} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 431352} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3334046 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 194474} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2345224 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 194474} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &196078 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 400022} + - component: {fileID: 6509770} + m_Layer: 16 + m_Name: MeshCollider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400022 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196078} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &6509770 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196078} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 2.44, y: 2.7, z: 0.042} + m_Center: {x: 0, y: -0.06, z: -0.01} +--- !u!1 &196312 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 410012} + - component: {fileID: 3342126} + - component: {fileID: 2359332} + - component: {fileID: 6506388} + - component: {fileID: 11459642} + m_Layer: 16 + m_Name: Nav_NextPage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &410012 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196312} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.912, y: -0.991, z: -0.04} + m_LocalScale: {x: 0.25, y: 0.25, z: 0.25} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3342126 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196312} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2359332 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196312} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 5ba3c7f8df6e87543a356f17f88601fe, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6506388 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196312} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &11459642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196312} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dbae3ff4457df6f4ea3af0389871cb9c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: ab8b9a0b96b6cb74ca1e518f3c56b425, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SelectionTexture: {fileID: 0} + m_ButtonType: 0 + m_GotoPage: 0 + m_InactiveColor: {r: 0, g: 0, b: 0, a: 0} + references: + version: 2 + RefIds: [] +--- !u!1 &1000010118716738 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013078219060} + - component: {fileID: 33000011125244486} + - component: {fileID: 23000011806362410} + m_Layer: 16 + m_Name: BottomBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013078219060 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010118716738} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.49999997, z: -0.002} + m_LocalScale: {x: 1, y: 0.028571434, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000011206878738} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000011125244486 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010118716738} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000011806362410 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010118716738} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000010134702830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000011206878738} + - component: {fileID: 33000011206434982} + - component: {fileID: 23000010270107320} + m_Layer: 16 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &4000011206878738 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010134702830} + serializedVersion: 2 + m_LocalRotation: {x: 0.5000001, y: 0.5, z: -0.5, w: 0.49999994} + m_LocalPosition: {x: 0, y: 1.2142847, z: 0.4594286} + m_LocalScale: {x: 0.9142857, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4000010892569700} + - {fileID: 4000013078219060} + m_Father: {fileID: 4000010470004098} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000011206434982 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010134702830} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000010270107320 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010134702830} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000010401472448 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000012925136122} + m_Layer: 16 + m_Name: Sketchbook + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000012925136122 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010401472448} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4000011551526080} + - {fileID: 4000013013276346} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1000011094475738 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000011551526080} + - component: {fileID: 33000011121147842} + - component: {fileID: 23000012348211526} + m_Layer: 16 + m_Name: SketchbookBg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000011551526080 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011094475738} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000012925136122} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000011121147842 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011094475738} + m_Mesh: {fileID: 4300002, guid: d84d90f974e4ad84fad7e02769b22f11, type: 3} +--- !u!23 &23000012348211526 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011094475738} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: db0305ff9081c3b448ac79e85d26e5d4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000011517226962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000010892569700} + - component: {fileID: 33000011120581400} + - component: {fileID: 23000011159452854} + m_Layer: 16 + m_Name: TopBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000010892569700 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011517226962} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.49999997, z: -0.002} + m_LocalScale: {x: 1, y: 0.028571434, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000011206878738} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000011120581400 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011517226962} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000011159452854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011517226962} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000011622452938 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000010470004098} + - component: {fileID: 33000010882293456} + - component: {fileID: 23000010524948804} + - component: {fileID: 65000010333358966} + - component: {fileID: 114000011006960986} + m_Layer: 16 + m_Name: GalleryButton_IMM + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000010470004098 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011622452938} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.84, y: 0.29140002, z: -0.0301} + m_LocalScale: {x: 0.436, y: 0.436, z: 0.436} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4000014044617982} + - {fileID: 4000011206878738} + - {fileID: 4000011225904734} + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000010882293456 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011622452938} + m_Mesh: {fileID: 4300000, guid: b78271332916ed14da90a2894e22e012, type: 3} +--- !u!23 &23000010524948804 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011622452938} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &65000010333358966 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011622452938} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.12, y: 0.73, z: 0.1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &114000011006960986 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011622452938} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 89df2240ec38bba4ab319c4701429927, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: SKETCHBOOK_PANEL_SHOWCASE_BUTTON_DESCRIPTION + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 8051847228792832 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: SKETCHBOOK_PANEL_SHOWCASE_BUTTON_DESCRIPTION_EXTRA + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 8052065399709696 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 78bb99e2fe13ca44d9d0b4ab7882f4ce, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.04 + m_ZAdjustClick: 0 + m_HoverScale: 1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_ButtonType: 1 + references: + version: 2 + RefIds: [] +--- !u!1 &1000011797134698 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000012956736620} + - component: {fileID: 33000011351091714} + - component: {fileID: 23000010144209866} + m_Layer: 16 + m_Name: TopBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000012956736620 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011797134698} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: -0.0025} + m_LocalScale: {x: 1, y: 0.02857143, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000014044617982} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000011351091714 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011797134698} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000010144209866 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011797134698} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000012149669276 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013563491830} + - component: {fileID: 33000010883985424} + - component: {fileID: 23000012392550902} + m_Layer: 16 + m_Name: BottomBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013563491830 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012149669276} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.49999997, z: 0.00228548} + m_LocalScale: {x: 1, y: 0.028571434, z: 0.9142854} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000011225904734} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000010883985424 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012149669276} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000012392550902 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012149669276} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000012311522496 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000010013684490} + - component: {fileID: 33000012851111020} + - component: {fileID: 23000011541119754} + m_Layer: 16 + m_Name: BottomBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000010013684490 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012311522496} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.5, z: -0.0024999883} + m_LocalScale: {x: 1, y: 0.028571432, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000014044617982} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000012851111020 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012311522496} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000011541119754 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012311522496} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000012495519762 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000014044617982} + - component: {fileID: 33000013472049802} + - component: {fileID: 23000010645622776} + m_Layer: 16 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &4000014044617982 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012495519762} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071067} + m_LocalPosition: {x: 0, y: 0.35714287, z: 0.002285719} + m_LocalScale: {x: 1.7142856, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4000012956736620} + - {fileID: 4000010013684490} + m_Father: {fileID: 4000010470004098} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000013472049802 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012495519762} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000010645622776 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012495519762} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000013171469736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013753592404} + - component: {fileID: 33000010406950982} + - component: {fileID: 23000011647786516} + m_Layer: 16 + m_Name: TopBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013753592404 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013171469736} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.49999997, z: 0.0022855483} + m_LocalScale: {x: 1, y: 0.028571434, z: 0.9142854} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000011225904734} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000010406950982 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013171469736} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000011647786516 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013171469736} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000013281891730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013013276346} + - component: {fileID: 33000010839572548} + - component: {fileID: 23000010888086858} + m_Layer: 16 + m_Name: SketchbookLeftColumn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013013276346 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013281891730} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} + m_LocalPosition: {x: -0, y: 0, z: 0} + m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000012925136122} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000010839572548 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013281891730} + m_Mesh: {fileID: 4300000, guid: d84d90f974e4ad84fad7e02769b22f11, type: 3} +--- !u!23 &23000010888086858 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013281891730} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8fe8230ee7ae32a4eb7fe6d5df34ebd4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1000013345196914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000011225904734} + - component: {fileID: 33000010676958356} + - component: {fileID: 23000011105810680} + m_Layer: 16 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &4000011225904734 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013345196914} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071067} + m_LocalPosition: {x: 0, y: -1.0697142, z: 0.9165714} + m_LocalScale: {x: 4.5714283, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4000013753592404} + - {fileID: 4000013563491830} + m_Father: {fileID: 4000010470004098} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000010676958356 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013345196914} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23000011105810680 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013345196914} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8da1dcc64b3bf2640af4fc243b5151cf, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1644973727690454 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4067235498706310} + - component: {fileID: 33567874645767864} + - component: {fileID: 23579533556926390} + - component: {fileID: 114182893473587560} + m_Layer: 16 + m_Name: LoadingGallery + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4067235498706310 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1644973727690454} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.847, y: 1.001, z: -0.05} + m_LocalScale: {x: 0.4, y: 0.4, z: 0.4} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33567874645767864 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1644973727690454} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &23579533556926390 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1644973727690454} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 7dd436b1e98554d4daef5bc9d1eeaae9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &114182893473587560 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1644973727690454} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0278ab0b9144784db8dad7f91bd1d11, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Speed: -180 +--- !u!1 &352394367060839962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7051063518700674551} + - component: {fileID: 1945630558552583051} + - component: {fileID: 8107708684278256853} + m_Layer: 16 + m_Name: Info Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7051063518700674551 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 352394367060839962} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.002} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.049, y: -1.066} + m_SizeDelta: {x: 0.24, y: 0.22} + m_Pivot: {x: 0, y: 1} +--- !u!23 &1945630558552583051 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 352394367060839962} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &8107708684278256853 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 352394367060839962} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Info text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -0.16030574, y: 0.022900939, z: -0.5095454, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 1945630558552583051} + m_maskType: 0 +--- !u!1 &521032283565671853 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3782314916747243335} + - component: {fileID: 5667000228176286458} + - component: {fileID: 7599992808865908750} + m_Layer: 0 + m_Name: ChapterLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3782314916747243335 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 521032283565671853} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6158179133512803430} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.786, y: 0} + m_SizeDelta: {x: 3, y: 0.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &5667000228176286458 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 521032283565671853} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &7599992808865908750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 521032283565671853} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Chapter 1 / 1 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1.2 + m_fontSizeBase: 1.2 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 2.3241677, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 5667000228176286458} + m_maskType: 0 +--- !u!1 &2531254965335807396 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6319836514044199644} + - component: {fileID: 9166932320136000471} + - component: {fileID: 2200516072011915162} + - component: {fileID: 3341243072899607176} + m_Layer: 16 + m_Name: NoImmSketchesMessage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6319836514044199644 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2531254965335807396} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.05} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.24, y: 0} + m_SizeDelta: {x: 1.5, y: 1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &9166932320136000471 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2531254965335807396} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &2200516072011915162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2531254965335807396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: No .imm files found in your Media Library + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 2.56 + m_fontSizeBase: 2.56 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: -40 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 9166932320136000471} + m_maskType: 0 +--- !u!114 &3341243072899607176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2531254965335807396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 69beb381e244f92449b8c4cf954630e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackedObjects: + - rid: 8021623547164098560 + references: + version: 2 + RefIds: + - rid: 8021623547164098560 + type: {class: TrackedUGuiGraphic, ns: UnityEngine.Localization.PropertyVariants.TrackedObjects, + asm: Unity.Localization} + data: + m_Target: {fileID: 2200516072011915162} + m_TrackedProperties: + items: + - rid: 8021623547164098561 + m_UpdateType: 0 + - rid: 8021623547164098561 + type: {class: LocalizedStringProperty, ns: UnityEngine.Localization.PropertyVariants.TrackedProperties, + asm: Unity.Localization} + data: + m_Localized: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 467464562255945728 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_PropertyPath: m_text +--- !u!1 &3248202349853577080 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3251332893237648040} + - component: {fileID: 3271234925389514692} + - component: {fileID: 3261517433956467180} + - component: {fileID: 3312621466675388676} + - component: {fileID: 3003255307858151668} + m_Layer: 16 + m_Name: PrevChapterButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3251332893237648040 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3248202349853577080} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: 0.005, z: -0.1} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 6158179133512803430} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3271234925389514692 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3248202349853577080} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &3261517433956467180 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3248202349853577080} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &3312621466675388676 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3248202349853577080} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &3003255307858151668 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3248202349853577080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 065fe1d14b34696409fc114babcd2c05, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Previous Chapter + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: f74f6eac3e3e3c640b1a343ec46ba2dd, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.02 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_IsNext: 0 + references: + version: 2 + RefIds: [] +--- !u!1 &3995945028474182159 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1567803981135407331} + m_Layer: 0 + m_Name: ActionControlsContainer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1567803981135407331 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3995945028474182159} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.023, y: 0.018, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 805134175941842630} + - {fileID: 6158179133512803430} + m_Father: {fileID: 405018} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4541059101776309643 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2995495374077016843} + - component: {fileID: 1518991679475724286} + - component: {fileID: 6295867816861463663} + - component: {fileID: 1848067996216223640} + - component: {fileID: 4583648030283729929} + m_Layer: 16 + m_Name: RandomFileButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2995495374077016843 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4541059101776309643} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.841, y: -0.843, z: -0.093} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1518991679475724286 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4541059101776309643} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &6295867816861463663 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4541059101776309643} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &1848067996216223640 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4541059101776309643} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &4583648030283729929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4541059101776309643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 07f172f1096366841bb9362060bb0095, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: ICOSAPANEL_PANEL_SEARCH_POPUP + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 5147011692863488 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 9b82f38d1c06a854faadd9c2ea76b48b, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 0 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.02 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Action: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 2478559423573741591} + m_TargetAssemblyTypeName: TiltBrush.QuillLibraryPanel, Assembly-CSharp + m_MethodName: HandleRandomFileButton + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] +--- !u!1 &5484773322225218268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8785176659560756378} + - component: {fileID: 6968941631519255205} + - component: {fileID: 528222800377685122} + - component: {fileID: 5737293356381849980} + - component: {fileID: 6688077918051573314} + m_Layer: 16 + m_Name: NextChapterButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8785176659560756378 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5484773322225218268} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.828, y: 0.004999995, z: -0.1} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 6158179133512803430} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6968941631519255205 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5484773322225218268} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &528222800377685122 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5484773322225218268} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &5737293356381849980 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5484773322225218268} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &6688077918051573314 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5484773322225218268} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 065fe1d14b34696409fc114babcd2c05, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Next Chapter + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: ab8b9a0b96b6cb74ca1e518f3c56b425, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.02 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_IsNext: 1 + references: + version: 2 + RefIds: [] +--- !u!1 &6483766742326884185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6482394717467648649} + - component: {fileID: 6452773678983659493} + - component: {fileID: 6461017844162640333} + - component: {fileID: 6418141843501553957} + - component: {fileID: 6372441455290288415} + m_Layer: 16 + m_Name: OpenSearchKeyboardButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6482394717467648649 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6483766742326884185} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.841, y: -1.032, z: -0.093} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6452773678983659493 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6483766742326884185} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &6461017844162640333 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6483766742326884185} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6418141843501553957 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6483766742326884185} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &6372441455290288415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6483766742326884185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 68ab65faed9850448927b196242878d7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: ICOSAPANEL_PANEL_SEARCH_POPUP + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 332573810292776960 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 8926f00c2d3324d4684ca80ea3e8308e, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 0 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.02 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_Command: 13002 + m_CommandParam: -1 + m_CommandParam2: -1 + m_RequiresPopup: 1 + m_CenterPopupOnButton: 0 + m_PopupOffset: {x: 0, y: 0, z: 0} + m_PopupText: ICOSAPANEL_PANEL_SEARCH_POPUP + m_LocalizedPopup: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 332573810292776960 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_ToggleOnDescription: + m_LocalizedToggleOnDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_ToggleOnTexture: {fileID: 0} + m_AllowUnavailable: 0 + m_LinkedUIObject: {fileID: 0} + m_BeforePopupAction: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 2478559423573741591} + m_TargetAssemblyTypeName: TiltBrush.QuillLibraryPanel, Assembly-CSharp + m_MethodName: SetInitialSearchText + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 6372441455290288415} + m_ObjectArgumentAssemblyTypeName: TiltBrush.KeyboardPopupButton, Assembly-CSharp + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + references: + version: 2 + RefIds: [] +--- !u!1 &6764173967791837319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1427454329584301013} + - component: {fileID: 8318070951826257655} + - component: {fileID: 4976050102289928667} + m_Layer: 16 + m_Name: Panel Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1427454329584301013 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6764173967791837319} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.002} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.518, y: 1.122} + m_SizeDelta: {x: 0.24, y: 0.22} + m_Pivot: {x: 0, y: 1} +--- !u!23 &8318070951826257655 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6764173967791837319} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &4976050102289928667 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6764173967791837319} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 'Browsing:' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1.6 + m_fontSizeBase: 1.6 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: -0.91909444, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 8318070951826257655} + m_maskType: 0 +--- !u!1 &7091369650102597356 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7854805381944268023} + - component: {fileID: 8359635418679280357} + - component: {fileID: 6753750304303413682} + - component: {fileID: 506523503681912987} + m_Layer: 16 + m_Name: NoQuillSketchesMessage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7854805381944268023 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7091369650102597356} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.05} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.24, y: 0} + m_SizeDelta: {x: 1.5, y: 1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &8359635418679280357 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7091369650102597356} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &6753750304303413682 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7091369650102597356} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: No Quill Sketches found in your Quill folder + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 2.56 + m_fontSizeBase: 2.56 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: -40 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 8359635418679280357} + m_maskType: 0 +--- !u!114 &506523503681912987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7091369650102597356} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 69beb381e244f92449b8c4cf954630e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackedObjects: + - rid: 8021623547164098560 + references: + version: 2 + RefIds: + - rid: 8021623547164098560 + type: {class: TrackedUGuiGraphic, ns: UnityEngine.Localization.PropertyVariants.TrackedObjects, + asm: Unity.Localization} + data: + m_Target: {fileID: 6753750304303413682} + m_TrackedProperties: + items: + - rid: 8021623547164098561 + m_UpdateType: 0 + - rid: 8021623547164098561 + type: {class: LocalizedStringProperty, ns: UnityEngine.Localization.PropertyVariants.TrackedProperties, + asm: Unity.Localization} + data: + m_Localized: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 467464424217206784 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_PropertyPath: m_text +--- !u!1 &8454802176067762854 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6158179133512803430} + m_Layer: 0 + m_Name: ChapterControls + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6158179133512803430 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8454802176067762854} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.165, y: -0.737, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3251332893237648040} + - {fileID: 8785176659560756378} + - {fileID: 3782314916747243335} + m_Father: {fileID: 1567803981135407331} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8909527182059533561 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 805134175941842630} + m_Layer: 0 + m_Name: ActionButtons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &805134175941842630 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8909527182059533561} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.275, y: 0.202, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7254526931902190896} + - {fileID: 4630557505455090588} + m_Father: {fileID: 1567803981135407331} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &9145007013707673725 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9143484893637275821} + - component: {fileID: 9124055045891271953} + - component: {fileID: 9132082402328756939} + m_Layer: 16 + m_Name: _Bounds(inactive) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &9143484893637275821 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145007013707673725} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.06, y: 0, z: 0} + m_LocalScale: {x: 2.06, y: 2.55, z: 2.4} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 405018} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &9124055045891271953 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145007013707673725} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &9132082402328756939 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145007013707673725} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &9145007014350871389 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9143484897294705991} + - component: {fileID: 9124055052324816675} + - component: {fileID: 9132082403598193447} + m_Layer: 16 + m_Name: Border + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9143484897294705991 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145007014350871389} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: -0.029} + m_LocalScale: {x: 100.21, y: 100.21, z: 100.21} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &9124055052324816675 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145007014350871389} + m_Mesh: {fileID: 4300004, guid: d84d90f974e4ad84fad7e02769b22f11, type: 3} +--- !u!23 &9132082403598193447 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145007014350871389} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3e92ccbfed650604686991e69902e663, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &9145151597996015719 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9145151597995822795} + - component: {fileID: 9145151597998209181} + m_Layer: 16 + m_Name: MeshCollider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9145151597995822795 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145151597996015719} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.000000044703, y: 0, z: -0.016531} + m_LocalScale: {x: 1.55664, y: 1.3536, z: 1.3536} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &9145151597998209181 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145151597996015719} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.4, y: 1.9, z: 0.02} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &9145151597996066563 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9145151597995804229} + - component: {fileID: 9145151597995083681} + m_Layer: 16 + m_Name: HighlightMesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9145151597995804229 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145151597996066563} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.000000044703, y: 0, z: -0.016531} + m_LocalScale: {x: 1.55664, y: 1.3536, z: 0.013536} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 473678} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &9145151597995083681 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9145151597996066563} + m_Mesh: {fileID: 4300000, guid: 2e84a1bef3eae8d44ae00479eeace4d1, type: 3} +--- !u!1001 &378085597669663154 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 2 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.574 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &8032093143194521323 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 378085597669663154} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &956167726185419409 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 805134175941842630} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: Load + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.x + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.y + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.z + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.62799996 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.931 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.087 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ConstrainProportionsScale + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: 76b0ea310b256af4eb1278fbbb6848ef, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: Load as new sketch + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 2478559423573741591} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnLoadButtonPressed + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.QuillLibraryPanel, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!114 &6926530793036629868 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 956167726185419409} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 07f172f1096366841bb9362060bb0095, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &7254526931902190896 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 956167726185419409} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1057076367225205911 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 5 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.026000023 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &7269933137035287502 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 1057076367225205911} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1067022314096296422 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 3 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.37399998 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &7243569226208734911 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 1067022314096296422} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &3002413525593893949 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 805134175941842630} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: Merge + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.x + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.y + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalScale.z + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.374 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.93 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.087 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ConstrainProportionsScale + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: 8e8ff83a9fcd53a47aa617cca57a09f3, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: Merge into current sketch + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 2478559423573741591} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: OnMergeButtonPressed + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.QuillLibraryPanel, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &4630557505455090588 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 3002413525593893949} + m_PrefabAsset: {fileID: 0} +--- !u!114 &4967946771090340288 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 3002413525593893949} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 07f172f1096366841bb9362060bb0095, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &5078106496155581704 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 6 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.22600003 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &3184482565529244241 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 5078106496155581704} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8002169584436236006 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 7 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.42600003 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &379967199458009535 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 8002169584436236006} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8533067648141501608 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 4 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.17399998 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &2027476496811379697 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 8533067648141501608} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8603287734853108903 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 473678} + m_Modifications: + - target: {fileID: 7657350995434470025, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_Name + value: QuillFileButton 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.033000007 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.774 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalPosition.z + value: -0.029000014 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4c0106cf936933347a80b004158e794c, type: 3} +--- !u!4 &2102482207915011070 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7658512940617658201, guid: 4c0106cf936933347a80b004158e794c, + type: 3} + m_PrefabInstance: {fileID: 8603287734853108903} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Prefabs/Panels/QuillLibraryPanel.prefab.meta b/Assets/Prefabs/Panels/QuillLibraryPanel.prefab.meta new file mode 100644 index 0000000000..802f5e78d6 --- /dev/null +++ b/Assets/Prefabs/Panels/QuillLibraryPanel.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 25ef2a4f5d9580940a252d69638f77ce +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanel.prefab b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanel.prefab index b9529213a1..2898887552 100644 --- a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanel.prefab +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanel.prefab @@ -53,6 +53,9 @@ MonoBehaviour: m_Collider: {fileID: 6578658} m_Mesh: {fileID: 167476} m_Border: {fileID: 23000014036988540} + m_BorderIsSplit: 0 + m_BorderTop: {fileID: 0} + m_BorderBottom: {fileID: 0} m_MeshCollider: {fileID: 6508354} m_ParticleBounds: {x: 1.8, y: 2.2, z: 0} m_PanelPopUpMap: @@ -121,6 +124,7 @@ MonoBehaviour: - {fileID: 6916756850496021501} - {fileID: 4511428163058511989} - {fileID: 8011007686951140277} + - {fileID: 7041335267395420804} m_ExtraBorders: - {fileID: 3545759370252767883} m_RefreshingSpinner: {fileID: 2793114836075558058} @@ -658,9 +662,9 @@ Transform: m_GameObject: {fileID: 1000011504539966} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -0.693, y: 0.956, z: 0} - m_LocalScale: {x: 0.26999998, y: 0.26999998, z: 0.26999998} - m_ConstrainProportionsScale: 0 + m_LocalPosition: {x: -0.693, y: 1.052, z: 0} + m_LocalScale: {x: 0.15, y: 0.15, z: 0.15} + m_ConstrainProportionsScale: 1 m_Children: [] m_Father: {fileID: 465812} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1786,7 +1790,7 @@ Transform: m_GameObject: {fileID: 6298209575442832167} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 0, y: 0.193, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1795,6 +1799,7 @@ Transform: - {fileID: 8642672171813981533} - {fileID: 8169998680714821875} - {fileID: 2809354218209664300} + - {fileID: 7212281109223797171} m_Father: {fileID: 465812} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6688829240374092959 @@ -1831,6 +1836,7 @@ Transform: - {fileID: 2069344145590318387} - {fileID: 8904216512971985411} - {fileID: 3199342648888667515} + - {fileID: 2521260574376563786} m_Father: {fileID: 465812} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &6860941104539570804 @@ -2004,6 +2010,92 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_renderer: {fileID: 5100797947387487618} m_maskType: 0 +--- !u!1001 &1658028840619810788 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 5575169286801542507} + m_Modifications: + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8695216695422032127, guid: bc59f933f07268642a3319d424409949, + type: 3} + propertyPath: m_Name + value: ReferencePanelTabSoundClip + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bc59f933f07268642a3319d424409949, type: 3} +--- !u!4 &2521260574376563786 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3891058746504678318, guid: bc59f933f07268642a3319d424409949, + type: 3} + m_PrefabInstance: {fileID: 1658028840619810788} + m_PrefabAsset: {fileID: 0} +--- !u!114 &7041335267395420804 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 8553841389093772640, guid: bc59f933f07268642a3319d424409949, + type: 3} + m_PrefabInstance: {fileID: 1658028840619810788} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dcee1b430b77a424cb40c11cdf48c840, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &1697688316793202177 PrefabInstance: m_ObjectHideFlags: 0 @@ -2242,6 +2334,11 @@ PrefabInstance: propertyPath: m_Name value: ReferencePanelTabVideo objectReference: {fileID: 0} + - target: {fileID: 5495763216787016347, guid: 078850db44b50294dbeba3807cf25418, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2720,6 +2817,95 @@ Transform: type: 3} m_PrefabInstance: {fileID: 4948472521278276297} m_PrefabAsset: {fileID: 0} +--- !u!1001 &5960070999114058200 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 8533497137806158463} + m_Modifications: + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.68226534 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.86245 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.003 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3939805207058402167, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_Name + value: ReferencePanelLibrayButtonSoundClip + objectReference: {fileID: 0} + - target: {fileID: 3979616502385903245, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_ButtonType + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 3979616502385903245, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: 32c1b6205fdb5af4996e2a51c4df9eb7, type: 3} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: e5780f95f442f3a4da78f2223e188565, type: 3} +--- !u!4 &7212281109223797171 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3936506208097564779, guid: e5780f95f442f3a4da78f2223e188565, + type: 3} + m_PrefabInstance: {fileID: 5960070999114058200} + m_PrefabAsset: {fileID: 0} --- !u!1001 &6150219997261872517 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelIconVideo 1.prefab b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelIconVideo 1.prefab new file mode 100644 index 0000000000..6eeaa27b97 --- /dev/null +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelIconVideo 1.prefab @@ -0,0 +1,126 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &7042166879067477140 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.41820002 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962014025, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2479500690962267317, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + propertyPath: m_Name + value: ReferencePanelIconVideo 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4a65493d12e7e0948a7d4c2826d24be3, type: 3} +--- !u!1 &4887032089606793249 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2479500690962267317, guid: 4a65493d12e7e0948a7d4c2826d24be3, + type: 3} + m_PrefabInstance: {fileID: 7042166879067477140} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1319052699816627709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4887032089606793249} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 24551363d68fa9848b0d5e8aa9e245ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 92139e46e58d3924fb8e16ba42a0145f, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 0 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + references: + version: 2 + RefIds: [] diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelIconVideo 1.prefab.meta b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelIconVideo 1.prefab.meta new file mode 100644 index 0000000000..d291eb9ad0 --- /dev/null +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelIconVideo 1.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bf78ede73a1b5654cb9943c8944692b4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelLibrayButtonSoundClip.prefab b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelLibrayButtonSoundClip.prefab new file mode 100644 index 0000000000..d191963455 --- /dev/null +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelLibrayButtonSoundClip.prefab @@ -0,0 +1,150 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3939805207058402167 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3936506208097564779} + - component: {fileID: 3952558626498758423} + - component: {fileID: 3962820316465271873} + - component: {fileID: 3911832977196612369} + - component: {fileID: 3979616502385903245} + m_Layer: 16 + m_Name: ReferencePanelLibrayButtonSoundClip + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3936506208097564779 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3939805207058402167} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.68226534, y: -1.014, z: 0.003} + m_LocalScale: {x: 0.39299998, y: 0.39299998, z: 0.39299998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3952558626498758423 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3939805207058402167} + m_Mesh: {fileID: 4300000, guid: a25d7d3c2988d7b4eb7e46808a63b24c, type: 3} +--- !u!23 &3962820316465271873 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3939805207058402167} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ecc3497a7e7c32648ac760d1fbecdb73, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &3911832977196612369 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3939805207058402167} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1.1, y: 0.8, z: 0.025} + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &3979616502385903245 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3939805207058402167} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cd93e96b781b14453b31e8ecb9ac1204, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: PANEL_AUDIO_CLIP_DESCRIPTION + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 144201565051027456 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: be5ae98f7ff9b5c48aab7018e4c1084c, type: 3} + m_AtlasTexture: 0 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.05 + m_ZAdjustClick: 0 + m_HoverScale: 1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_ButtonType: 5 + references: + version: 2 + RefIds: [] diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelLibrayButtonSoundClip.prefab.meta b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelLibrayButtonSoundClip.prefab.meta new file mode 100644 index 0000000000..f4cc8b96c5 --- /dev/null +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelLibrayButtonSoundClip.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e5780f95f442f3a4da78f2223e188565 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelTabSoundClip.prefab b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelTabSoundClip.prefab new file mode 100644 index 0000000000..b2390a56e4 --- /dev/null +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelTabSoundClip.prefab @@ -0,0 +1,3679 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &896181631421354844 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1975088546650945687} + - component: {fileID: 6611605048997756351} + - component: {fileID: 5128619659554451441} + - component: {fileID: 1049992680186265284} + m_Layer: 16 + m_Name: Quad + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1975088546650945687 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896181631421354844} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.09, z: 0} + m_LocalScale: {x: 1.77, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 322677208594315543} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6611605048997756351 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896181631421354844} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5128619659554451441 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896181631421354844} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8abca4e4c3fe53347928928c0b64d985, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &1049992680186265284 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896181631421354844} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1135722248369929032 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6737648776021719934} + - component: {fileID: 1955147190906362814} + - component: {fileID: 34669125957242995} + - component: {fileID: 6746144757271315879} + m_Layer: 16 + m_Name: SliderPosition + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6737648776021719934 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135722248369929032} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.0776, y: 0, z: 0} + m_LocalScale: {x: 0.017416663, y: 0.032291666, z: 0.015000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1955147190906362814 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135722248369929032} + m_Mesh: {fileID: 4300000, guid: 5ef960ddf11c1fd4983638f56f6a8be0, type: 3} +--- !u!23 &34669125957242995 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135722248369929032} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3e92ccbfed650604686991e69902e663, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &6746144757271315879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135722248369929032} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aaefde5afe80784e908d27fcb05a101, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OffsetOverride: -1 +--- !u!1 &1706979252263207253 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5514102902807864122} + - component: {fileID: 2067168096657269316} + - component: {fileID: 38095516118510962} + m_Layer: 16 + m_Name: SpatialLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5514102902807864122 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706979252263207253} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.5} + m_LocalScale: {x: 10, y: 10, z: 10} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4338684405310701285} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 1.2999997, y: 2.68} + m_SizeDelta: {x: 0.87, y: 0.3} + m_Pivot: {x: 0, y: 1} +--- !u!23 &2067168096657269316 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706979252263207253} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &38095516118510962 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1706979252263207253} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Spatial + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0.18338251, z: 0.54800665, w: -0.05648184} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 2067168096657269316} + m_maskType: 0 +--- !u!1 &1764577096919167702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1764577096919658230} + - component: {fileID: 1764577096918363862} + - component: {fileID: 1764577096917232662} + - component: {fileID: 3285889161136258260} + - component: {fileID: 7840759891445544538} + m_Layer: 0 + m_Name: SoundClipControls + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1764577096919658230 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764577096919167702} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.77604264, y: -0.2735, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 322677208594315543} + - {fileID: 2042477159760314479} + - {fileID: 5075429281413830507} + - {fileID: 4338684405310701285} + - {fileID: 6826766934122703524} + - {fileID: 4871108018091631855} + m_Father: {fileID: 7488257428914698293} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1764577096918363862 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764577096919167702} + m_Mesh: {fileID: 4300000, guid: 16fad2a698203b44bb45a3844e1ad126, type: 3} +--- !u!23 &1764577096917232662 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764577096919167702} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3e92ccbfed650604686991e69902e663, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &3285889161136258260 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764577096919167702} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.4325049, y: 1.86, z: 0.10579379} + m_Center: {x: 0.00015869737, y: -0.0006583929, z: 0.05061435} +--- !u!114 &7840759891445544538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764577096919167702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aaefde5afe80784e908d27fcb05a101, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OffsetOverride: -1 +--- !u!1 &2042477159760005609 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760376109} + - component: {fileID: 2042477159758334565} + m_Layer: 16 + m_Name: Collider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2042477159760376109 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760005609} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.295, y: 0.109721534, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2042477159758334565 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760005609} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &2042477159760013365 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760292099} + - component: {fileID: 2042477159761060301} + - component: {fileID: 2042477159762196183} + - component: {fileID: 2147980562275335721} + m_Layer: 16 + m_Name: SliderPosition + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2042477159760292099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760013365} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.1307, y: 0, z: 0} + m_LocalScale: {x: 0.01, y: 0.05, z: 0.015} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2042477159761060301 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760013365} + m_Mesh: {fileID: 4300000, guid: 5ef960ddf11c1fd4983638f56f6a8be0, type: 3} +--- !u!23 &2042477159762196183 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760013365} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3e92ccbfed650604686991e69902e663, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &2147980562275335721 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760013365} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aaefde5afe80784e908d27fcb05a101, type: 3} + m_Name: + m_EditorClassIdentifier: + m_OffsetOverride: -1 +--- !u!1 &2042477159760024859 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760384713} + - component: {fileID: 2042477159761138239} + - component: {fileID: 2042477159762183781} + m_Layer: 16 + m_Name: Cap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2042477159760384713 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760024859} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.1682, y: -0, z: 0.0002105044} + m_LocalScale: {x: 0.0375, y: 0.0375, z: 0.0375} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2042477159761138239 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760024859} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2042477159762183781 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760024859} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ca448c25e886c544796b10b98d8aa9cc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &2042477159760062113 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760336219} + - component: {fileID: 2042477159761132933} + - component: {fileID: 2042477159762229907} + - component: {fileID: 2042477159770284949} + m_Layer: 16 + m_Name: MaxIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2042477159760336219 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760062113} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: -0.7071068} + m_LocalPosition: {x: 0.2698, y: -0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2042477159761132933 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760062113} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &2042477159762229907 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760062113} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &2042477159770284949 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760062113} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fda994627665a24b888af25f8c55ce4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Icon: {fileID: 2800000, guid: b474ed7ef5a1e1f44be200e24a9c3e39, type: 3} +--- !u!1 &2042477159760062351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760314479} + - component: {fileID: 3260295787887953759} + m_Layer: 16 + m_Name: TimelineSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2042477159760314479 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760062351} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.34, z: -0.03} + m_LocalScale: {x: 4.18, y: 1.55, z: 2.5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2042477159760376109} + - {fileID: 2042477159760291685} + - {fileID: 2042477159760292099} + - {fileID: 2042477159760325753} + - {fileID: 2042477159760384713} + - {fileID: 2042477159760378071} + - {fileID: 2042477159760336219} + m_Father: {fileID: 1764577096919658230} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3260295787887953759 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760062351} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e4806aced191314da8c00dae0231e5f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 10 + m_Nob: {fileID: 2042477159760013365} + m_Mesh: {fileID: 2042477159762211315} + m_Orientation: 0 + references: + version: 2 + RefIds: [] +--- !u!1 &2042477159760204025 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760378071} + - component: {fileID: 2042477159761069447} + - component: {fileID: 2042477159762223549} + - component: {fileID: 2042477159770282791} + m_Layer: 16 + m_Name: MinIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2042477159760378071 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760204025} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.2715, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2042477159761069447 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760204025} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &2042477159762223549 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760204025} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &2042477159770282791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760204025} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fda994627665a24b888af25f8c55ce4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Icon: {fileID: 2800000, guid: b474ed7ef5a1e1f44be200e24a9c3e39, type: 3} +--- !u!1 &2042477159760206529 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760325753} + - component: {fileID: 2042477159761136771} + - component: {fileID: 2042477159762547167} + m_Layer: 16 + m_Name: Cap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2042477159760325753 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760206529} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 1, w: 0} + m_LocalPosition: {x: 0.1683, y: 0, z: 0.00021062419} + m_LocalScale: {x: 0.0375, y: 0.0375, z: 0.0375} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2042477159761136771 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760206529} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2042477159762547167 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760206529} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ca448c25e886c544796b10b98d8aa9cc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &2042477159760228107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2042477159760291685} + - component: {fileID: 2042477159762211315} + - component: {fileID: 2042477159761121447} + m_Layer: 16 + m_Name: Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2042477159760291685 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760228107} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3, y: 0.0375, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2042477159760314479} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2042477159762211315 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760228107} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: db2d9e5107064e64ea8ce921e6f24458, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2042477159761121447 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2042477159760228107} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2423072313716971842 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9121402854645544662} + - component: {fileID: 3563621136810383813} + m_Layer: 16 + m_Name: Collider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9121402854645544662 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2423072313716971842} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.25, y: 0.09, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &3563621136810383813 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2423072313716971842} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &5181322565117940944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6826766934122703524} + m_Layer: 0 + m_Name: PlaybackButtons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6826766934122703524 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5181322565117940944} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.338, z: 0} + m_LocalScale: {x: 0.6, y: 0.6, z: 0.6} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1819353976050480489} + - {fileID: 2086891105765502287} + - {fileID: 8133214958621898451} + m_Father: {fileID: 1764577096919658230} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &5725626413214337075 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5486011782673994455} + - component: {fileID: 3398442449558121483} + - component: {fileID: 1289043672157857033} + - component: {fileID: 4567581341879741631} + m_Layer: 16 + m_Name: MinIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5486011782673994455 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5725626413214337075} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.215, y: 0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 0.8} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3398442449558121483 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5725626413214337075} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &1289043672157857033 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5725626413214337075} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &4567581341879741631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5725626413214337075} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fda994627665a24b888af25f8c55ce4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Icon: {fileID: 2800000, guid: 38f49c5949374144bb6047391c86a8b0, type: 3} +--- !u!1 &5838607888599009430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7488257428914698293} + m_Layer: 16 + m_Name: SoundClipControls Hinge + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7488257428914698293 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5838607888599009430} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.953, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1764577096919658230} + m_Father: {fileID: 3891058746504678318} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6015858894478443644 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4871108018091631855} + - component: {fileID: 4990517677825780571} + m_Layer: 16 + m_Name: VolumeSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4871108018091631855 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6015858894478443644} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.667, z: 0} + m_LocalScale: {x: 2.4, y: 2.4, z: 2.4999998} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 9121402854645544662} + - {fileID: 4808799142949319647} + - {fileID: 6737648776021719934} + - {fileID: 7456447107513267005} + - {fileID: 1035645040349747268} + - {fileID: 5486011782673994455} + - {fileID: 6234005124787899825} + m_Father: {fileID: 1764577096919658230} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4990517677825780571 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6015858894478443644} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86ca8257102cb704f8f79c04f55e1846, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_Nob: {fileID: 1135722248369929032} + m_Mesh: {fileID: 48407087727397758} + m_Orientation: 0 + m_Property: + m_Target: {fileID: 8553841389093772640} + m_PropertyName: SelectedSoundClipVolume + m_Range: {x: 0, y: 1} + m_PowerCurve: 0.5 + references: + version: 2 + RefIds: [] +--- !u!1 &6349348039775719049 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4847005250590706114} + - component: {fileID: 8832848337173024478} + - component: {fileID: 5157385735030997417} + m_Layer: 16 + m_Name: Loop Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4847005250590706114 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6349348039775719049} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.5} + m_LocalScale: {x: 10, y: 10, z: 10} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5075429281413830507} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 1.2999997, y: 2.68} + m_SizeDelta: {x: 0.87, y: 0.3} + m_Pivot: {x: 0, y: 1} +--- !u!23 &8832848337173024478 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6349348039775719049} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &5157385735030997417 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6349348039775719049} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Loop + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_sharedMaterial: {fileID: 2133298, guid: fce54057bad3d2d4cb3c36ee394be518, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0.18338251, z: 0.60269475, w: -0.05648184} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 8832848337173024478} + m_maskType: 0 +--- !u!1 &6848423948958616181 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 322677208594315543} + m_Layer: 0 + m_Name: Preview + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &322677208594315543 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6848423948958616181} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.577, z: 0} + m_LocalScale: {x: 0.70426255, y: 0.70426255, z: 0.70426255} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1975088546650945687} + m_Father: {fileID: 1764577096919658230} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &7075168047643485068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7456447107513267005} + - component: {fileID: 3752024823723313428} + - component: {fileID: 4180904833668120390} + m_Layer: 16 + m_Name: Cap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7456447107513267005 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7075168047643485068} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 1, w: 0} + m_LocalPosition: {x: 0.1373, y: 0, z: 0.00021062419} + m_LocalScale: {x: 0.025, y: 0.025, z: 0.0375} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3752024823723313428 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7075168047643485068} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4180904833668120390 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7075168047643485068} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ca448c25e886c544796b10b98d8aa9cc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &7601573036657319858 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4808799142949319647} + - component: {fileID: 48407087727397758} + - component: {fileID: 8863108255639263456} + m_Layer: 16 + m_Name: Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4808799142949319647 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7601573036657319858} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.25, y: 0.025, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &48407087727397758 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7601573036657319858} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: db2d9e5107064e64ea8ce921e6f24458, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &8863108255639263456 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7601573036657319858} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &8610974040346170107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6234005124787899825} + - component: {fileID: 8381663914405585404} + - component: {fileID: 6974821110014765406} + - component: {fileID: 3170694160889619932} + m_Layer: 16 + m_Name: MaxIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6234005124787899825 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8610974040346170107} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.215, y: -0, z: 0} + m_LocalScale: {x: 0.8, y: 0.8, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8381663914405585404 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8610974040346170107} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &6974821110014765406 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8610974040346170107} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &3170694160889619932 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8610974040346170107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fda994627665a24b888af25f8c55ce4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Icon: {fileID: 2800000, guid: a375998199982a14a9099edfa90202db, type: 3} +--- !u!1 &8695216695422032127 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3891058746504678318} + - component: {fileID: 8553841389093772640} + m_Layer: 16 + m_Name: ReferencePanelTabSoundClip + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3891058746504678318 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8695216695422032127} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8494528060082137562} + - {fileID: 8495732983929709308} + - {fileID: 4689841433404263126} + - {fileID: 305059557986449420} + - {fileID: 400532084346436074} + - {fileID: 4457426881587086695} + - {fileID: 1011828910837575333} + - {fileID: 3883704641979357644} + - {fileID: 5833970052723182508} + - {fileID: 7488257428914698293} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8553841389093772640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8695216695422032127} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dcee1b430b77a424cb40c11cdf48c840, type: 3} + m_Name: + m_EditorClassIdentifier: + m_PanelName: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 144204798700027904 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_SoundClipControls: {fileID: 5838607888599009430} + m_SoundClipControlsCollider: {fileID: 3285889161136258260} + m_Preview: {fileID: 896181631421354844} + m_Scrubber: {fileID: 3260295787887953759} + m_LoopToggle: {fileID: 4818067418775651639} + m_SpatialBlendToggle: {fileID: 4072556686229515449} + m_SoundClipSkipTime: 10 + m_ErrorTexture: {fileID: 2800000, guid: b68201fa2e266264089f97700761a547, type: 3} + m_LoadingTexture: {fileID: 2800000, guid: 120fb3201405dd846a9f9e807d24e1b6, type: 3} + references: + version: 2 + RefIds: [] +--- !u!1 &9192567423976779258 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1035645040349747268} + - component: {fileID: 233853202642518516} + - component: {fileID: 8805278338142912750} + m_Layer: 16 + m_Name: Cap + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1035645040349747268 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9192567423976779258} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.13738, y: -0, z: 0.0002105044} + m_LocalScale: {x: 0.025, y: 0.025, z: 0.0375} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4871108018091631855} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &233853202642518516 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9192567423976779258} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8805278338142912750 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9192567423976779258} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: ca448c25e886c544796b10b98d8aa9cc, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1001 &200287198775247115 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon3 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.4159999 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon4 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.216 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.001999855 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &4689841433404263126 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 200287198775247115} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &307829413729020618 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 6826766934122703524} + m_Modifications: + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1783251207675613781, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_Name + value: Play/Pause + objectReference: {fileID: 0} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: bebd9dc5824bcc6419ab95987680c688, type: 3} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_DescriptionText + value: PANEL_REFERENCE_BUTTON_VIDEO_PLAYPAUSE_DESCRIPTION + objectReference: {fileID: 0} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_DescriptionType + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_InverseHighlight + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_Property.m_Target + value: + objectReference: {fileID: 8553841389093772640} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_Property.m_PropertyName + value: SelectedSoundClipIsPlaying + objectReference: {fileID: 0} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalizedDescription.m_TableEntryReference.m_KeyId + value: 89074820936654848 + objectReference: {fileID: 0} + - target: {fileID: 7599348944369875173, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + propertyPath: m_LocalizedDescription.m_TableReference.m_TableCollectionName + value: GUID:c84355079ab3f3e4f8f3812258805f86 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c2a88d23f4dea5a4aae06f33862c9716, type: 3} +--- !u!4 &2086891105765502287 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1779908526734247813, guid: c2a88d23f4dea5a4aae06f33862c9716, + type: 3} + m_PrefabInstance: {fileID: 307829413729020618} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &680591652457797726 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1764577096919658230} + m_Modifications: + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_TextureOn + value: + objectReference: {fileID: 2800000, guid: 4ca620df5430af448aaf4f3ff20ad5c4, type: 3} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_TextureOff + value: + objectReference: {fileID: 2800000, guid: 957f69e59565cd1469fa095b415fa513, type: 3} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_AtlasTexture + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_ToggleButton + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_DescriptionText + value: Loop + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_InitialToggleState + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 8553841389093772640} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: HandleLoopToggle + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.ReferencePanelSoundClipTab, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgument + value: + objectReference: {fileID: 4818067418775651639} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: TiltBrush.ActionToggleButton, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 5697790560027007717, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Name + value: LoopToggleButton + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.392 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.123 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + insertIndex: -1 + addedObject: {fileID: 4847005250590706114} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 93b56759f69b2774b8e363dbed866a34, type: 3} +--- !u!114 &4818067418775651639 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + m_PrefabInstance: {fileID: 680591652457797726} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b5e5a42a2a249a38d266ceeed2bf3fa, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &5075429281413830507 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + m_PrefabInstance: {fileID: 680591652457797726} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1379320915575423089 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon9 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.4182 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon9 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.41820002 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &5833970052723182508 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 1379320915575423089} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &1816999435666485618 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 6826766934122703524} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: Forward + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: 051968bf1a5ba9f4296736db9e15f4cc, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: PANEL_REFERENCE_BUTTON_VIDEO_FORWARD_DESCRIPTION + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalizedDescription.m_TableEntryReference.m_KeyId + value: 89074884501331968 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 8553841389093772640} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: SkipForward + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalizedDescription.m_TableReference.m_TableCollectionName + value: GUID:c84355079ab3f3e4f8f3812258805f86 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &8133214958621898451 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 1816999435666485618} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &3904789691580178951 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.216 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.4159999 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon2 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.208 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.4159999 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &8494528060082137562 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 3904789691580178951} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &3905977571455920417 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon2 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.208 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.4159999 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon3 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.4159999 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &8495732983929709308 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 3905977571455920417} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &5070138412421050935 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon5 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.208 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon6 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.001999855 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &400532084346436074 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 5070138412421050935} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &5181940885644407761 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon4 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.216 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon5 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.208 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.001999855 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &305059557986449420 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 5181940885644407761} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &5609379306410567032 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon7 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.216 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.4182 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon7 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.216 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.41820002 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &1011828910837575333 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 5609379306410567032} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8130713083394896584 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 6826766934122703524} + m_Modifications: + - target: {fileID: 7630606763700834929, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Name + value: Rewind + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 2800000, guid: b5202bf37456a1d4787bd665393dd7b2, type: 3} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_DescriptionText + value: PANEL_REFERENCE_BUTTON_VIDEO_REWIND_DESCRIPTION + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalizedDescription.m_TableEntryReference.m_KeyId + value: 89074692188299264 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 8553841389093772640} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: SkipBack + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_LocalizedDescription.m_TableReference.m_TableCollectionName + value: GUID:c84355079ab3f3e4f8f3812258805f86 + objectReference: {fileID: 0} + - target: {fileID: 7879899076693153277, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0963942396a615f4fb1b390436e881b8, type: 3} +--- !u!4 &1819353976050480489 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7631838532712089505, guid: 0963942396a615f4fb1b390436e881b8, + type: 3} + m_PrefabInstance: {fileID: 8130713083394896584} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8297993296920998352 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1764577096919658230} + m_Modifications: + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_TextureOn + value: + objectReference: {fileID: 2800000, guid: 4ca620df5430af448aaf4f3ff20ad5c4, type: 3} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_TextureOff + value: + objectReference: {fileID: 2800000, guid: 957f69e59565cd1469fa095b415fa513, type: 3} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_AtlasTexture + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_ToggleButton + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_ButtonTexture + value: + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_DescriptionText + value: Spatial + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_InitialToggleState + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 8553841389093772640} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: HandleSpatialBlendToggle + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: TiltBrush.ReferencePanelSoundClipTab, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgument + value: + objectReference: {fileID: 4072556686229515449} + - target: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Action.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: TiltBrush.ActionToggleButton, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 5697790560027007717, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_Name + value: SpatialToggleButton + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.13900009 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.12299999 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + insertIndex: -1 + addedObject: {fileID: 5514102902807864122} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 93b56759f69b2774b8e363dbed866a34, type: 3} +--- !u!114 &4072556686229515449 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5452949074331721065, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + m_PrefabInstance: {fileID: 8297993296920998352} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b5e5a42a2a249a38d266ceeed2bf3fa, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &4338684405310701285 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5701133313370902325, guid: 93b56759f69b2774b8e363dbed866a34, + type: 3} + m_PrefabInstance: {fileID: 8297993296920998352} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &8518427859583357457 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon8 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.208 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.4182 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon8 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.208 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.41820002 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &3883704641979357644 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 8518427859583357457} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &9082018732258119354 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3891058746504678318} + m_Modifications: + - target: {fileID: 4887032089606793249, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon6 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.623 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089606793249, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_Name + value: ReferencePanelIcon1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.216 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.4159999 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.05 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4887032089607064541, guid: 61e80cd30bd5b334d846d9baaa0ef627, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: bf78ede73a1b5654cb9943c8944692b4, type: 3} +--- !u!4 &4457426881587086695 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4887032089607064541, guid: bf78ede73a1b5654cb9943c8944692b4, + type: 3} + m_PrefabInstance: {fileID: 9082018732258119354} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelTabSoundClip.prefab.meta b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelTabSoundClip.prefab.meta new file mode 100644 index 0000000000..d9339b6bc1 --- /dev/null +++ b/Assets/Prefabs/Panels/ReferencePanel/ReferencePanelTabSoundClip.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bc59f933f07268642a3319d424409949 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab b/Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab new file mode 100644 index 0000000000..423cb1bf99 --- /dev/null +++ b/Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab @@ -0,0 +1,577 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3215334574758134907 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3135616482654569395} + - component: {fileID: 2919485118436017699} + - component: {fileID: 7076524799754265290} + m_Layer: 16 + m_Name: Highlight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &3135616482654569395 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215334574758134907} + serializedVersion: 2 + m_LocalRotation: {x: -0.5, y: -0.5, z: 0.5, w: 0.5} + m_LocalPosition: {x: 0, y: 0.051, z: -0.001} + m_LocalScale: {x: 3.622484, y: 36.546047, z: 55.149162} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7658512940617658201} + m_LocalEulerAnglesHint: {x: 0, y: -90, z: 90} +--- !u!33 &2919485118436017699 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215334574758134907} + m_Mesh: {fileID: 4300002, guid: 494f6a456f266384a85d4868be7b55bf, type: 3} +--- !u!23 &7076524799754265290 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3215334574758134907} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8b96fd39ba2812846a306d90ef3422f0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &7657350995434470025 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7658512940617658201} + - component: {fileID: 7652262477819277877} + - component: {fileID: 7643930353656034333} + - component: {fileID: 7687439330557777141} + - component: {fileID: 7996768071626226949} + m_Layer: 16 + m_Name: QuillFileButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7658512940617658201 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7657350995434470025} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1952710519246884045} + - {fileID: 902279736871460144} + - {fileID: 3135616482654569395} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &7652262477819277877 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7657350995434470025} + m_Mesh: {fileID: 4300000, guid: 260cc07aabcea6d41a633a35c1103a6c, type: 3} +--- !u!23 &7643930353656034333 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7657350995434470025} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &7687439330557777141 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7657350995434470025} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.1725051, y: 0.11580247, z: 0.07} + m_Center: {x: 0.0019473135, y: -0.011016041, z: 0} +--- !u!114 &7996768071626226949 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7657350995434470025} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c43692ba6a8cc634eb531df62deeac69, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Open this folder + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 0} + m_AtlasTexture: 0 + m_ToggleButton: 0 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.01 + m_ZAdjustClick: 0.01 + m_HoverScale: 1.02 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_LabelText: {fileID: 8092729382110358993} + m_DetailText: {fileID: 0} + m_MergeMode: 0 + m_SelectionBorder: {fileID: 7759265159467355114} + m_BackgroundRenderer: {fileID: 4451097745489618796} + m_DefaultMaterial: {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_SelectedMaterial: {fileID: 2100000, guid: d153b453067a0724889fb677fef801a1, type: 2} + references: + version: 2 + RefIds: [] +--- !u!1 &8167424978835930155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 902279736871460144} + - component: {fileID: 7541238674848828381} + - component: {fileID: 8092729382110358993} + m_Layer: 16 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &902279736871460144 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8167424978835930155} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.004} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7658512940617658201} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0.3414, y: -0.017} + m_SizeDelta: {x: 18.8386, y: 1.66} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &7541238674848828381 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8167424978835930155} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &8092729382110358993 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8167424978835930155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Item + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_sharedMaterial: {fileID: 2122602, guid: ec48085d8b1ed18499cf1411d42005a0, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 1 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0.07729813, y: 0.13504475, z: 3.4388986, w: 0.16289777} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 7541238674848828381} + m_maskType: 0 +--- !u!1001 &7806316272476824846 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7658512940617658201} + m_Modifications: + - target: {fileID: 39057282034985054, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: 1.085 + objectReference: {fileID: 0} + - target: {fileID: 120092170274840608, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalScale.z + value: 72 + objectReference: {fileID: 0} + - target: {fileID: 120092170274840608, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3707727813358560176, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalScale.z + value: 94.53306 + objectReference: {fileID: 0} + - target: {fileID: 3707727813358560176, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.24775 + objectReference: {fileID: 0} + - target: {fileID: 3707727813358560176, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.02 + objectReference: {fileID: 0} + - target: {fileID: 3842738717155257372, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.589 + objectReference: {fileID: 0} + - target: {fileID: 8368913553107481572, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.58400005 + objectReference: {fileID: 0} + - target: {fileID: 8550303440375555915, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_Name + value: Sliced Button + objectReference: {fileID: 0} + - target: {fileID: 8550303440375555915, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalScale.x + value: 0.75 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalScale.y + value: 0.75 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalScale.z + value: 0.75 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9213809022599775818, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + propertyPath: m_LocalPosition.x + value: -0.584 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 274bb5f0c30dba14f8390b2848326116, type: 3} +--- !u!4 &1952710519246884045 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8596510312989206979, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + m_PrefabInstance: {fileID: 7806316272476824846} + m_PrefabAsset: {fileID: 0} +--- !u!23 &4451097745489618796 stripped +MeshRenderer: + m_CorrespondingSourceObject: {fileID: 5877446670226440802, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + m_PrefabInstance: {fileID: 7806316272476824846} + m_PrefabAsset: {fileID: 0} +--- !u!1 &7759265159467355114 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 575310418684735204, guid: 274bb5f0c30dba14f8390b2848326116, + type: 3} + m_PrefabInstance: {fileID: 7806316272476824846} + m_PrefabAsset: {fileID: 0} diff --git a/Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab.meta b/Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab.meta new file mode 100644 index 0000000000..93a78bfbb9 --- /dev/null +++ b/Assets/Prefabs/Panels/Widgets/QuillFileButton.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4c0106cf936933347a80b004158e794c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Pointer_Main.prefab b/Assets/Prefabs/Pointer_Main.prefab index 8fd6f54340..603fddb22a 100644 --- a/Assets/Prefabs/Pointer_Main.prefab +++ b/Assets/Prefabs/Pointer_Main.prefab @@ -25,13 +25,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 110414} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.094486505} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 487766} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &10891654 Light: @@ -168,6 +168,7 @@ MonoBehaviour: atime6: 0 atime7: 0 m_Mode: 0 + m_ColorSpace: -1 m_NumColorKeys: 2 m_NumAlphaKeys: 2 enableBeatAccumulatedColor: 0 @@ -197,13 +198,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 121030} + serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 487766} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!33 &3342976 MeshFilter: @@ -279,6 +280,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 133060} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -290,7 +292,6 @@ Transform: - {fileID: 454786} - {fileID: 4720948884069568} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &11413460 MonoBehaviour: @@ -348,13 +349,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 146746} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 487766} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &3370864 MeshFilter: @@ -431,13 +432,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1006578575455840} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4720948884069568} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &114453837716747884 MonoBehaviour: @@ -490,7 +491,7 @@ AudioSource: m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 0 @@ -595,13 +596,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1240372603388100} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4720948884069568} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &114160529511473284 MonoBehaviour: @@ -654,7 +655,7 @@ AudioSource: m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 0 @@ -757,6 +758,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1544320839044516} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -766,7 +768,6 @@ Transform: - {fileID: 4083097702606122} - {fileID: 4093886704260266} m_Father: {fileID: 487766} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1901529591950498 GameObject: @@ -793,13 +794,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1901529591950498} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4720948884069568} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &114054523002933400 MonoBehaviour: @@ -852,7 +853,7 @@ AudioSource: m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 0 @@ -957,13 +958,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2258206953472289196} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 487766} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &7728128274215375482 MeshFilter: diff --git a/Assets/Prefabs/PushPullTool.prefab b/Assets/Prefabs/PushPullTool.prefab new file mode 100644 index 0000000000..230328f179 --- /dev/null +++ b/Assets/Prefabs/PushPullTool.prefab @@ -0,0 +1,1052 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3491021129685588599 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021129685588584} + - component: {fileID: 3491021129685588585} + - component: {fileID: 7535520504170321093} + m_Layer: 14 + m_Name: SculptHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021129685588584 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021129685588599} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3491021130875935222} + - {fileID: 3491021130614667046} + - {fileID: 3491021130204876304} + - {fileID: 3491021130458884548} + m_Father: {fileID: 3491021130848758576} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3491021129685588585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021129685588599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6dbca64e524ea44f9b26142ec59aca8a, type: 3} + m_Name: + m_EditorClassIdentifier: + bypassRoomEffects: 0 + directivityAlpha: 0 + directivitySharpness: 1 + listenerDirectivityAlpha: 0 + listenerDirectivitySharpness: 1 + gainDb: 0 + occlusionEnabled: 0 + playOnAwake: 0 + disableOnStop: 0 + sourceClip: {fileID: 8300000, guid: 57c01e7292d1a9344b49c44422dc657c, type: 3} + sourceLoop: 1 + sourceMute: 0 + sourcePitch: 1 + sourcePriority: 128 + sourceSpatialBlend: 1 + sourceDopplerLevel: 1 + sourceSpread: 0 + sourceVolume: 1 + sourceRolloffMode: 0 + sourceMaxDistance: 500 + sourceMinDistance: 1 + hrtfEnabled: 1 + audioSource: {fileID: 0} +--- !u!82 &7535520504170321093 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021129685588599} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: 57c01e7292d1a9344b49c44422dc657c, type: 3} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 1 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &3491021130095632311 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130095632296} + - component: {fileID: 3491021130095632298} + - component: {fileID: 3491021130095632297} + - component: {fileID: 3491021130095632299} + - component: {fileID: 3491021130095632300} + m_Layer: 14 + m_Name: Crease + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &3491021130095632296 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130095632311} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021130458884548} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &3491021130095632298 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130095632311} + m_Mesh: {fileID: -6798857832251923318, guid: fdf3f3531d0a4599b7ee63af630f24dc, type: 3} +--- !u!23 &3491021130095632297 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130095632311} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 78b2ba5106bc41c28614887f70035dd4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &3491021130095632299 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130095632311} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 61a4f4b9669647408a76a8f36e499491, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SubToolIdentifier: 0 +--- !u!65 &3491021130095632300 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130095632311} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 0.5291864, y: 0.9999989, z: 2.0000005} + m_Center: {x: 0, y: 0.07351495, z: 0} +--- !u!1 &3491021130204876319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130204876304} + - component: {fileID: 3491021130204876307} + - component: {fileID: 3491021130204876306} + m_Layer: 14 + m_Name: Highlight Capsule + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130204876304 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130204876319} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3491021130204876307 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130204876319} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130204876306 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130204876319} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3491021130458884547 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130458884548} + - component: {fileID: 3491021130458884549} + m_Layer: 14 + m_Name: SubTools + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130458884548 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130458884547} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3491021130929141853} + - {fileID: 3491021130095632296} + - {fileID: 3491021131110089000} + - {fileID: 3491021130712597992} + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3491021130458884549 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130458884547} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8fcab0ed71e649cd95d1e668f220beda, type: 3} + m_Name: + m_EditorClassIdentifier: + m_PushPullTool: {fileID: 3491021130848758577} +--- !u!1 &3491021130614667045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130614667046} + - component: {fileID: 3491021130614667032} + - component: {fileID: 3491021130614667047} + m_Layer: 14 + m_Name: OffSphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130614667046 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130614667045} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3491021130614667032 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130614667045} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130614667047 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130614667045} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1f259984fed24d4fa141bf61d2abd10a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3491021130712598007 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130712597992} + - component: {fileID: 3491021130712597995} + - component: {fileID: 3491021130712597994} + - component: {fileID: 3491021130712597993} + - component: {fileID: 3491021130712597996} + m_Layer: 14 + m_Name: Rotate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &3491021130712597992 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130712598007} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.3, y: 1, z: 0.3} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021130458884548} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &3491021130712597995 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130712598007} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130712597994 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130712598007} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 78b2ba5106bc41c28614887f70035dd4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &3491021130712597993 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130712598007} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &3491021130712597996 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130712598007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a118a908fdd143518b0eae01ed9516d4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SubToolIdentifier: 0 +--- !u!1 &3491021130848758591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130848758576} + - component: {fileID: 3491021130848758577} + m_Layer: 14 + m_Name: PushPullTool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130848758576 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130848758591} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3491021131036094010} + - {fileID: 3491021129685588584} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3491021130848758577 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130848758591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b26b4ceb382647f39a512cffc4cad27e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Type: 5100 + m_ShowTransformGizmo: 0 + m_ExitOnAbortCommand: 1 + m_ScalingSupported: 1 + m_IntersectionResetBehavior: 2 + m_TimeSliceInMS: 1 + m_PointerForwardOffset: 0 + m_ToolTransform: {fileID: 3491021129685588584} + m_ToolDescriptionText: {fileID: 3491021131036094012} + m_SizeRange: {x: 0.1, y: 1.5} + m_ToolColdMaterial: {fileID: 2100000, guid: 1f259984fed24d4fa141bf61d2abd10a, type: 2} + m_ToolHotMaterial: {fileID: 2100000, guid: 8b5b6cbbc43748d69daec5cecb3a06f4, type: 2} + m_HapticInterval: 0.1 + m_HapticSizeUp: 0.01 + m_HapticSizeDown: 0.01 + m_AudioVolumeMax: 0.3 + m_AudioAttackSpeed: 0 + m_ModifyStrokeSounds: + - {fileID: 8300000, guid: f587ca1bdddc6014090c8a2169e5745e, type: 3} + m_ModifyStrokeMinTriggerTime: 0 + m_ToolHotOffMaterial: {fileID: 2100000, guid: 1f259984fed24d4fa141bf61d2abd10a, + type: 2} + m_OnMesh: {fileID: 3491021130875935208} + m_OffMesh: {fileID: 3491021130614667047} + m_HighlightMesh: {fileID: 3491021130204876306} + m_OnRotationMesh: {fileID: 3491021130875935208} + m_OffRotationMesh: {fileID: 3491021130614667047} + m_ToggleAnimationDuration: 0.2 + m_HapticsToggleOn: 0.08 + m_HapticsToggleOff: 0.06 + m_HapticsIntersection: 0.03 + m_AllowDoubleTap: 0 + m_DoubleTapDuration: 0.4 + m_MaxSpinSpeed: 700 + m_SpinSpeedAcceleration: 40000 + m_SpinSpeedDecay: 2500 + m_ActiveSubTool: {fileID: 3491021130929141854} +--- !u!1 &3491021130875935221 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130875935222} + - component: {fileID: 3491021130875935209} + - component: {fileID: 3491021130875935208} + m_Layer: 14 + m_Name: OnSphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130875935222 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130875935221} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3491021130875935209 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130875935221} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130875935208 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130875935221} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8b5b6cbbc43748d69daec5cecb3a06f4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3491021130929141852 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130929141853} + - component: {fileID: 3491021130929141854} + m_Layer: 14 + m_Name: Push + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &3491021130929141853 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130929141852} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021130458884548} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3491021130929141854 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130929141852} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 28362f04618f450192bbd51aa203f99e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SubToolIdentifier: 0 +--- !u!1 &3491021131036094009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021131036094010} + - component: {fileID: 3491021131036094012} + - component: {fileID: 3491021131036094011} + m_Layer: 14 + m_Name: MainText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021131036094010 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131036094009} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.25500253, y: 0.298213, z: -0.0025000572} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021130848758576} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &3491021131036094012 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131036094009} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: b4f85fa0fa941144d8e9a8285f3271da, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &3491021131036094011 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131036094009} + m_Text: Sculpting + m_OffsetZ: 0 + m_CharacterSize: 0.04 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!1 &3491021131110089015 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021131110089000} + - component: {fileID: 3491021131110089002} + - component: {fileID: 3491021131110089001} + - component: {fileID: 3491021131110089003} + - component: {fileID: 3491021131110089004} + m_Layer: 14 + m_Name: Flatten + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &3491021131110089000 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131110089015} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2, y: 0.05, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021130458884548} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &3491021131110089002 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131110089015} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021131110089001 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131110089015} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 78b2ba5106bc41c28614887f70035dd4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &3491021131110089003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131110089015} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 401478a7696a46a8b35fc186c6cf40c9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SubToolIdentifier: 0 +--- !u!65 &3491021131110089004 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131110089015} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.0000001, y: 2.0000005, z: 1.0000005} + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940699} diff --git a/Assets/Prefabs/PushPullTool.prefab.meta b/Assets/Prefabs/PushPullTool.prefab.meta new file mode 100644 index 0000000000..17cb1e84fb --- /dev/null +++ b/Assets/Prefabs/PushPullTool.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9515dfdefc9ac3045ab77450def48e00 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/SoundClipWidget.prefab b/Assets/Prefabs/SoundClipWidget.prefab new file mode 100644 index 0000000000..a458648046 --- /dev/null +++ b/Assets/Prefabs/SoundClipWidget.prefab @@ -0,0 +1,743 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &104792 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 413480} + - component: {fileID: 854942063617328480} + - component: {fileID: 6714732647065839654} + - component: {fileID: 795361251760961125} + m_Layer: 0 + m_Name: SoundClipWidget + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &413480 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104792} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2.146, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 453640} + - {fileID: 412772} + - {fileID: 435884} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &854942063617328480 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104792} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 83702bf1a42755143b9cd9cfe4e1c7c3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowDuration: 0.2 + m_GrabDistance: 1 + m_CollisionRadius: 1.2 + m_AllowTwoHandGrab: 1 + m_DestroyOnHide: 0 + m_AllowHideWithToss: 1 + m_DisableDrift: 0 + m_RecordMovements: 1 + m_AllowSnapping: 1 + m_SnapDisabledDelay: 0.2 + m_AllowPinning: 1 + m_AllowDormancy: 1 + m_TossDuration: 0.25 + m_TintableMeshes: [] + m_SpawnPlacementOffset: {x: 0, y: 0, z: 0} + m_IntroAnimSpinAmount: 360 + m_BoxCollider: {fileID: 8388007688737886911} + m_Mesh: {fileID: 453640} + m_HighlightMeshXfs: + - {fileID: 466610} + m_ValidSnapRotationStickyAngle: 65 + m_SnapGhostMaterial: {fileID: 2100000, guid: 43172d360a2f0f44798d94e9c440e24b, type: 2} + m_SelectionIndicatorRenderer: {fileID: 0} + m_ContainerBloat: {x: 0.1, y: 0.1, z: 0.4} + m_UngrabbableFromInside: 0 + m_MinSize_CS: 0.05 + m_MaxSize_CS: 2000 + m_NoImageTexture: {fileID: 2800000, guid: 57ec9586d21ff9142abf94cca6f69ef3, type: 3} + m_StartScale: 0.1 + m_ColliderBloat: 0 + m_MeshScalar: 1 + m_Background: {fileID: 466610} + m_Missing: {fileID: 435884} + m_MissingText: {fileID: 10267632} + m_MissingQuestionMark: {fileID: 149674} + m_QuestionMarkScalar: 1.5 + m_MinTextSize: 0.6 + m_TiltMeterCost: 1 + m_ImageQuad: {fileID: 2357204} + m_ConstantWorldSize: 0.5 + m_MinDistanceColor: {r: 0, g: 1, b: 0.8, a: 0.08} + m_MaxDistanceColor: {r: 1, g: 0.6, b: 0, a: 0.05} +--- !u!114 &6714732647065839654 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104792} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6dbca64e524ea44f9b26142ec59aca8a, type: 3} + m_Name: + m_EditorClassIdentifier: + bypassRoomEffects: 0 + directivityAlpha: 0 + directivitySharpness: 1 + listenerDirectivityAlpha: 0.125 + listenerDirectivitySharpness: 1 + gainDb: 3 + occlusionEnabled: 0 + playOnAwake: 1 + disableOnStop: 0 + sourceClip: {fileID: 0} + sourceLoop: 1 + sourceMute: 0 + sourcePitch: 1 + sourcePriority: 128 + sourceSpatialBlend: 1 + sourceDopplerLevel: 0 + sourceSpread: 0 + sourceVolume: 1 + sourceRolloffMode: 0 + sourceMaxDistance: 15 + sourceMinDistance: 0.75 + hrtfEnabled: 1 + audioSource: {fileID: 795361251760961125} +--- !u!82 &795361251760961125 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 104792} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 1 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 0 + MinDistance: 0.75 + MaxDistance: 15 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &105650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453640} + - component: {fileID: 3304526} + - component: {fileID: 2357204} + m_Layer: 0 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &453640 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105650} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 466610} + m_Father: {fileID: 413480} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3304526 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105650} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2357204 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105650} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d8b1abdfad766cd448e1ea238af5f38d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &108072 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 473572} + - component: {fileID: 3309956} + - component: {fileID: 2359870} + m_Layer: 0 + m_Name: SelectionIndicator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &473572 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108072} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 0.3} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 412772} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3309956 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108072} + m_Mesh: {fileID: 4300000, guid: 1fffb18ea3c95344a8ea624958a8319b, type: 3} +--- !u!23 &2359870 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108072} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 32562375f01c8c845a494d700c4ef48d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &108750 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 412772} + - component: {fileID: 8388007688737886911} + m_Layer: 0 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &412772 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108750} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 473572} + m_Father: {fileID: 413480} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &8388007688737886911 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108750} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &114356 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 435884} + m_Layer: 18 + m_Name: Missing + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &435884 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114356} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 433034} + - {fileID: 478790} + m_Father: {fileID: 413480} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &135062 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 466610} + - component: {fileID: 3313898} + - component: {fileID: 3517710860365856019} + m_Layer: 0 + m_Name: Sphere Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &466610 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 135062} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.005} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 453640} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &3313898 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 135062} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3517710860365856019 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 135062} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: cfec9a52c09c8764b8001091ee61042a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &149674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 478790} + - component: {fileID: 3322804} + - component: {fileID: 2375594} + m_Layer: 18 + m_Name: QuestionMark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &478790 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149674} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.011} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 435884} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3322804 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149674} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2375594 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149674} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: fcfcb94554ebd814aa6f067fe1cba536, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &173606 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 433034} + - component: {fileID: 2352122} + - component: {fileID: 10267632} + m_Layer: 18 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &433034 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173606} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.011} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 435884} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &2352122 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173606} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &10267632 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 173606} + m_Text: 'Missing Image: + + file.png' + m_OffsetZ: 0 + m_CharacterSize: 0.05 + m_LineSpacing: 1 + m_Anchor: 4 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 20 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 diff --git a/Assets/Prefabs/SoundClipWidget.prefab.meta b/Assets/Prefabs/SoundClipWidget.prefab.meta new file mode 100644 index 0000000000..317dbcd11e --- /dev/null +++ b/Assets/Prefabs/SoundClipWidget.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eb0cb4b31c139874e8f348d6682dec69 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/TintColorTool.prefab b/Assets/Prefabs/TintColorTool.prefab new file mode 100644 index 0000000000..0dddabf9ff --- /dev/null +++ b/Assets/Prefabs/TintColorTool.prefab @@ -0,0 +1,601 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3491021129685588599 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021129685588584} + - component: {fileID: 3491021129685588585} + - component: {fileID: 7535520504170321093} + m_Layer: 14 + m_Name: SculptHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021129685588584 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021129685588599} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3491021130875935222} + - {fileID: 3491021130614667046} + - {fileID: 3491021130204876304} + m_Father: {fileID: 3491021130848758576} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3491021129685588585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021129685588599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6dbca64e524ea44f9b26142ec59aca8a, type: 3} + m_Name: + m_EditorClassIdentifier: + bypassRoomEffects: 0 + directivityAlpha: 0 + directivitySharpness: 1 + listenerDirectivityAlpha: 0 + listenerDirectivitySharpness: 1 + gainDb: 0 + occlusionEnabled: 0 + playOnAwake: 0 + disableOnStop: 0 + sourceClip: {fileID: 8300000, guid: 57c01e7292d1a9344b49c44422dc657c, type: 3} + sourceLoop: 1 + sourceMute: 0 + sourcePitch: 1 + sourcePriority: 128 + sourceSpatialBlend: 1 + sourceDopplerLevel: 1 + sourceSpread: 0 + sourceVolume: 1 + sourceRolloffMode: 0 + sourceMaxDistance: 500 + sourceMinDistance: 1 + hrtfEnabled: 1 + audioSource: {fileID: 0} +--- !u!82 &7535520504170321093 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021129685588599} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: 57c01e7292d1a9344b49c44422dc657c, type: 3} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 1 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &3491021130204876319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130204876304} + - component: {fileID: 3491021130204876307} + - component: {fileID: 3491021130204876306} + m_Layer: 14 + m_Name: Highlight Capsule + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130204876304 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130204876319} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3491021130204876307 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130204876319} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130204876306 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130204876319} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3491021130614667045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130614667046} + - component: {fileID: 3491021130614667032} + - component: {fileID: 3491021130614667047} + m_Layer: 14 + m_Name: OffSphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130614667046 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130614667045} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3491021130614667032 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130614667045} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130614667047 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130614667045} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1f259984fed24d4fa141bf61d2abd10a, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3491021130848758591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130848758576} + - component: {fileID: 3491021130848758577} + m_Layer: 14 + m_Name: TintColorTool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130848758576 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130848758591} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3491021131036094010} + - {fileID: 3491021129685588584} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3491021130848758577 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130848758591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: afca3f873ff6046679a2d38d96801a0a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Type: 5101 + m_ShowTransformGizmo: 0 + m_ExitOnAbortCommand: 1 + m_ScalingSupported: 1 + m_IntersectionResetBehavior: 2 + m_TimeSliceInMS: 1 + m_PointerForwardOffset: 0 + m_ToolTransform: {fileID: 3491021129685588584} + m_ToolDescriptionText: {fileID: 3491021131036094012} + m_SizeRange: {x: 0.1, y: 1.5} + m_ToolColdMaterial: {fileID: 2100000, guid: 1f259984fed24d4fa141bf61d2abd10a, type: 2} + m_ToolHotMaterial: {fileID: 2100000, guid: 8b5b6cbbc43748d69daec5cecb3a06f4, type: 2} + m_HapticInterval: 0.1 + m_HapticSizeUp: 0.01 + m_HapticSizeDown: 0.01 + m_AudioVolumeMax: 0.3 + m_AudioAttackSpeed: 0 + m_ModifyStrokeSounds: + - {fileID: 8300000, guid: f587ca1bdddc6014090c8a2169e5745e, type: 3} + m_ModifyStrokeMinTriggerTime: 0 + m_ToolHotOffMaterial: {fileID: 2100000, guid: 1f259984fed24d4fa141bf61d2abd10a, + type: 2} + m_OnMesh: {fileID: 3491021130875935208} + m_OffMesh: {fileID: 3491021130614667047} + m_HighlightMesh: {fileID: 3491021130204876306} + m_OnRotationMesh: {fileID: 3491021130875935208} + m_OffRotationMesh: {fileID: 3491021130614667047} + m_ToggleAnimationDuration: 0.2 + m_HapticsToggleOn: 0.08 + m_HapticsToggleOff: 0.06 + m_HapticsIntersection: 0.03 + m_AllowDoubleTap: 0 + m_DoubleTapDuration: 0.4 + m_MaxSpinSpeed: 700 + m_SpinSpeedAcceleration: 40000 + m_SpinSpeedDecay: 2500 + m_IconReplace: {fileID: 2800000, guid: 6a0f5802d408e984bbd72168015e36cd, type: 3} + m_IconMultiply: {fileID: 2800000, guid: a89618c20322f9a4ea2d3bd94af1b43a, type: 3} + m_IconAdd: {fileID: 2800000, guid: 4ca620df5430af448aaf4f3ff20ad5c4, type: 3} + m_IconClear: {fileID: 2800000, guid: 5d6f688a24e3dec4cb816f3722c9556e, type: 3} +--- !u!1 &3491021130875935221 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021130875935222} + - component: {fileID: 3491021130875935209} + - component: {fileID: 3491021130875935208} + m_Layer: 14 + m_Name: OnSphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021130875935222 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130875935221} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 3491021129685588584} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3491021130875935209 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130875935221} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &3491021130875935208 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021130875935221} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 8b5b6cbbc43748d69daec5cecb3a06f4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3491021131036094009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3491021131036094010} + - component: {fileID: 3491021131036094012} + - component: {fileID: 3491021131036094011} + m_Layer: 14 + m_Name: MainText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3491021131036094010 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131036094009} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.25500253, y: 0.298213, z: -0.0025000572} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3491021130848758576} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &3491021131036094012 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131036094009} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: b4f85fa0fa941144d8e9a8285f3271da, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!102 &3491021131036094011 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3491021131036094009} + m_Text: Tint Color + m_OffsetZ: 0 + m_CharacterSize: 0.04 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 64 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: aa94fec06c672f74d86409a6979db921, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 diff --git a/Assets/Prefabs/TintColorTool.prefab.meta b/Assets/Prefabs/TintColorTool.prefab.meta new file mode 100644 index 0000000000..156672e6a6 --- /dev/null +++ b/Assets/Prefabs/TintColorTool.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 83973cf2914084bd3838780fa88138dc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/UIComponents/PushPullToolMenu.prefab b/Assets/Prefabs/UIComponents/PushPullToolMenu.prefab new file mode 100644 index 0000000000..6ac184b0e0 --- /dev/null +++ b/Assets/Prefabs/UIComponents/PushPullToolMenu.prefab @@ -0,0 +1,1004 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1503094713155990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4073457010706892} + - component: {fileID: 114279940278832510} + - component: {fileID: 6109331198620410867} + m_Layer: 16 + m_Name: PushPullToolMenu + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4073457010706892 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1503094713155990} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.75, y: -0.518, z: 0.1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4144920620344815534} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114279940278832510 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1503094713155990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 739d5b1996234d64992a2ae60c3723e9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &6109331198620410867 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1503094713155990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6c931003f8e94de1bc6d07a5face43d0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: -1 + m_DescriptionYOffset: 0 + m_DescriptionText: + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_Mesh: {fileID: 1596481825594902} + m_Border: {fileID: 505703257451421084} + m_AnimateSpeed: 8 + m_AnimateRange: {x: 0, y: 1} + references: + version: 2 + RefIds: [] +--- !u!1 &1596481825594902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4418329079800618} + m_Layer: 16 + m_Name: Mesh + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4418329079800618 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1596481825594902} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 529174815131490180} + - {fileID: 529637542510126424} + - {fileID: 3096519506628065163} + - {fileID: 2199208805347137833} + - {fileID: 5798431474404876367} + - {fileID: 7019274415188019740} + m_Father: {fileID: 4144920620344815534} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1895032314352020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4291139537264568} + - component: {fileID: 65343707767525102} + m_Layer: 16 + m_Name: Collider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4291139537264568 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895032314352020} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.4, y: 1.4, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4144920620344815534} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &65343707767525102 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895032314352020} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.2} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &527762663584930946 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 529174815131490180} + - component: {fileID: 514358804627021014} + - component: {fileID: 505945780469162462} + m_Layer: 16 + m_Name: PopupBg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &529174815131490180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 527762663584930946} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4418329079800618} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!33 &514358804627021014 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 527762663584930946} + m_Mesh: {fileID: 4300002, guid: 99db149dea29eaa41875fed62366c37e, type: 3} +--- !u!23 &505945780469162462 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 527762663584930946} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: db0305ff9081c3b448ac79e85d26e5d4, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &527906196806127360 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 529637542510126424} + - component: {fileID: 513783929244077404} + - component: {fileID: 505703257451421084} + m_Layer: 16 + m_Name: PopupBorder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &529637542510126424 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 527906196806127360} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4418329079800618} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!33 &513783929244077404 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 527906196806127360} + m_Mesh: {fileID: 4300000, guid: 99db149dea29eaa41875fed62366c37e, type: 3} +--- !u!23 &505703257451421084 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 527906196806127360} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 77dd4ff8b1158a84397aba783cd0af05, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &920674998816972288 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2199208805347137833} + - component: {fileID: 1618418652372707936} + - component: {fileID: 4575191647335151495} + - component: {fileID: 3371786718587815988} + - component: {fileID: 5278661225779610634} + m_Layer: 16 + m_Name: Crease + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2199208805347137833 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920674998816972288} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.21000001, z: -0.020000003} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4418329079800618} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1618418652372707936 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920674998816972288} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &4575191647335151495 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920674998816972288} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &3371786718587815988 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920674998816972288} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.01} +--- !u!114 &5278661225779610634 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920674998816972288} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca17e77a3344482a680548a69297103, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Crease + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 9fc22eeaa38b9dd42b4ffa44cac359a5, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SubTool: 1 + references: + version: 2 + RefIds: [] +--- !u!1 &1175773417315306131 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3096519506628065163} + - component: {fileID: 5266861399439377578} + - component: {fileID: 5203395081618932896} + - component: {fileID: 9024801311678540707} + - component: {fileID: 5058405093779083082} + m_Layer: 16 + m_Name: Push + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3096519506628065163 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1175773417315306131} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.63, z: -0.020000003} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4418329079800618} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &5266861399439377578 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1175773417315306131} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &5203395081618932896 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1175773417315306131} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &9024801311678540707 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1175773417315306131} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.01} +--- !u!114 &5058405093779083082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1175773417315306131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca17e77a3344482a680548a69297103, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Push + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 842678e3e8f0299499a9366773e7e9b6, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SubTool: 0 + references: + version: 2 + RefIds: [] +--- !u!1 &2781210885598772063 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5798431474404876367} + - component: {fileID: 4532010237364547916} + - component: {fileID: 986435528741312130} + - component: {fileID: 969476577040466812} + - component: {fileID: 743217307267657451} + m_Layer: 16 + m_Name: Flatten + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5798431474404876367 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2781210885598772063} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.21000004, z: -0.020000003} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4418329079800618} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4532010237364547916 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2781210885598772063} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &986435528741312130 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2781210885598772063} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &969476577040466812 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2781210885598772063} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.01} +--- !u!114 &743217307267657451 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2781210885598772063} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca17e77a3344482a680548a69297103, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Flatten + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 1368da58c0ba54a1da8cdf7d009f6007, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SubTool: 2 + references: + version: 2 + RefIds: [] +--- !u!1 &4746940080256643886 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4144920620344815534} + m_Layer: 16 + m_Name: PivotOffset + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4144920620344815534 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4746940080256643886} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.2, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4291139537264568} + - {fileID: 4418329079800618} + m_Father: {fileID: 4073457010706892} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &6351756545473746039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7019274415188019740} + - component: {fileID: 7300460481915279569} + - component: {fileID: 6040084972683744459} + - component: {fileID: 1106472252641225548} + - component: {fileID: 4831094183584463471} + m_Layer: 16 + m_Name: Rotate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7019274415188019740 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6351756545473746039} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.63, z: -0.020000003} + m_LocalScale: {x: 0.35, y: 0.35, z: 0.35} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4418329079800618} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &7300460481915279569 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6351756545473746039} + m_Mesh: {fileID: 4300000, guid: 5501f437160666942ae970f3648fbeb8, type: 3} +--- !u!23 &6040084972683744459 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6351756545473746039} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 40d29de2bdc11f04dbfa25059165916e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &1106472252641225548 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6351756545473746039} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 0.01} + m_Center: {x: 0, y: 0, z: -0.01} +--- !u!114 &4831094183584463471 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6351756545473746039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca17e77a3344482a680548a69297103, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DescriptionType: 0 + m_DescriptionYOffset: 0 + m_DescriptionText: Rotate + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionTextExtra: + m_LocalizedDescriptionExtra: + m_TableReference: + m_TableCollectionName: + m_TableEntryReference: + m_KeyId: 0 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionActivateSpeed: 12 + m_DescriptionZScale: 1 + m_ButtonTexture: {fileID: 2800000, guid: 08eb6ec4e0dd15d4e96281aba0e32f1b, type: 3} + m_AtlasTexture: 1 + m_ToggleButton: 1 + m_LongPressReleaseButton: 0 + m_ButtonHasPressedAudio: 1 + m_ZAdjustHover: -0.02 + m_ZAdjustClick: 0.05 + m_HoverScale: 1.1 + m_HoverBoxColliderGrow: 0.2 + m_AddOverlay: 0 + m_SubTool: 3 + references: + version: 2 + RefIds: [] diff --git a/Assets/Prefabs/UIComponents/PushPullToolMenu.prefab.meta b/Assets/Prefabs/UIComponents/PushPullToolMenu.prefab.meta new file mode 100644 index 0000000000..1895fb0294 --- /dev/null +++ b/Assets/Prefabs/UIComponents/PushPullToolMenu.prefab.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dda4e1331f7240fb94037b9b86b406e5 +timeCreated: 1669378094 \ No newline at end of file diff --git a/Assets/Resources/Brushes/New BrushDescriptor.asset b/Assets/Resources/Brushes/New BrushDescriptor.asset deleted file mode 100644 index 911d531a68..0000000000 --- a/Assets/Resources/Brushes/New BrushDescriptor.asset +++ /dev/null @@ -1,73 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c71b2ac88638c5c41a0a0681f70d2512, type: 3} - m_Name: New BrushDescriptor - m_EditorClassIdentifier: - m_Guid: - m_storage: - m_DurableName: - m_CreationVersion: - m_ShaderVersion: 10.0 - m_BrushPrefab: {fileID: 0} - m_Tags: [] - m_Nondeterministic: 0 - m_Supersedes: {fileID: 0} - m_LooksIdentical: 0 - m_ButtonTexture: {fileID: 0} - m_Description: - m_DescriptionExtra: - m_BrushAudioLayers: [] - m_BrushAudioBasePitch: 0 - m_BrushAudioMaxPitchShift: 0.05 - m_BrushAudioMaxVolume: 0 - m_BrushVolumeUpSpeed: 4 - m_BrushVolumeDownSpeed: 4 - m_VolumeVelocityRangeMultiplier: 1 - m_AudioReactive: 0 - m_ButtonAudio: {fileID: 0} - m_Material: {fileID: 0} - m_TextureAtlasV: 0 - m_TileRate: 0 - m_UseBloomSwatchOnColorPicker: 0 - m_BrushSizeRange: {x: 0, y: 0} - m_PressureSizeRange: {x: 0.1, y: 1} - m_SizeVariance: 0 - m_PreviewPressureSizeMin: 0.001 - m_Opacity: 0 - m_PressureOpacityRange: {x: 0, y: 0} - m_ColorLuminanceMin: 0 - m_ColorSaturationMax: 0 - m_ParticleSpeed: 0 - m_ParticleRate: 0 - m_ParticleInitialRotationRange: 0 - m_RandomizeAlpha: 0 - m_SprayRateMultiplier: 0 - m_RotationVariance: 0 - m_PositionVariance: 0 - m_SizeRatio: {x: 0, y: 0} - m_M11Compatibility: 0 - m_SolidMinLengthMeters_PS: 0.002 - m_TubeStoreRadiusInTexcoord0Z: 0 - m_RenderBackfaces: 0 - m_BackIsInvisible: 0 - m_BackfaceHueShift: 0 - m_BoundsPadding: 0 - m_PlayBackAtStrokeGranularity: 0 - m_BlendMode: 0 - m_EmissiveFactor: 0 - m_AllowExport: 1 - m_SupportsSimplification: 1 - m_HeadMinPoints: 1 - m_HeadPointStep: 1 - m_TailMinPoints: 1 - m_TailPointStep: 1 - m_MiddlePointStep: 0 diff --git a/Assets/Resources/Brushes/Shared/Materials/Quill.mat b/Assets/Resources/Brushes/Shared/Materials/Quill.mat new file mode 100644 index 0000000000..3a25bdd350 --- /dev/null +++ b/Assets/Resources/Brushes/Shared/Materials/Quill.mat @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Quill + m_Shader: {fileID: 4800000, guid: a6fbef908c924991bcf4423679ded6b0, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - EDGING_ON + - SELECTION_EDGING + - _EMISSION + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: a5e21dec06724194490cbe6156ac19d2, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaBias: 0 + - _AlphaPower: 1 + - _BumpScale: 1 + - _ClipEnd: -1 + - _ClipStart: 0 + - _Cutoff: 0.067 + - _DetailNormalMapScale: 1 + - _Dissolve: 1 + - _DitherStrength: 0.5 + - _DstBlend: 0 + - _Edging: 1 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _OrderedDither: 0 + - _Parallax: 0.02 + - _Seed: 0 + - _SelectionEdging: 1 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Resources/Brushes/Shared/Materials/Quill.mat.meta b/Assets/Resources/Brushes/Shared/Materials/Quill.mat.meta new file mode 100644 index 0000000000..312429dc50 --- /dev/null +++ b/Assets/Resources/Brushes/Shared/Materials/Quill.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 632c30292a1e6c7469362c8f225a9020 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Brushes/Shared/Shaders/LitA2CVertexColor.shader b/Assets/Resources/Brushes/Shared/Shaders/LitA2CVertexColor.shader new file mode 100644 index 0000000000..fa131d3b84 --- /dev/null +++ b/Assets/Resources/Brushes/Shared/Shaders/LitA2CVertexColor.shader @@ -0,0 +1,97 @@ +Shader "Brush/LitA2CVertexColor" +{ + Properties + { + _Color ("Main Color", Color) = (1,1,1,1) + _DitherStrength ("Dither Strength", Range(0,0.5)) = 0.125 + _OrderedDither ("Ordered Dither (0/1)", Float) = 0 + _Metallic ("Metallic", Range(0,1)) = 0 + _Smoothness ("Smoothness", Range(0,1)) = 0.5 + } + SubShader + { + Tags { "RenderType"="TransparentCutout" "Queue"="AlphaTest" } + LOD 200 + + AlphaToMask On + Cull Off + ZWrite On + + CGPROGRAM + #pragma surface surf Standard fullforwardshadows alpha:coverage + #pragma target 3.0 + #include "UnityCG.cginc" + + fixed4 _Color; + float _DitherStrength; + float _OrderedDither; + half _Metallic; + half _Smoothness; + + struct Input + { + fixed4 color : COLOR; + float4 screenPos; + }; + + float OrderedDither4x4(float2 pixelPos) + { + int2 p = int2(pixelPos) & 3; + int index = p.x + p.y * 4; + int d = (index == 0) ? 0 : + (index == 1) ? 8 : + (index == 2) ? 2 : + (index == 3) ? 10 : + (index == 4) ? 12 : + (index == 5) ? 4 : + (index == 6) ? 14 : + (index == 7) ? 6 : + (index == 8) ? 3 : + (index == 9) ? 11 : + (index == 10) ? 1 : + (index == 11) ? 9 : + (index == 12) ? 15 : + (index == 13) ? 7 : + (index == 14) ? 13 : + 5; + return (d + 0.5) / 16.0; + } + + float InterleavedGradientNoise(float2 pixelPos) + { + float2 p = floor(pixelPos); + float f = dot(p, float2(0.06711056, 0.00583715)); + return frac(52.9829189 * frac(f)); + } + + float ObjectSeed() + { + float3 t = float3(unity_ObjectToWorld._m03, unity_ObjectToWorld._m13, unity_ObjectToWorld._m23); + float h = dot(t, float3(0.1031, 0.11369, 0.13787)); + return frac(sin(h) * 43758.5453); + } + + void surf (Input IN, inout SurfaceOutputStandard o) + { + fixed4 c = IN.color * _Color; + float alpha = c.a; + + float2 pixelPos = (IN.screenPos.xy / IN.screenPos.w) * _ScreenParams.xy; + float seed = ObjectSeed(); + pixelPos += seed * 4096.0; + + float ditherOrdered = OrderedDither4x4(pixelPos); + float ditherNoise = InterleavedGradientNoise(pixelPos); + float dither = lerp(ditherNoise, ditherOrdered, step(0.5, _OrderedDither)); + + alpha = saturate(alpha + (dither - 0.5) * _DitherStrength); + + o.Albedo = c.rgb; + o.Metallic = _Metallic; + o.Smoothness = _Smoothness; + o.Alpha = alpha; + } + ENDCG + } + FallBack "Diffuse" +} diff --git a/Assets/Resources/Brushes/Shared/Shaders/LitA2CVertexColor.shader.meta b/Assets/Resources/Brushes/Shared/Shaders/LitA2CVertexColor.shader.meta new file mode 100644 index 0000000000..26920e55bf --- /dev/null +++ b/Assets/Resources/Brushes/Shared/Shaders/LitA2CVertexColor.shader.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 420158f17b52441985f01e9b56a78c39 +timeCreated: 1768390690 \ No newline at end of file diff --git a/Assets/Resources/Brushes/Shared/Shaders/UnlitA2CVertexColor.shader b/Assets/Resources/Brushes/Shared/Shaders/UnlitA2CVertexColor.shader new file mode 100644 index 0000000000..9d243415ff --- /dev/null +++ b/Assets/Resources/Brushes/Shared/Shaders/UnlitA2CVertexColor.shader @@ -0,0 +1,114 @@ +Shader "Brush/UnlitA2CVertexColor" +{ + Properties + { + _Color ("Main Color", Color) = (1,1,1,1) + _DitherStrength ("Dither Strength", Range(0,0.5)) = 0.125 + _OrderedDither ("Ordered Dither (0/1)", Float) = 0 + _AlphaBias ("Alpha Bias", Range(-1,1)) = 0 + _AlphaPower ("Alpha Power", Range(0.1,4)) = 1 + } + SubShader + { + Tags { "RenderType"="TransparentCutout" "Queue"="AlphaTest" } + LOD 100 + + Pass + { + AlphaToMask On + Blend Off + ZWrite On + Cull Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + fixed4 _Color; + float _DitherStrength; + float _OrderedDither; + float _AlphaBias; + float _AlphaPower; + + struct appdata + { + float4 vertex : POSITION; + fixed4 color : COLOR; + }; + + struct v2f + { + float4 pos : SV_POSITION; + fixed4 color : COLOR; + float4 screenPos : TEXCOORD0; + }; + + v2f vert (appdata v) + { + v2f o; + o.pos = UnityObjectToClipPos(v.vertex); + o.color = v.color * _Color; + o.screenPos = ComputeScreenPos(o.pos); + return o; + } + + float OrderedDither4x4(float2 pixelPos) + { + // 4x4 Bayer matrix scaled to 0..1 + int2 p = int2(pixelPos) & 3; + int index = p.x + p.y * 4; + // Values: 0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5 + int d = (index == 0) ? 0 : + (index == 1) ? 8 : + (index == 2) ? 2 : + (index == 3) ? 10 : + (index == 4) ? 12 : + (index == 5) ? 4 : + (index == 6) ? 14 : + (index == 7) ? 6 : + (index == 8) ? 3 : + (index == 9) ? 11 : + (index == 10) ? 1 : + (index == 11) ? 9 : + (index == 12) ? 15 : + (index == 13) ? 7 : + (index == 14) ? 13 : + 5; + return (d + 0.5) / 16.0; + } + + float InterleavedGradientNoise(float2 pixelPos) + { + // Simple hash-based noise in 0..1 + float2 p = floor(pixelPos); + float f = dot(p, float2(0.06711056, 0.00583715)); + return frac(52.9829189 * frac(f)); + } + + float ObjectSeed() + { + float3 t = float3(unity_ObjectToWorld._m03, unity_ObjectToWorld._m13, unity_ObjectToWorld._m23); + float h = dot(t, float3(0.1031, 0.11369, 0.13787)); + return frac(sin(h) * 43758.5453); + } + + fixed4 frag (v2f i) : SV_Target + { + fixed4 c = i.color; + float alpha = saturate(pow(saturate(c.a + _AlphaBias), _AlphaPower)); + + float2 pixelPos = (i.screenPos.xy / i.screenPos.w) * _ScreenParams.xy; + float seed = ObjectSeed(); + pixelPos += seed * 4096.0; + float ditherOrdered = OrderedDither4x4(pixelPos); + float ditherNoise = InterleavedGradientNoise(pixelPos); + float dither = lerp(ditherNoise, ditherOrdered, step(0.5, _OrderedDither)); + + alpha = saturate(alpha + (dither - 0.5) * _DitherStrength); + return fixed4(c.rgb, alpha); + } + ENDCG + } + } +} diff --git a/Assets/Resources/Brushes/Shared/Shaders/UnlitA2CVertexColor.shader.meta b/Assets/Resources/Brushes/Shared/Shaders/UnlitA2CVertexColor.shader.meta new file mode 100644 index 0000000000..77f079995d --- /dev/null +++ b/Assets/Resources/Brushes/Shared/Shaders/UnlitA2CVertexColor.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a6fbef908c924991bcf4423679ded6b0 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/DefaultSoundClips.meta b/Assets/Resources/DefaultSoundClips.meta new file mode 100644 index 0000000000..6d357e4bd9 --- /dev/null +++ b/Assets/Resources/DefaultSoundClips.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d636017cb5b7d174395a4cdd952d07fa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/DefaultSoundClips/underwater.wav.bytes b/Assets/Resources/DefaultSoundClips/underwater.wav.bytes new file mode 100644 index 0000000000..a1b39831ea Binary files /dev/null and b/Assets/Resources/DefaultSoundClips/underwater.wav.bytes differ diff --git a/Assets/Resources/DefaultSoundClips/underwater.wav.bytes.meta b/Assets/Resources/DefaultSoundClips/underwater.wav.bytes.meta new file mode 100644 index 0000000000..5992a71f31 --- /dev/null +++ b/Assets/Resources/DefaultSoundClips/underwater.wav.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 643f219214e12f349bd31c84562978bf +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Icons/brushaudio.png.meta b/Assets/Resources/Icons/brushaudio.png.meta index b59bf649a0..6ece0ab680 100644 --- a/Assets/Resources/Icons/brushaudio.png.meta +++ b/Assets/Resources/Icons/brushaudio.png.meta @@ -1,9 +1,9 @@ fileFormatVersion: 2 guid: be5ae98f7ff9b5c48aab7018e4c1084c TextureImporter: - fileIDToRecycleName: {} + internalIDToNameTable: [] externalObjects: {} - serializedVersion: 9 + serializedVersion: 12 mipmaps: mipMapMode: 0 enableMipMap: 1 @@ -23,6 +23,8 @@ TextureImporter: isReadable: 1 streamingMipmaps: 0 streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 grayScaleToAlpha: 0 generateCubemap: 6 cubemapConvolution: 0 @@ -31,12 +33,12 @@ TextureImporter: maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: -1 - aniso: -1 - mipBias: -100 - wrapU: -1 - wrapV: -1 - wrapW: -1 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 nPOTScale: 1 lightmap: 0 compressionQuality: 50 @@ -54,11 +56,16 @@ TextureImporter: textureType: 0 textureShape: 1 singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 maxTextureSizeSet: 0 compressionQualitySet: 0 textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + cookieLightType: 1 platformSettings: - - serializedVersion: 2 + - serializedVersion: 3 buildTarget: DefaultTexturePlatform maxTextureSize: 128 resizeAlgorithm: 0 @@ -69,7 +76,8 @@ TextureImporter: allowsAlphaSplitting: 0 overridden: 0 androidETC2FallbackOverride: 0 - - serializedVersion: 2 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 buildTarget: Standalone maxTextureSize: 128 resizeAlgorithm: 0 @@ -80,7 +88,8 @@ TextureImporter: allowsAlphaSplitting: 0 overridden: 0 androidETC2FallbackOverride: 0 - - serializedVersion: 2 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 buildTarget: Android maxTextureSize: 128 resizeAlgorithm: 0 @@ -91,6 +100,31 @@ TextureImporter: allowsAlphaSplitting: 0 overridden: 0 androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 spriteSheet: serializedVersion: 2 sprites: [] @@ -98,10 +132,13 @@ TextureImporter: physicsShape: [] bones: [] spriteID: + internalID: 0 vertices: [] indices: edges: [] weights: [] + secondaryTextures: [] + nameFileIdTable: {} spritePackingTag: pSDRemoveMatte: 0 pSDShowRemoveMatteOption: 0 diff --git a/Assets/Resources/Icons/soundclip.png b/Assets/Resources/Icons/soundclip.png new file mode 100644 index 0000000000..95d3fb19a9 Binary files /dev/null and b/Assets/Resources/Icons/soundclip.png differ diff --git a/Assets/Resources/Icons/soundclip.png.meta b/Assets/Resources/Icons/soundclip.png.meta new file mode 100644 index 0000000000..7b87551d63 --- /dev/null +++ b/Assets/Resources/Icons/soundclip.png.meta @@ -0,0 +1,147 @@ +fileFormatVersion: 2 +guid: 32c1b6205fdb5af4996e2a51c4df9eb7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/LuaModules/__autocomplete.lua b/Assets/Resources/LuaModules/__autocomplete.lua index 9a2c2e5159..83bfd6c21b 100644 --- a/Assets/Resources/LuaModules/__autocomplete.lua +++ b/Assets/Resources/LuaModules/__autocomplete.lua @@ -125,6 +125,12 @@ function Brush:GetTypes(includeTags, excludeTags) end function Brush:JitterColor() end +---@param color Color The color to set +function Brush:SetColorOverride(color) end + +---@param mode ColorOverrideMode The mode to set +function Brush:SetColorOverrideMode(mode) end + ---@param size number How many frames of position/rotation to remember function Brush:ResizeHistory(size) end @@ -1843,6 +1849,9 @@ function Symmetry:ClearColors() end ---@param color Color The color to add function Symmetry:AddColor(color) end +---@param color Color The color to set +function Symmetry:SetColors(color) end + ---@param colors Color[] The list of colors to set function Symmetry:SetColors(colors) end @@ -1859,6 +1868,15 @@ function Symmetry:ClearBrushes() end ---@param brushes string[] The list of brushes to set. Either the names or the GUIDs of the brushes function Symmetry:SetBrushes(brushes) end +---@param color Color The color to set +function Symmetry:SetColorOverrides(color) end + +---@param mode ColorOverrideMode The mode to set +function Symmetry:SetColorOverrideModes(mode) end + + +function Symmetry:ClearColorOverrides() end + ---@return string[] # function Symmetry:GetBrushNames() end @@ -2825,6 +2843,15 @@ SymmetryWallpaperType.cmm = nil +---@class ColorOverrideMode +ColorOverrideMode = {} +ColorOverrideMode.None = nil +ColorOverrideMode.Replace = nil +ColorOverrideMode.Multiply = nil +ColorOverrideMode.Add = nil + + + ---@class Tool ---@field startPoint Transform The position and orientation of the point where the trigger was pressed ---@field endPoint Transform The position and orientation of the point where the trigger was released diff --git a/Assets/Resources/LuaScriptExamples/PointerScript.CurvatureColor.lua b/Assets/Resources/LuaScriptExamples/PointerScript.CurvatureColor.lua new file mode 100644 index 0000000000..c1bac3f83d --- /dev/null +++ b/Assets/Resources/LuaScriptExamples/PointerScript.CurvatureColor.lua @@ -0,0 +1,62 @@ +Settings = { + description = "Curvature affects stroke color - more curved strokes get color override applied", + space = "pointer" +} + +Parameters = { + mode={label="Override Mode", type="list", items={"Add", "Multiply", "Replace"}, default="Replace"}, + color={label="Override Color", type="color", default=Color:New(1, 0, 1)}, + amount={label="Override Amount", type="float", min=0.0, max=5.0, default=2.0}, + smooth={label="Curvature Smoothing", type="float", min=0.0, max=1.0, default=0.3} +} + +-- Map mode string to Colormode +local modeMapping = { + ["Add"] = ColorOverrideMode.Add, + ["Multiply"] = ColorOverrideMode.Multiply, + ["Replace"] = ColorOverrideMode.Replace +} + +local smoothedCurvature = 0.0 + +function Start() + local selectedMode = modeMapping[Parameters.mode] + Symmetry:SetColorOverrideModes(selectedMode) + Brush:SetHistorySize(7) +end + +function Main() + -- Get positions from built-in brush history + local p1 = Brush:GetPastPosition(6) + local p2 = Brush:GetPastPosition(3) + local p3 = Brush:GetPastPosition(0) + + if p1 and p2 and p3 then + -- Calculate vectors between consecutive points + local v1x = p2.x - p1.x + local v1y = p2.y - p1.y + local v1z = p2.z - p1.z + + local v2x = p3.x - p2.x + local v2y = p3.y - p2.y + local v2z = p3.z - p2.z + + local mag1 = Math:Sqrt(v1x * v1x + v1y * v1y + v1z * v1z) + local mag2 = Math:Sqrt(v2x * v2x + v2y * v2y + v2z * v2z) + + if mag1 > 0.001 and mag2 > 0.001 then + local dot = (v1x * v2x + v1y * v2y + v1z * v2z) / (mag1 * mag2) + dot = Math:Max(-1, Math:Min(1, dot)) + local angle = Math:Acos(dot) + local curvatureFactor = Math:Max(0.0, Math:Min(angle, 1.0)) + smoothedCurvature = smoothedCurvature + (curvatureFactor - smoothedCurvature) * Parameters.smooth + + local resultColor = Color:Lerp(Brush.colorRgb, Parameters.color, smoothedCurvature * Parameters.amount) + Symmetry:SetColorOverrides(resultColor) + end + end +end + +function End() + Symmetry:SetColorOverrideModes(ColorOverrideMode.None) +end diff --git a/Assets/Resources/LuaScriptExamples/PointerScript.CurvatureColor.lua.meta b/Assets/Resources/LuaScriptExamples/PointerScript.CurvatureColor.lua.meta new file mode 100644 index 0000000000..b6692dd7a7 --- /dev/null +++ b/Assets/Resources/LuaScriptExamples/PointerScript.CurvatureColor.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: b11ca855a0a00f74c8974430da9f502d +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 2d1920d65e755cf4f98a93b4a4e952e5, type: 3} diff --git a/Assets/Resources/LuaScriptExamples/PointerScript.VelocityColor.lua b/Assets/Resources/LuaScriptExamples/PointerScript.VelocityColor.lua new file mode 100644 index 0000000000..ca1532c923 --- /dev/null +++ b/Assets/Resources/LuaScriptExamples/PointerScript.VelocityColor.lua @@ -0,0 +1,24 @@ +Settings = { + description = "Velocity colors stroke - faster movement shifts toward chosen color", + space = "pointer" +} + +Parameters = { + color={label="Target Color", type="color", default=Color:New(1, 1, 1)}, + maxVelocity={label="Max Velocity", type="float", min=0.1, max=5, default=2}, +} + +function Start() + Symmetry:SetColorOverrideModes(ColorOverrideMode.Replace) +end + +function Main() + local velocity = Brush.speed + local t = Math:Min(velocity / Parameters.maxVelocity, 1) + local resultColor = Color:Lerp(Brush.colorRgb, Parameters.color, t) + Symmetry:SetColorOverrides(resultColor) +end + +function End() + Symmetry:SetColorOverrideModes(ColorOverrideMode.None) +end diff --git a/Assets/Resources/LuaScriptExamples/PointerScript.VelocityColor.lua.meta b/Assets/Resources/LuaScriptExamples/PointerScript.VelocityColor.lua.meta new file mode 100644 index 0000000000..53e83e29f7 --- /dev/null +++ b/Assets/Resources/LuaScriptExamples/PointerScript.VelocityColor.lua.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0b08515d4602d48468ffcceccafb857e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 2d1920d65e755cf4f98a93b4a4e952e5, type: 3} diff --git a/Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings.lua b/Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings2.lua similarity index 94% rename from Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings.lua rename to Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings2.lua index 7aeb02b6bd..c1f64a75b2 100644 --- a/Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings.lua +++ b/Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings2.lua @@ -25,7 +25,7 @@ function Main() Brush:SetHistorySize(Parameters.copies * Parameters.delay) for i = 0, Parameters.copies - 1 do - pointer = Transform:New(Vector3:Lerp(Brush.position, Brush:GetPastPosition(i * Parameters.delay), Parameters.mix)) + pointer = Transform:New(Vector3:Lerp(Brush.position, Brush:GetPastPosition(i * Parameters.delay), Parameters.mix) - Brush.position) pointers:Insert(pointer) --Colour cycling for the extra pointers diff --git a/Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings.lua.meta b/Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings2.lua.meta similarity index 100% rename from Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings.lua.meta rename to Assets/Resources/LuaScriptExamples/SymmetryScript.Ducklings2.lua.meta diff --git a/Assets/Resources/UnityGLTFSettings.asset b/Assets/Resources/UnityGLTFSettings.asset index e4caffbaab..21d42f1f0e 100644 --- a/Assets/Resources/UnityGLTFSettings.asset +++ b/Assets/Resources/UnityGLTFSettings.asset @@ -277,7 +277,7 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 9571021a85f04ddfb74e8aa5aad9cc5a, type: 3} m_Name: UnlitMaterialsExport - m_EditorClassIdentifier: + m_EditorClassIdentifier: enabled: 1 --- !u!114 &-6347874669906414174 MonoBehaviour: @@ -316,7 +316,7 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: de1f726221454139bfcce49d994d9d05, type: 3} m_Name: ExrImport - m_EditorClassIdentifier: + m_EditorClassIdentifier: enabled: 1 --- !u!114 &-6092789625841630549 MonoBehaviour: @@ -329,7 +329,7 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 6843a59b1a844430b7b7c08e8711a6d7, type: 3} m_Name: OpenBrushLightsImport - m_EditorClassIdentifier: + m_EditorClassIdentifier: enabled: 1 --- !u!114 &-6014669627118415582 MonoBehaviour: @@ -368,7 +368,7 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: a5d73111d7b6493da937accca1adfe6a, type: 3} m_Name: WebpImport - m_EditorClassIdentifier: + m_EditorClassIdentifier: enabled: 1 --- !u!114 &-5728475199642485532 MonoBehaviour: @@ -946,6 +946,7 @@ MonoBehaviour: - {fileID: -10028744433108678} - {fileID: 5366019203411034798} - {fileID: -4482434585190051212} + - {fileID: 3114973634942070004} ExportPlugins: - {fileID: 242952683485160214} - {fileID: -5728475199642485532} @@ -1332,7 +1333,20 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 6a3011a000a64498d8297909d5cc472a, type: 3} m_Name: SpriteRendererExport - m_EditorClassIdentifier: + m_EditorClassIdentifier: + enabled: 1 +--- !u!114 &3114973634942070004 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 26f6af0e137738040920f0910876a03c, type: 3} + m_Name: OpenBrushAudioImport + m_EditorClassIdentifier: enabled: 1 --- !u!114 &2637272668003332088 MonoBehaviour: diff --git a/Assets/Resources/X/Brushes/QuillCube.meta b/Assets/Resources/X/Brushes/QuillCube.meta new file mode 100644 index 0000000000..e68d1a6cf7 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCube.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b75d83d111a36d847b9bebe91f0e5e8f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillCube/QuillCube.asset b/Assets/Resources/X/Brushes/QuillCube/QuillCube.asset new file mode 100644 index 0000000000..91aa56491e --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCube/QuillCube.asset @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c71b2ac88638c5c41a0a0681f70d2512, type: 3} + m_Name: QuillCube + m_EditorClassIdentifier: + m_Guid: + m_storage: b3e7f8c2-4d5a-1e9b-6c8f-3a7d2f1e9c4b + m_DurableName: QuillCube + m_CreationVersion: 16.0 + m_ShaderVersion: 10.0 + m_BrushPrefab: {fileID: 1000012766643650, guid: 0387a82def0754b48b3bd47e830121f1, + type: 3} + m_Tags: + - experimental + - quill + m_Nondeterministic: 0 + m_Supersedes: {fileID: 0} + m_LooksIdentical: 0 + m_ButtonTexture: {fileID: 0} + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 455073616801390592 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionExtra: + m_BrushAudioLayers: [] + m_BrushAudioBasePitch: 1 + m_BrushAudioMaxPitchShift: 0 + m_BrushAudioMaxVolume: 0.7 + m_BrushVolumeUpSpeed: 1 + m_BrushVolumeDownSpeed: 3 + m_VolumeVelocityRangeMultiplier: 2 + m_AudioReactive: 0 + m_ButtonAudio: {fileID: 0} + m_Material: {fileID: 2100000, guid: 632c30292a1e6c7469362c8f225a9020, type: 2} + m_TextureAtlasV: 1 + m_TileRate: 1 + m_UseBloomSwatchOnColorPicker: 0 + m_BrushSizeRange: {x: 0.001, y: 5} + m_PressureSizeRange: {x: 0, y: 1} + m_SizeVariance: 0 + m_PreviewPressureSizeMin: 0.001 + m_Opacity: 1 + m_PressureOpacityRange: {x: 1, y: 1} + m_ColorLuminanceMin: 0 + m_ColorSaturationMax: 1 + m_ParticleSpeed: 0 + m_ParticleRate: 1 + m_ParticleInitialRotationRange: 0 + m_RandomizeAlpha: 0 + m_SprayRateMultiplier: 1 + m_RotationVariance: 0 + m_PositionVariance: 0 + m_SizeRatio: {x: 1, y: 1} + m_M11Compatibility: 0 + m_SolidMinLengthMeters_PS: 0.0005 + m_TubeStoreRadiusInTexcoord0Z: 1 + m_RenderBackfaces: 0 + m_BackIsInvisible: 0 + m_BackfaceHueShift: 0 + m_BoundsPadding: 0 + m_PlayBackAtStrokeGranularity: 0 + m_BlendMode: 0 + m_EmissiveFactor: 0 + m_AllowExport: 1 + m_SupportsSimplification: 0 + m_HeadMinPoints: 6 + m_HeadPointStep: 1 + m_TailMinPoints: 6 + m_TailPointStep: 1 + m_MiddlePointStep: 0 + references: + version: 2 + RefIds: [] diff --git a/Assets/Resources/X/Brushes/QuillCube/QuillCube.asset.meta b/Assets/Resources/X/Brushes/QuillCube/QuillCube.asset.meta new file mode 100644 index 0000000000..2fcfbfd5e5 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCube/QuillCube.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 126a9037e3ef7324ba28fafe3fb2175a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillCube/QuillCube.prefab b/Assets/Resources/X/Brushes/QuillCube/QuillCube.prefab new file mode 100644 index 0000000000..05dd1d5ca6 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCube/QuillCube.prefab @@ -0,0 +1,112 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1000012766643650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013020273716} + - component: {fileID: 114000013503629794} + - component: {fileID: 23000012424641130} + - component: {fileID: 33000011524108426} + m_Layer: 0 + m_Name: QuillCube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013020273716 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643650} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114000013503629794 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643650} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 87cab018d8184d009d8f212cb1506bc7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CapAspect: 0.8 + m_PointsInClosedCircle: 4 + m_EndCaps: 0 + m_HardEdges: 1 + m_uvStyle: 0 + m_RadiusMultiplier: 1.414214 + m_CrossSectionAngleOffset: -0.7853982 + m_ShapeModifier: 0 + m_TaperScalar: 1 + m_PetalDisplacementAmt: 0.5 + m_PetalDisplacementExp: 3 + m_EllipseMinorScale: 0.25 + m_BreakAngleMultiplier: 2 + m_ForceAllKnots: 1 +--- !u!23 &23000012424641130 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643650} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &33000011524108426 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643650} + m_Mesh: {fileID: 0} diff --git a/Assets/Resources/X/Brushes/QuillCube/QuillCube.prefab.meta b/Assets/Resources/X/Brushes/QuillCube/QuillCube.prefab.meta new file mode 100644 index 0000000000..707dcfaa5c --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCube/QuillCube.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0387a82def0754b48b3bd47e830121f1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillCylinder.meta b/Assets/Resources/X/Brushes/QuillCylinder.meta new file mode 100644 index 0000000000..e9d8411807 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCylinder.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d38795103aa5f5640827259481752f83 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.asset b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.asset new file mode 100644 index 0000000000..63188156c0 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.asset @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c71b2ac88638c5c41a0a0681f70d2512, type: 3} + m_Name: QuillCylinder + m_EditorClassIdentifier: + m_Guid: + m_storage: f1c4e3e7-2a9f-4b5d-8c3e-7d9a1f8e6b4c + m_DurableName: QuillCylinder + m_CreationVersion: 16.0 + m_ShaderVersion: 10.0 + m_BrushPrefab: {fileID: 1000012766643648, guid: 6c5293cd417bd87499d9c4bac547947c, + type: 3} + m_Tags: + - experimental + - quill + m_Nondeterministic: 0 + m_Supersedes: {fileID: 0} + m_LooksIdentical: 0 + m_ButtonTexture: {fileID: 0} + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 455073689002139648 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionExtra: + m_BrushAudioLayers: [] + m_BrushAudioBasePitch: 1 + m_BrushAudioMaxPitchShift: 0 + m_BrushAudioMaxVolume: 0.7 + m_BrushVolumeUpSpeed: 1 + m_BrushVolumeDownSpeed: 3 + m_VolumeVelocityRangeMultiplier: 2 + m_AudioReactive: 0 + m_ButtonAudio: {fileID: 0} + m_Material: {fileID: 2100000, guid: 632c30292a1e6c7469362c8f225a9020, type: 2} + m_TextureAtlasV: 1 + m_TileRate: 1 + m_UseBloomSwatchOnColorPicker: 0 + m_BrushSizeRange: {x: 0.001, y: 5} + m_PressureSizeRange: {x: 0, y: 1} + m_SizeVariance: 0 + m_PreviewPressureSizeMin: 0.001 + m_Opacity: 1 + m_PressureOpacityRange: {x: 1, y: 1} + m_ColorLuminanceMin: 0 + m_ColorSaturationMax: 1 + m_ParticleSpeed: 0 + m_ParticleRate: 1 + m_ParticleInitialRotationRange: 0 + m_RandomizeAlpha: 0 + m_SprayRateMultiplier: 1 + m_RotationVariance: 0 + m_PositionVariance: 0 + m_SizeRatio: {x: 1, y: 1} + m_M11Compatibility: 0 + m_SolidMinLengthMeters_PS: 0.0005 + m_TubeStoreRadiusInTexcoord0Z: 1 + m_RenderBackfaces: 0 + m_BackIsInvisible: 0 + m_BackfaceHueShift: 0 + m_BoundsPadding: 0 + m_PlayBackAtStrokeGranularity: 0 + m_BlendMode: 0 + m_EmissiveFactor: 0 + m_AllowExport: 1 + m_SupportsSimplification: 0 + m_HeadMinPoints: 6 + m_HeadPointStep: 1 + m_TailMinPoints: 6 + m_TailPointStep: 1 + m_MiddlePointStep: 0 + references: + version: 2 + RefIds: [] diff --git a/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.asset.meta b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.asset.meta new file mode 100644 index 0000000000..6f9cc23207 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 665b886e3e4aaa448bf2ff0647172507 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.prefab b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.prefab new file mode 100644 index 0000000000..7534e7fea7 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.prefab @@ -0,0 +1,106 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1000012766643648 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013020273714} + - component: {fileID: 114000013503629792} + - component: {fileID: 23000012424641128} + - component: {fileID: 33000011524108424} + m_Layer: 0 + m_Name: QuillCylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013020273714 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643648} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114000013503629792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643648} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 87cab018d8184d009d8f212cb1506bc7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CapAspect: 0.8 + m_PointsInClosedCircle: 7 + m_EndCaps: 0 + m_HardEdges: 0 + m_uvStyle: 0 + m_RadiusMultiplier: 1 + m_CrossSectionAngleOffset: 1.570796 + m_ShapeModifier: 0 + m_TaperScalar: 1 + m_PetalDisplacementAmt: 0.5 + m_PetalDisplacementExp: 3 + m_EllipseMinorScale: 0.25 + m_BreakAngleMultiplier: 2 + m_ForceAllKnots: 1 +--- !u!23 &23000012424641128 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643648} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33000011524108424 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643648} + m_Mesh: {fileID: 0} diff --git a/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.prefab.meta b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.prefab.meta new file mode 100644 index 0000000000..a287521193 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillCylinder/QuillCylinder.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6c5293cd417bd87499d9c4bac547947c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillEllipse.meta b/Assets/Resources/X/Brushes/QuillEllipse.meta new file mode 100644 index 0000000000..4cd7466d7f --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillEllipse.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 744eb730027bc5d42b942b7459fe689d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.asset b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.asset new file mode 100644 index 0000000000..fdf1333e2d --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.asset @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c71b2ac88638c5c41a0a0681f70d2512, type: 3} + m_Name: QuillEllipse + m_EditorClassIdentifier: + m_Guid: + m_storage: a2d5f6b8-9c1e-4f3a-7b8d-2e6c9f4a1d5b + m_DurableName: QuillEllipse + m_CreationVersion: 16.0 + m_ShaderVersion: 10.0 + m_BrushPrefab: {fileID: 1000012766643649, guid: da6d22047e3337b4b85c57a0f2891ce7, + type: 3} + m_Tags: + - experimental + - quill + m_Nondeterministic: 0 + m_Supersedes: {fileID: 0} + m_LooksIdentical: 0 + m_ButtonTexture: {fileID: 0} + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 455073748024385536 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionExtra: + m_BrushAudioLayers: [] + m_BrushAudioBasePitch: 1 + m_BrushAudioMaxPitchShift: 0 + m_BrushAudioMaxVolume: 0.7 + m_BrushVolumeUpSpeed: 1 + m_BrushVolumeDownSpeed: 3 + m_VolumeVelocityRangeMultiplier: 2 + m_AudioReactive: 0 + m_ButtonAudio: {fileID: 0} + m_Material: {fileID: 2100000, guid: 632c30292a1e6c7469362c8f225a9020, type: 2} + m_TextureAtlasV: 1 + m_TileRate: 1 + m_UseBloomSwatchOnColorPicker: 0 + m_BrushSizeRange: {x: 0.001, y: 5} + m_PressureSizeRange: {x: 0, y: 1} + m_SizeVariance: 0 + m_PreviewPressureSizeMin: 0.001 + m_Opacity: 1 + m_PressureOpacityRange: {x: 1, y: 1} + m_ColorLuminanceMin: 0 + m_ColorSaturationMax: 1 + m_ParticleSpeed: 0 + m_ParticleRate: 1 + m_ParticleInitialRotationRange: 0 + m_RandomizeAlpha: 0 + m_SprayRateMultiplier: 1 + m_RotationVariance: 0 + m_PositionVariance: 0 + m_SizeRatio: {x: 1, y: 1} + m_M11Compatibility: 0 + m_SolidMinLengthMeters_PS: 0.0005 + m_TubeStoreRadiusInTexcoord0Z: 1 + m_RenderBackfaces: 0 + m_BackIsInvisible: 0 + m_BackfaceHueShift: 0 + m_BoundsPadding: 0 + m_PlayBackAtStrokeGranularity: 0 + m_BlendMode: 0 + m_EmissiveFactor: 0 + m_AllowExport: 1 + m_SupportsSimplification: 0 + m_HeadMinPoints: 6 + m_HeadPointStep: 1 + m_TailMinPoints: 6 + m_TailPointStep: 1 + m_MiddlePointStep: 0 + references: + version: 2 + RefIds: [] diff --git a/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.asset.meta b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.asset.meta new file mode 100644 index 0000000000..7d35afe0d1 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0b9e3ef5d1db1842b037df6f7afb6b8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.prefab b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.prefab new file mode 100644 index 0000000000..ef18c59426 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.prefab @@ -0,0 +1,106 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1000012766643649 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013020273715} + - component: {fileID: 114000013503629793} + - component: {fileID: 23000012424641129} + - component: {fileID: 33000011524108425} + m_Layer: 0 + m_Name: QuillEllipse + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013020273715 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643649} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114000013503629793 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643649} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 87cab018d8184d009d8f212cb1506bc7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CapAspect: 0.8 + m_PointsInClosedCircle: 7 + m_EndCaps: 0 + m_HardEdges: 0 + m_uvStyle: 0 + m_RadiusMultiplier: 1 + m_CrossSectionAngleOffset: 1.570796 + m_ShapeModifier: 6 + m_TaperScalar: 1 + m_PetalDisplacementAmt: 0.5 + m_PetalDisplacementExp: 3 + m_EllipseMinorScale: 0.3 + m_BreakAngleMultiplier: 2 + m_ForceAllKnots: 1 +--- !u!23 &23000012424641129 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643649} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &33000011524108425 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643649} + m_Mesh: {fileID: 0} diff --git a/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.prefab.meta b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.prefab.meta new file mode 100644 index 0000000000..ca0bfae175 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillEllipse/QuillEllipse.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: da6d22047e3337b4b85c57a0f2891ce7 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillRibbon.meta b/Assets/Resources/X/Brushes/QuillRibbon.meta new file mode 100644 index 0000000000..916a7fccc0 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillRibbon.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d5e2a8787e340504eab72d3adcec6b5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.asset b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.asset new file mode 100644 index 0000000000..1b4f0b4c26 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.asset @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c71b2ac88638c5c41a0a0681f70d2512, type: 3} + m_Name: QuillRibbon + m_EditorClassIdentifier: + m_Guid: + m_storage: c4f8b3e2-9d1a-5e7f-4c3b-8a6d2f9e1c7b + m_DurableName: QuillRibbon + m_CreationVersion: 16.0 + m_ShaderVersion: 10.0 + m_BrushPrefab: {fileID: 1000012766643651, guid: ce3834e0b85a3994e91b381ba401eec6, + type: 3} + m_Tags: + - experimental + - quill + m_Nondeterministic: 0 + m_Supersedes: {fileID: 0} + m_LooksIdentical: 0 + m_ButtonTexture: {fileID: 0} + m_LocalizedDescription: + m_TableReference: + m_TableCollectionName: GUID:c84355079ab3f3e4f8f3812258805f86 + m_TableEntryReference: + m_KeyId: 455073795705233408 + m_Key: + m_FallbackState: 0 + m_WaitForCompletion: 0 + m_LocalVariables: [] + m_DescriptionExtra: + m_BrushAudioLayers: [] + m_BrushAudioBasePitch: 1 + m_BrushAudioMaxPitchShift: 0 + m_BrushAudioMaxVolume: 0.7 + m_BrushVolumeUpSpeed: 1 + m_BrushVolumeDownSpeed: 3 + m_VolumeVelocityRangeMultiplier: 2 + m_AudioReactive: 0 + m_ButtonAudio: {fileID: 0} + m_Material: {fileID: 2100000, guid: 632c30292a1e6c7469362c8f225a9020, type: 2} + m_TextureAtlasV: 1 + m_TileRate: 1 + m_UseBloomSwatchOnColorPicker: 0 + m_BrushSizeRange: {x: 0.001, y: 5} + m_PressureSizeRange: {x: 0, y: 1} + m_SizeVariance: 0 + m_PreviewPressureSizeMin: 0.001 + m_Opacity: 1 + m_PressureOpacityRange: {x: 1, y: 1} + m_ColorLuminanceMin: 0 + m_ColorSaturationMax: 1 + m_ParticleSpeed: 0 + m_ParticleRate: 1 + m_ParticleInitialRotationRange: 0 + m_RandomizeAlpha: 0 + m_SprayRateMultiplier: 1 + m_RotationVariance: 0 + m_PositionVariance: 0 + m_SizeRatio: {x: 1, y: 1} + m_M11Compatibility: 0 + m_SolidMinLengthMeters_PS: 0.0005 + m_TubeStoreRadiusInTexcoord0Z: 0 + m_RenderBackfaces: 0 + m_BackIsInvisible: 0 + m_BackfaceHueShift: 0 + m_BoundsPadding: 0 + m_PlayBackAtStrokeGranularity: 0 + m_BlendMode: 0 + m_EmissiveFactor: 0 + m_AllowExport: 1 + m_SupportsSimplification: 0 + m_HeadMinPoints: 6 + m_HeadPointStep: 1 + m_TailMinPoints: 6 + m_TailPointStep: 1 + m_MiddlePointStep: 0 + references: + version: 2 + RefIds: [] diff --git a/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.asset.meta b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.asset.meta new file mode 100644 index 0000000000..708b165c77 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d1dd4d7dd0c1b1479e257a2e58d20d3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.prefab b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.prefab new file mode 100644 index 0000000000..9b3fde889b --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.prefab @@ -0,0 +1,102 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1000012766643651 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4000013020273717} + - component: {fileID: -1422662685674682266} + - component: {fileID: 23000012424641131} + - component: {fileID: 33000011524108427} + m_Layer: 0 + m_Name: QuillRibbon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4000013020273717 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643651} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &-1422662685674682266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643651} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d5d5b674ee74df0ae7b4a6f145ff122, type: 3} + m_Name: + m_EditorClassIdentifier: + m_uvStyle: 0 + m_bOffsetInTexcoord1: 0 + m_DisableWidthSmoothing: 1 + m_ForceAllKnots: 1 +--- !u!23 &23000012424641131 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643651} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &33000011524108427 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012766643651} + m_Mesh: {fileID: 0} diff --git a/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.prefab.meta b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.prefab.meta new file mode 100644 index 0000000000..a9627e7656 --- /dev/null +++ b/Assets/Resources/X/Brushes/QuillRibbon/QuillRibbon.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ce3834e0b85a3994e91b381ba401eec6 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 6c81f93283..783bbf0627 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -3438,12 +3438,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 8300000, guid: a54573c219ca2e949ab798815c9078c8, type: 3} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 1 m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 1 @@ -3738,12 +3738,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 8300000, guid: 670ce17e9f3fb614cae2e3433eb40097, type: 3} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 1 m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 0 @@ -5982,6 +5982,100 @@ Transform: type: 3} m_PrefabInstance: {fileID: 1619403413} m_PrefabAsset: {fileID: 0} +--- !u!1001 &284638257 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 593121476} + m_Modifications: + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758591, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_Name + value: PushPullTool + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758591, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7535520504170321093, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: Loop + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7535520504170321093, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: Spatialize + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7535520504170321093, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + propertyPath: panLevelCustomCurve.m_Curve.Array.data[0].value + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9515dfdefc9ac3045ab77450def48e00, type: 3} +--- !u!4 &284638258 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3491021130848758576, guid: 9515dfdefc9ac3045ab77450def48e00, + type: 3} + m_PrefabInstance: {fileID: 284638257} + m_PrefabAsset: {fileID: 0} --- !u!1001 &286380318 PrefabInstance: m_ObjectHideFlags: 0 @@ -9800,6 +9894,8 @@ Transform: - {fileID: 402490430} - {fileID: 621655958} - {fileID: 1804317401} + - {fileID: 284638258} + - {fileID: 1906386440} m_Father: {fileID: 1796800572} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &593121477 @@ -10512,7 +10608,9 @@ GameObject: - component: {fileID: 652605572} - component: {fileID: 652605564} - component: {fileID: 652605570} + - component: {fileID: 652605575} - component: {fileID: 652605574} + - component: {fileID: 652605576} m_Layer: 0 m_Name: App m_TagString: Untagged @@ -11338,6 +11436,25 @@ MonoBehaviour: - DefaultBackgroundImages/stereopanorama.jpg - DefaultBackgroundImages/ATTRIBUTION.txt --- !u!114 &652605574 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652605543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4dca52281a4840acb41e0cb27ab4671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_DefaultSoundClips: + - DefaultSoundClips/underwater.wav + m_DebugOutput: 0 + m_supportedSoundClipExtensions: + - .wav + - .ogg + - .mp3 +--- !u!114 &652605575 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -11354,6 +11471,18 @@ MonoBehaviour: - DefaultSavedStrokes/Knot.tilt - DefaultSavedStrokes/Star.tilt - DefaultSavedStrokes/Snowflake.tilt +--- !u!114 &652605576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 652605543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 15156cc6acae14f44863628350e2508d, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!4 &669339392 stripped Transform: m_CorrespondingSourceObject: {fileID: 4492044767078796625, guid: 382dabebd59956d499aefb54b02f804d, @@ -15572,7 +15701,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 91175dcc15224463780e01a8a98b1b60, type: 3} m_Name: m_EditorClassIdentifier: - voiceDetection: 1 + voiceDetection: 0 voiceDetectionThreshold: 0.01 voiceDetectionDelayMs: 500 interestGroup: 0 @@ -15620,9 +15749,8 @@ MonoBehaviour: ApplyDontDestroyOnLoad: 1 runInBackground: 1 statsResetInterval: 1000 - speakerPrefab: {fileID: 9139372413509065517, guid: 482e38719c8825849a31f10f4f27c046, - type: 3} - primaryRecorder: {fileID: 1052269835} + speakerPrefab: {fileID: 0} + primaryRecorder: {fileID: 0} usePrimaryRecorder: 0 cppCompatibilityMode: 0 Settings: @@ -15641,7 +15769,7 @@ MonoBehaviour: AuthMode: 0 EnableLobbyStatistics: 0 NetworkLogging: 1 - ShowSettings: 0 + ShowSettings: 1 UseVoiceAppSettings: 0 --- !u!114 &1052269837 MonoBehaviour: @@ -16191,12 +16319,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 8300000, guid: bf8585fc12bb2974c8562060b13192c4, type: 3} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 0.15 m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 1 @@ -19982,12 +20110,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 8300000, guid: a54573c219ca2e949ab798815c9078c8, type: 3} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 1 m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 1 @@ -21980,12 +22108,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 8300000, guid: 26960500efb643c46892c59bc57ed348, type: 3} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 0.15 m_Pitch: 1 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 1 @@ -25736,6 +25864,12 @@ MonoBehaviour: m_ModeQuest: 1 m_Basic: 0 m_Advanced: 1 + - m_PanelPrefab: {fileID: 109932, guid: 25ef2a4f5d9580940a252d69638f77ce, type: 3} + m_ModeVr: 1 + m_ModeMono: 1 + m_ModeQuest: 1 + m_Basic: 0 + m_Advanced: 1 - m_PanelPrefab: {fileID: 199434, guid: 6dafd36d9488aba4a998d2ef69ea2553, type: 3} m_ModeVr: 1 m_ModeMono: 1 @@ -25827,6 +25961,8 @@ MonoBehaviour: m_VideoWidgetPrefab: {fileID: 854942063617328480, guid: a1bf54eee52cec14e8207351740867f3, type: 3} m_TextWidgetPrefab: {fileID: 11466202, guid: c28bc4e3ed71248b889df2a70d873d0b, type: 3} + m_SoundClipWidgetPrefab: {fileID: 854942063617328480, guid: eb0cb4b31c139874e8f348d6682dec69, + type: 3} m_LightWidgetPrefab: {fileID: 11466202, guid: e061cff5394e32940bb00495b287bb38, type: 3} m_SceneLightGizmoPrefab: {fileID: 1712584378369130260, guid: f28bfd6efbf3cb046be485c6573ca207, @@ -27700,6 +27836,100 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1903256355} m_Mesh: {fileID: 4300000, guid: 20b1c3d24ef5d584196d13565a56bc67, type: 3} +--- !u!1001 &1906386439 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 593121476} + m_Modifications: + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758591, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_Name + value: TintColorTool + objectReference: {fileID: 0} + - target: {fileID: 3491021130848758591, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7535520504170321093, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: Loop + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7535520504170321093, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: Spatialize + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7535520504170321093, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + propertyPath: panLevelCustomCurve.m_Curve.Array.data[0].value + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 83973cf2914084bd3838780fa88138dc, type: 3} +--- !u!4 &1906386440 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3491021130848758576, guid: 83973cf2914084bd3838780fa88138dc, + type: 3} + m_PrefabInstance: {fileID: 1906386439} + m_PrefabAsset: {fileID: 0} --- !u!1 &1911562970 GameObject: m_ObjectHideFlags: 0 @@ -29763,7 +29993,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a86f533fd9917dd4da8601e9eb542c96, type: 3} m_Name: m_EditorClassIdentifier: - LogLevel: 1 + LogLevel: 2 --- !u!4 &2066419201 Transform: m_ObjectHideFlags: 0 @@ -30214,12 +30444,12 @@ AudioSource: serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} m_audioClip: {fileID: 8300000, guid: be949bc723bdf6447802b4e1b067e993, type: 3} - m_PlayOnAwake: 1 + m_PlayOnAwake: 0 m_Volume: 0.15 m_Pitch: 0.9 Loop: 1 Mute: 0 - Spatialize: 0 + Spatialize: 1 SpatializePostEffects: 0 Priority: 128 DopplerLevel: 0 @@ -32386,6 +32616,11 @@ PrefabInstance: propertyPath: m_Name value: GltfExportStandinManager objectReference: {fileID: 0} + - target: {fileID: 5512400623774099615, guid: fd97be770c9e84eb1b5fcc5c06bd0adf, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] diff --git a/Assets/Scripts/API/ApiManager.cs b/Assets/Scripts/API/ApiManager.cs index 3050267a73..9e3c9b3ca4 100644 --- a/Assets/Scripts/API/ApiManager.cs +++ b/Assets/Scripts/API/ApiManager.cs @@ -686,6 +686,8 @@ private string HandleApiQuery(string commandString) { case "query.queue": return m_OutgoingCommandQueue.Count.ToString(); + case "query.quill.stats": + return JsonConvert.SerializeObject(Quill.QuillDiagnostics.LastLoad, Formatting.Indented); case "query.command": if (m_CommandStatuses.ContainsKey(commandPair[1])) { diff --git a/Assets/Scripts/API/ApiMethods.SharpQuill.cs b/Assets/Scripts/API/ApiMethods.SharpQuill.cs new file mode 100644 index 0000000000..eb4027dbd4 --- /dev/null +++ b/Assets/Scripts/API/ApiMethods.SharpQuill.cs @@ -0,0 +1,25 @@ +// 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. + +namespace TiltBrush +{ + public static partial class ApiMethods + { + [ApiEndpoint("load.quill", "Loads a Quill sketch from the given path")] + public static void LoadQuill(string path, int maxStrokes = 0, bool loadAnimations = false, string layerName = null, int chapterIndex = -1) + { + Quill.Load(path, maxStrokes, loadAnimations, layerName, flattenHierarchy: true, chapterIndex: chapterIndex); + } + } +} diff --git a/Assets/Scripts/API/ApiMethods.SharpQuill.cs.meta b/Assets/Scripts/API/ApiMethods.SharpQuill.cs.meta new file mode 100644 index 0000000000..794e50a7b4 --- /dev/null +++ b/Assets/Scripts/API/ApiMethods.SharpQuill.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d00f76fafce77b4b92d1d1fbdaf32e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/API/ApiMethods.Tools.cs b/Assets/Scripts/API/ApiMethods.Tools.cs index 257cf80e79..27d7878d2c 100644 --- a/Assets/Scripts/API/ApiMethods.Tools.cs +++ b/Assets/Scripts/API/ApiMethods.Tools.cs @@ -151,5 +151,11 @@ public static void ActivateFlyTool() { SketchSurfacePanel.m_Instance.EnableSpecificTool(BaseTool.ToolType.FlyTool); } + + [ApiEndpoint("tool.tintcolor", "Activates the Tint Color Tool")] + public static void ActivateTintColorTool() + { + SketchSurfacePanel.m_Instance.EnableSpecificTool(BaseTool.ToolType.TintColorTool); + } } } diff --git a/Assets/Scripts/API/ApiMethods.Utils.cs b/Assets/Scripts/API/ApiMethods.Utils.cs index c6a01019fe..bf49edc468 100644 --- a/Assets/Scripts/API/ApiMethods.Utils.cs +++ b/Assets/Scripts/API/ApiMethods.Utils.cs @@ -199,6 +199,12 @@ private static VideoWidget _GetActiveVideo(int index) return WidgetManager.m_Instance.ActiveVideoWidgets[index].WidgetScript; } + private static SoundClipWidget _GetActiveSoundClip(int index) + { + index = _NegativeIndexing(index, WidgetManager.m_Instance.ActiveSoundClipWidgets); + return WidgetManager.m_Instance.ActiveSoundClipWidgets[index].WidgetScript; + } + private static ModelWidget _GetActiveModel(int index) { index = _NegativeIndexing(index, WidgetManager.m_Instance.ActiveModelWidgets); diff --git a/Assets/Scripts/API/ApiMethods.cs b/Assets/Scripts/API/ApiMethods.cs index 451eb81248..68ed6ec51e 100644 --- a/Assets/Scripts/API/ApiMethods.cs +++ b/Assets/Scripts/API/ApiMethods.cs @@ -23,7 +23,6 @@ namespace TiltBrush // ReSharper disable once UnusedType.Global public static partial class ApiMethods { - // Example of calling a command and recording an undo step // [ApiEndpoint("foo", "")] // public static void FooCommand() @@ -581,11 +580,7 @@ public static ImageWidget ImportImage(string location) { location = _DownloadMediaFileFromUrl(location, "Images"); } - - ReferenceImage image = _LoadReferenceImage(location); - var cmd = new CreateWidgetCommand(WidgetManager.m_Instance.ImageWidgetPrefab, _CurrentBrushTransform(), forceTransform: true); - SketchMemoryScript.m_Instance.PerformAndRecordCommand(cmd); - var imageWidget = cmd.Widget as ImageWidget; + var imageWidget = _ImportImage(location, _CurrentBrushTransform()); if (imageWidget != null) { // Set consistent size regardless of scene scale @@ -594,17 +589,47 @@ public static ImageWidget ImportImage(string location) // Now enable preservation to prevent async overrides imageWidget.SetPreserveCustomSize(true); - imageWidget.ReferenceImage = image; - imageWidget.Show(true); - cmd.SetWidgetCost(imageWidget.GetTiltMeterCost()); } - WidgetManager.m_Instance.WidgetsDormant = false; SketchControlsScript.m_Instance.EatGazeObjectInput(); SelectionManager.m_Instance.RemoveFromSelection(false); return imageWidget; } + public static ImageWidget _ImportImage(string location, TrTransform xf) + { + ReferenceImage image = _LoadReferenceImage(location); + var cmd = new CreateWidgetCommand(WidgetManager.m_Instance.ImageWidgetPrefab, xf, forceTransform: true); + SketchMemoryScript.m_Instance.PerformAndRecordCommand(cmd); + var imageWidget = cmd.Widget as ImageWidget; + if (imageWidget != null) + { + imageWidget.ReferenceImage = image; + imageWidget.Show(true); + cmd.SetWidgetCost(imageWidget.GetTiltMeterCost()); + } + return imageWidget; + } + + public static ImageWidget _ImportImage(string location, TrTransform xf, CanvasScript targetCanvas) + { + if (targetCanvas == null) + { + return _ImportImage(location, xf); + } + + var previousCanvas = App.Scene.ActiveCanvas; + try + { + App.Scene.ActiveCanvas = targetCanvas; + return _ImportImage(location, xf); + } + finally + { + App.Scene.ActiveCanvas = previousCanvas; + } + } + // TODO - currently the polygon collider isn't using the imported SVG sprite // [ApiEndpoint( // "image.extrude", @@ -729,6 +754,59 @@ public static void EnableRamLogging(bool active) App.Instance.RamLoggingActive = active; } + [ApiEndpoint("audio.reactive", "Enable or disable audio-reactive mode", "true")] + public static string EnableAudioReactiveMode(bool active) + { + if (App.Instance.RequestingAudioReactiveMode != active) + { + App.Instance.ToggleAudioReactiveBrushesRequest(); + } + return $"audio.reactive={App.Instance.RequestingAudioReactiveMode}"; + } + + [ApiEndpoint("audio.music.play", "Play in-app music and enable audio-reactive mode", "0")] + public static string PlayAudioReactiveMusic(int index) + { + if (AudioManager.m_Instance == null) + { + const string message = "AudioManager is not initialized"; + Debug.LogError(message); + return $"error: {message}"; + } + + if (index < 0 || index >= AudioManager.m_Instance.NumGameMusics()) + { + string message = $"Invalid game music index: {index}"; + Debug.LogError(message); + return $"error: {message}"; + } + + AudioManager.m_Instance.PlayGameMusic(index); + if (!App.Instance.RequestingAudioReactiveMode) + { + App.Instance.ToggleAudioReactiveBrushesRequest(); + } + return $"audio.music.play={index}"; + } + + [ApiEndpoint("audio.music.stop", "Stop in-app music and disable audio-reactive mode")] + public static string StopAudioReactiveMusic() + { + if (AudioManager.m_Instance == null) + { + const string message = "AudioManager is not initialized"; + Debug.LogError(message); + return $"error: {message}"; + } + + AudioManager.m_Instance.StopMusic(); + if (App.Instance.RequestingAudioReactiveMode) + { + App.Instance.ToggleAudioReactiveBrushesRequest(); + } + return "audio.music.stop"; + } + [ApiEndpoint( "layer.delete", "Deletes a layer", diff --git a/Assets/Scripts/API/DrawStrokes.cs b/Assets/Scripts/API/DrawStrokes.cs index aed1800f37..2aab74fbcf 100644 --- a/Assets/Scripts/API/DrawStrokes.cs +++ b/Assets/Scripts/API/DrawStrokes.cs @@ -27,6 +27,7 @@ public static List DrawNestedTrList( IEnumerable> pathEnumerable, TrTransform tr, List colors = null, + List> controlPointColors = null, float brushScale = 1f, float smoothing = 0, uint group = GroupManager.kIdSketchGroupTagNone) @@ -104,6 +105,7 @@ void addPoint(Vector3 pos) m_Color = color, m_Seed = 0, m_ControlPoints = controlPoints.ToArray(), + m_OverrideColors = controlPointColors?[pathIndex]?.ToList() }; stroke.m_ControlPointsToDrop = Enumerable.Repeat(false, stroke.m_ControlPoints.Length).ToArray(); stroke.Group = new SketchGroupTag(group); diff --git a/Assets/Scripts/API/Lua/LuaManager.cs b/Assets/Scripts/API/Lua/LuaManager.cs index 61aff1e129..e75c249a3e 100644 --- a/Assets/Scripts/API/Lua/LuaManager.cs +++ b/Assets/Scripts/API/Lua/LuaManager.cs @@ -147,11 +147,20 @@ public struct ScriptTrTransform { public TrTransform Transform; public ScriptCoordSpace Space; + public Color32? Color; public ScriptTrTransform(TrTransform transform, ScriptCoordSpace space) { Transform = transform; Space = space; + Color = null; + } + + public ScriptTrTransform(TrTransform transform, ScriptCoordSpace space, Color32 color) + { + Transform = transform; + Space = space; + Color = color; } } @@ -444,13 +453,13 @@ public void LogLuaCastError(Script script, string fnName, InvalidCastException e public void LogGenericLuaError(Script script, string fnName, Exception e) { - if (e is ScriptRuntimeException) + if (e is ScriptRuntimeException runtimeException) { - LogLuaInterpreterError(script, fnName, e as ScriptRuntimeException); + LogLuaInterpreterError(script, fnName, runtimeException); } - else if (e is InvalidCastException) + else if (e is InvalidCastException castException) { - LogLuaCastError(script, fnName, e as InvalidCastException); + LogLuaCastError(script, fnName, castException); } } @@ -669,13 +678,15 @@ private void CallActiveBackgroundScripts(string fnName) private bool CallActivePointerScript(string fnName, out ScriptTrTransform result) { var script = GetActiveScript(LuaApiCategory.PointerScript); - DynValue returnedTr = _CallScript(script, fnName); + DynValue luaReturnValue = _CallScript(script, fnName); var space = _GetSpaceForActiveScript(LuaApiCategory.PointerScript); try { - if (!returnedTr.Equals(DynValue.Nil)) + Table tbl = luaReturnValue.Table; + if (!luaReturnValue.IsNil()) { - result = new ScriptTrTransform(returnedTr.ToObject(), space); + result = new ScriptTrTransform( + luaReturnValue.ToObject(), space); return true; } } @@ -943,6 +954,7 @@ public void RegisterApiClasses(Script script) RegisterApiEnum(script, "SymmetryMode", typeof(SymmetryMode)); RegisterApiEnum(script, "SymmetryPointType", typeof(SymmetryPointType)); RegisterApiEnum(script, "SymmetryWallpaperType", typeof(SymmetryWallpaperType)); + RegisterApiEnum(script, "ColorOverrideMode", typeof(ColorOverrideMode)); } @@ -1272,7 +1284,7 @@ public void DoToolScript(string fnName, TrTransform firstTr_CS, TrTransform seco var xfSymmetriesGS = PointerManager.m_Instance.GetSymmetriesForCurrentMode(); if (xfSymmetriesGS.Count == 0) { - DrawStrokes.DrawNestedTrList(transforms, tr_CS, result._Colors, brushScale); + DrawStrokes.DrawNestedTrList(transforms, tr_CS, result._Colors, null, brushScale); } else { @@ -1310,7 +1322,7 @@ public void DoToolScript(string fnName, TrTransform firstTr_CS, TrTransform seco newTransforms.Add(newTrList); } } - DrawStrokes.DrawNestedTrList(newTransforms, TrTransform.identity, result._Colors, brushScale); + DrawStrokes.DrawNestedTrList(newTransforms, TrTransform.identity, result._Colors, null, brushScale); } } diff --git a/Assets/Scripts/API/Lua/Wrappers/BrushApiWrapper.cs b/Assets/Scripts/API/Lua/Wrappers/BrushApiWrapper.cs index 0b935635c8..07c6e58879 100644 --- a/Assets/Scripts/API/Lua/Wrappers/BrushApiWrapper.cs +++ b/Assets/Scripts/API/Lua/Wrappers/BrushApiWrapper.cs @@ -129,6 +129,22 @@ public static string colorHtml [LuaDocsExample("Brush:JitterColor()")] public static void JitterColor() => LuaApiMethods.JitterColor(); + [LuaDocsDescription("Sets the brush override color")] + [LuaDocsParameter("color", "The color to set")] + [LuaDocsExample("Brush:SetColorOverride(Color.red)")] + public static void SetColorOverride(Color color) + { + PointerManager.m_Instance.MainPointer.CurrentColorOverride = color; + } + + [LuaDocsDescription("Sets the brush override color mode")] + [LuaDocsParameter("mode", "The mode to set")] + [LuaDocsExample("Brush:SetColorOverrideMode(ColorOverrideMode.Blend)")] + public static void SetColorOverrideMode(ColorOverrideMode mode) + { + PointerManager.m_Instance.MainPointer.CurrentColorOverrideMode = mode; + } + [LuaDocsDescription("The last color picked by the brush.")] public static Color lastColorPicked => PointerManager.m_Instance.m_lastChosenColor; diff --git a/Assets/Scripts/API/Lua/Wrappers/SymmetryApiWrapper.cs b/Assets/Scripts/API/Lua/Wrappers/SymmetryApiWrapper.cs index 71130e8226..24d206ffbb 100644 --- a/Assets/Scripts/API/Lua/Wrappers/SymmetryApiWrapper.cs +++ b/Assets/Scripts/API/Lua/Wrappers/SymmetryApiWrapper.cs @@ -221,6 +221,16 @@ public static void AddColor(Color color) PointerManager.m_Instance.SymmetryPointerColors.Add(color); } + [LuaDocsDescription("Sets all symmetry pointer colors to a single color")] + [LuaDocsParameter("color", "The color to set")] + [LuaDocsExample("Symmetry:SetColors(Color.red)")] + public static void SetColors(Color color) + { + PointerManager.m_Instance.SymmetryPointerColors = Enumerable.Repeat( + color, PointerManager.m_Instance.SymmetryPointerColors.Count + ).ToList(); + } + [LuaDocsDescription("Sets the list of symmetry pointer colors")] [LuaDocsParameter("colors", "The list of colors to set")] [LuaDocsExample("Symmetry:SetColors({Color.red, Color.green, Color.blue})")] @@ -263,6 +273,29 @@ public static void SetBrushes(List brushes) ).Where(x => x != null).ToList(); } + [LuaDocsDescription("Sets the override color for all symmetry pointer brushes")] + [LuaDocsParameter("color", "The color to set")] + [LuaDocsExample("Symmetry:SetColorOverrides(Color.red)")] + public static void SetColorOverrides(Color color) + { + PointerManager.m_Instance.SetAllPointerColorOverrides(color); + } + + [LuaDocsDescription("Sets the override color mode for all symmetry pointer brushes")] + [LuaDocsParameter("mode", "The mode to set")] + [LuaDocsExample("Symmetry:SetColorOverrideModes(ColorOverrideMode.Blend)")] + public static void SetColorOverrideModes(ColorOverrideMode mode) + { + PointerManager.m_Instance.SetAllPointerColorOverrideModes(mode); + } + + [LuaDocsDescription("Clears the list of symmetry pointer override colors")] + [LuaDocsExample("Symmetry:ClearColorOverride()")] + public static void ClearColorOverrides() + { + PointerManager.m_Instance.ClearSymmetryPointerColorOverrides(); + } + [LuaDocsDescription("Gets the list of symmetry pointer brushes as brush names")] [LuaDocsExample("brushNames = Symmetry:GetBrushNames()")] public static List GetBrushNames() diff --git a/Assets/Scripts/AndroidMicAudioMonitor.cs b/Assets/Scripts/AndroidMicAudioMonitor.cs new file mode 100644 index 0000000000..a326bf464e --- /dev/null +++ b/Assets/Scripts/AndroidMicAudioMonitor.cs @@ -0,0 +1,173 @@ +// Copyright 2020 The Tilt 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 UnityEngine; +#if UNITY_ANDROID +using UnityEngine.Android; +#endif + +namespace TiltBrush +{ + public class AndroidMicAudioMonitor : MonoBehaviour + { + private const int kBufferSeconds = 1; + private const int kPreferredSampleRate = 48000; + + private AudioClip m_MicClip; + private float[] m_Samples; + private string m_DeviceName = ""; + private int m_SampleRate = kPreferredSampleRate; + private int m_ClipSampleCount; + private bool m_CaptureRequested; + private bool m_WaitingForPermission; + private float m_LastPeak; + + public int SampleRate { get { return m_SampleRate; } } + public bool IsCapturing { get { return m_MicClip != null && Microphone.IsRecording(m_DeviceName); } } + public float LastPeak { get { return m_LastPeak; } } + + public void Activate(bool active) + { + m_CaptureRequested = active; + if (active) + { + StartCapture(); + } + else + { + StopCapture(); + } + } + + void Update() + { + if (!m_CaptureRequested) + { + return; + } + +#if UNITY_ANDROID + if (m_WaitingForPermission) + { + if (!Permission.HasUserAuthorizedPermission(Permission.Microphone)) + { + return; + } + m_WaitingForPermission = false; + StartCapture(); + } +#endif + + if (!IsCapturing) + { + return; + } + + EnsureSampleBuffer(); + + int micPosition = Microphone.GetPosition(m_DeviceName); + if (micPosition < m_Samples.Length) + { + return; + } + + int readPosition = micPosition - m_Samples.Length; + if (readPosition < 0) + { + readPosition += m_ClipSampleCount; + } + + if (!m_MicClip.GetData(m_Samples, readPosition)) + { + return; + } + +#if UNITY_ANDROID + UpdateAndroidMicPeak(); +#endif + VisualizerManager.m_Instance.ProcessAudio(m_Samples, m_SampleRate); + } + + private void StartCapture() + { + if (IsCapturing) + { + return; + } + + EnsureSampleBuffer(); + +#if UNITY_ANDROID + if (!Permission.HasUserAuthorizedPermission(Permission.Microphone)) + { + m_WaitingForPermission = true; + Permission.RequestUserPermission(Permission.Microphone); + return; + } +#endif + + SelectDeviceAndSampleRate(); + m_MicClip = Microphone.Start(m_DeviceName, true, kBufferSeconds, m_SampleRate); + m_ClipSampleCount = m_MicClip != null ? m_MicClip.samples : 0; + } + + private void StopCapture() + { + if (Microphone.IsRecording(m_DeviceName)) + { + Microphone.End(m_DeviceName); + } + m_MicClip = null; + m_WaitingForPermission = false; + } + + private void EnsureSampleBuffer() + { + if (m_Samples == null || m_Samples.Length != VisualizerManager.m_Instance.FFTSize) + { + m_Samples = new float[VisualizerManager.m_Instance.FFTSize]; + } + } + + private void SelectDeviceAndSampleRate() + { + m_DeviceName = Microphone.devices.Length > 0 ? Microphone.devices[0] : ""; + Microphone.GetDeviceCaps(m_DeviceName, out int minFrequency, out int maxFrequency); + + if (maxFrequency <= 0) + { + m_SampleRate = kPreferredSampleRate; + } + else + { + int min = minFrequency > 0 ? minFrequency : 1; + m_SampleRate = Mathf.Clamp(kPreferredSampleRate, min, maxFrequency); + } + } + +#if UNITY_ANDROID + private void UpdateAndroidMicPeak() + { + float peak = 0.0f; + for (int i = 0; i < m_Samples.Length; ++i) + { + float sample = m_Samples[i]; + peak = Mathf.Max(peak, Mathf.Abs(sample)); + } + + m_LastPeak = peak; + } +#endif + } +} diff --git a/Assets/Scripts/AndroidMicAudioMonitor.cs.meta b/Assets/Scripts/AndroidMicAudioMonitor.cs.meta new file mode 100644 index 0000000000..06184c25ff --- /dev/null +++ b/Assets/Scripts/AndroidMicAudioMonitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f39f5a2eb87c4db9a3ee013f0ff44c61 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/App.cs b/Assets/Scripts/App.cs index a008b45bb4..1f3b6d3b52 100644 --- a/Assets/Scripts/App.cs +++ b/Assets/Scripts/App.cs @@ -2172,7 +2172,47 @@ public static void InitSavedStrokesLibraryPath(string[] defaultSavedStrokes) } } + public static void InitQuillLibraryPath() + { + string quillLibraryDirectory = QuillLibraryPath(); + + if (!Directory.Exists(quillLibraryDirectory)) + { + InitDirectoryAtPath(quillLibraryDirectory); + } + } + + public static void InitQuillImmPath() + { + string quillImmDirectory = QuillImmPath(); + + if (!Directory.Exists(quillImmDirectory)) + { + InitDirectoryAtPath(quillImmDirectory); + } + } + + + + public static bool InitSoundClipLibraryPath(string[] defaultSoundClips) + { + string soundClipsDirectory = SoundClipLibraryPath(); + if (Directory.Exists(soundClipsDirectory)) + { + return true; + } + if (!InitDirectoryAtPath(soundClipsDirectory)) + { + return false; + } + foreach (var soundClip in defaultSoundClips) + { + string destFilename = Path.GetFileName(soundClip); + FileUtils.WriteBytesFromResources(soundClip, Path.Combine(soundClipsDirectory, destFilename)); + } + return true; + } public static string FeaturedSketchesPath() { @@ -2207,6 +2247,11 @@ public static string VideoLibraryPath() return Path.Combine(MediaLibraryPath(), "Videos"); } + public static string SoundClipLibraryPath() + { + return Path.Combine(MediaLibraryPath(), "Sound Clips"); + } + public static string BackgroundImagesLibraryPath() { return Path.Combine(MediaLibraryPath(), "BackgroundImages"); @@ -2222,6 +2267,17 @@ static public string SavedStrokesPath() return Path.Combine(MediaLibraryPath(), "Saved Strokes"); } + static public string QuillLibraryPath() + { + return Path.Combine(System.Environment.GetFolderPath( + System.Environment.SpecialFolder.Personal), "Quill"); + } + + static public string QuillImmPath() + { + return Path.Combine(MediaLibraryPath(), "Imm"); + } + static public string AutosavePath() { return Path.Combine(UserPath(), "Sketches/Autosave"); diff --git a/Assets/Scripts/AppAudioMonitor.cs b/Assets/Scripts/AppAudioMonitor.cs index a7dee44c44..c6fc5d2bd7 100644 --- a/Assets/Scripts/AppAudioMonitor.cs +++ b/Assets/Scripts/AppAudioMonitor.cs @@ -20,6 +20,9 @@ namespace TiltBrush public class AppAudioMonitor : MonoBehaviour { private float[] m_WaveformFloats; + private float m_LastPeak; + + public float LastPeak { get { return m_LastPeak; } } void Start() { @@ -29,8 +32,25 @@ void Start() void Update() { AudioListener.GetOutputData(m_WaveformFloats, 0); +#if UNITY_ANDROID + UpdateAndroidAudioPeak(); +#endif VisualizerManager.m_Instance.ProcessAudio(m_WaveformFloats, AudioSettings.outputSampleRate); } + +#if UNITY_ANDROID + private void UpdateAndroidAudioPeak() + { + float peak = 0.0f; + for (int i = 0; i < m_WaveformFloats.Length; ++i) + { + float sample = m_WaveformFloats[i]; + peak = Mathf.Max(peak, Mathf.Abs(sample)); + } + + m_LastPeak = peak; + } +#endif } } diff --git a/Assets/Scripts/AudioCaptureManager.cs b/Assets/Scripts/AudioCaptureManager.cs index 7c06885904..15716b674a 100644 --- a/Assets/Scripts/AudioCaptureManager.cs +++ b/Assets/Scripts/AudioCaptureManager.cs @@ -43,6 +43,11 @@ namespace TiltBrush public class AudioCaptureManager : MonoBehaviour { +#if UNITY_ANDROID + private const float kAndroidSourceProbeSeconds = 6.0f; + private const float kAndroidSignalThreshold = 0.0001f; +#endif + // Number of seconds to delay before searching for active audio device. // From experimentation this seems to be the minimum to ensure we don't pick up // any residual audio. @@ -53,6 +58,7 @@ private enum AudioCaptureType File, System, App, + Mic, Script } @@ -63,10 +69,16 @@ private enum AudioCaptureType [SerializeField] private GameObject m_AppAudio; private AudioCaptureType m_Type; + private AndroidMicAudioMonitor m_MicAudio; private int m_CaptureRequestedCount; +#if UNITY_ANDROID + private float m_AndroidSourceProbeStartTime; +#endif void Awake() { + m_Instance = this; + EnsureMicAudioMonitor(); ResetAudioCaptureType(); } @@ -74,7 +86,13 @@ private void ResetAudioCaptureType() { m_Instance = this; if (LuaManager.Instance != null) LuaManager.Instance.VisualizerScriptingEnabled = false; -#if UNITY_ANDROID || UNITY_IOS +#if UNITY_ANDROID + StopAndroidCaptureSources(); +#endif +#if UNITY_ANDROID + // Probe Android sources in order: app audio, then mic. + m_Type = AudioCaptureType.App; +#elif UNITY_IOS m_Type = AudioCaptureType.App; #else m_Type = AudioCaptureType.System; @@ -83,6 +101,19 @@ private void ResetAudioCaptureType() } + private void EnsureMicAudioMonitor() + { + if (m_MicAudio != null) + { + return; + } + + var micAudio = new GameObject("AndroidMicAudio"); + micAudio.transform.SetParent(transform, false); + micAudio.SetActive(true); + m_MicAudio = micAudio.AddComponent(); + } + public bool CaptureRequested { get { return m_CaptureRequestedCount > 0; } @@ -92,6 +123,7 @@ public void EnableScripting() { m_FileAudio.SetActive(false); m_AppAudio.SetActive(false); + m_MicAudio.Activate(false); m_SystemAudio.gameObject.SetActive(false); m_Type = AudioCaptureType.Script; LuaManager.Instance.VisualizerScriptingEnabled = true; @@ -110,6 +142,7 @@ public void EnableAudioFileSource(bool enable, string path) { LuaManager.Instance.VisualizerScriptingEnabled = false; m_AppAudio.SetActive(false); + m_MicAudio.Activate(false); m_SystemAudio.Deactivate(); m_SystemAudio.gameObject.SetActive(false); m_Type = AudioCaptureType.File; @@ -154,6 +187,8 @@ public int SampleRate return m_SystemAudio.GetAudioDeviceSampleRate(); case AudioCaptureType.App: return AudioSettings.outputSampleRate; + case AudioCaptureType.Mic: + return m_MicAudio.SampleRate; case AudioCaptureType.Script: return LuaManager.Instance.ScriptedWaveformSampleRate; } @@ -173,6 +208,8 @@ public bool IsCapturingAudio return m_SystemAudio.gameObject.activeSelf && m_SystemAudio.AudioDeviceSelected(); case AudioCaptureType.App: return m_AppAudio.activeSelf; + case AudioCaptureType.Mic: + return m_MicAudio.IsCapturing; case AudioCaptureType.Script: return LuaManager.Instance.VisualizerScriptingEnabled; } @@ -184,9 +221,10 @@ public string GetCaptureStatusMessage() { switch (m_Type) { - case AudioCaptureType.File: return "Listening to Mic'"; + case AudioCaptureType.File: return "Listening to audio file"; case AudioCaptureType.System: return m_SystemAudio.GetCaptureStatusMessage(); - case AudioCaptureType.App: return "Jammin'"; + case AudioCaptureType.App: return "Listening to app audio"; + case AudioCaptureType.Mic: return "Listening to microphone"; case AudioCaptureType.Script: return "Scripted Waveform"; } return ""; @@ -224,11 +262,76 @@ public void CaptureAudio(bool bCapture) } break; case AudioCaptureType.App: - m_AppAudio.SetActive(bCapture); + bool appAudioWasActive = m_AppAudio.activeSelf; + m_AppAudio.SetActive(CaptureRequested); + if (appAudioWasActive != m_AppAudio.activeSelf) + { + VisualizerManager.m_Instance.AudioCaptureStatusChange(m_AppAudio.activeSelf); + } + break; + case AudioCaptureType.Mic: + m_MicAudio.Activate(CaptureRequested); + VisualizerManager.m_Instance.AudioCaptureStatusChange(CaptureRequested); break; case AudioCaptureType.Script: break; } } + +#if UNITY_ANDROID + void Update() + { + if (!CaptureRequested) + { + return; + } + + if (m_Type == AudioCaptureType.App) + { + var appMonitor = m_AppAudio.GetComponent(); + if (appMonitor != null && appMonitor.LastPeak > kAndroidSignalThreshold) + { + return; + } + if (Time.unscaledTime - m_AndroidSourceProbeStartTime > kAndroidSourceProbeSeconds) + { + SwitchAndroidCaptureSource(AudioCaptureType.Mic); + } + } + } + + private void SwitchAndroidCaptureSource(AudioCaptureType nextType) + { + StopAndroidCaptureSources(); + + m_Type = nextType; + ResetAndroidSourceProbeTimer(); + + if (m_Type == AudioCaptureType.App) + { + m_AppAudio.SetActive(true); + VisualizerManager.m_Instance.AudioCaptureStatusChange(true); + } + else if (m_Type == AudioCaptureType.Mic) + { + m_MicAudio.Activate(true); + VisualizerManager.m_Instance.AudioCaptureStatusChange(true); + } + } + + private void StopAndroidCaptureSources() + { + m_AppAudio.SetActive(false); + m_MicAudio.Activate(false); + } + + private void ResetAndroidSourceProbeTimer() + { + m_AndroidSourceProbeStartTime = Time.unscaledTime; + } + +#else + private void ResetAndroidSourceProbeTimer() { } +#endif } } diff --git a/Assets/Scripts/Brushes/BaseBrushScript.cs b/Assets/Scripts/Brushes/BaseBrushScript.cs index c66c79488f..56cc6cdf97 100644 --- a/Assets/Scripts/Brushes/BaseBrushScript.cs +++ b/Assets/Scripts/Brushes/BaseBrushScript.cs @@ -109,6 +109,8 @@ public static float GetStrokeCost(BrushDescriptor desc, int verts, float size) protected Vector3 m_LastSpawnPos { get { return m_LastSpawnXf.translation; } } protected float m_BaseSize_PS; protected StatelessRng m_rng; + // Reference to stroke data for accessing per-point colors during geometry generation + protected StrokeData m_StrokeData; protected BaseBrushScript(bool bCanBatch) { @@ -144,6 +146,12 @@ public float BaseSize_PS set { m_BaseSize_PS = value; } } + /// Provides access to the stroke data including per-point colors + public StrokeData StrokeData + { + get { return m_StrokeData; } + } + /// The size of the brush, in the parent-local (Canvas) coordinate system public float BaseSize_LS { @@ -190,6 +198,12 @@ public int RandomSeed /// This should only be used during initialization. public void SetPreviewMode() { m_PreviewMode = true; } + /// Set stroke data reference for per-point color access during geometry generation + public void SetStrokeData(StrokeData strokeData) + { + m_StrokeData = strokeData; + } + /// Returns an object that implements the Undo animation public GameObject CloneAsUndoObject() { @@ -205,11 +219,11 @@ public GameObject CloneAsUndoObject() /// Returns true if permanent geometry was generated. /// Transform should be in the local coordinates of the stroke - public bool UpdatePosition_LS(TrTransform xf, float fPressure) + public bool UpdatePosition_LS(TrTransform xf, float fPressure, Color32? color = null) { if (IsOutOfVerts()) { return false; } - bool ret = UpdatePositionImpl(xf.translation, xf.rotation, fPressure); + bool ret = UpdatePositionImpl(xf.translation, xf.rotation, fPressure, color); if (ret) { m_LastSpawnXf = xf; @@ -316,7 +330,7 @@ public virtual bool NeedsStraightEdgeProxy() // Return true if a new solid was created. protected abstract bool UpdatePositionImpl( Vector3 vPos, Quaternion ori, - float fPressure); + float fPressure, Color32? color = null); // This function is a sanity check for making sure we don't overrun our allocated vertex buffers // when creating new geometry. It is used at low levels as a safeguard. diff --git a/Assets/Scripts/Brushes/BlocksBrushScript.cs b/Assets/Scripts/Brushes/BlocksBrushScript.cs index 4b03c69703..ebd47c2dc7 100644 --- a/Assets/Scripts/Brushes/BlocksBrushScript.cs +++ b/Assets/Scripts/Brushes/BlocksBrushScript.cs @@ -43,7 +43,7 @@ public override GeometryPool.VertexLayout GetVertexLayout(BrushDescriptor desc) // -------------------------------------------------------------------------------------------- // // This is OK because this isn't a real brush, yet required because these functions are abstract. // - override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure) + override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure, Color32? color = null) { return true; } diff --git a/Assets/Scripts/Brushes/ConcaveHullBrush.cs b/Assets/Scripts/Brushes/ConcaveHullBrush.cs index 1b1c68c1f1..604114f0d8 100644 --- a/Assets/Scripts/Brushes/ConcaveHullBrush.cs +++ b/Assets/Scripts/Brushes/ConcaveHullBrush.cs @@ -455,7 +455,8 @@ void AppendVert(ref Knot k, Vector3 v, Vector3 n) } m_geometry.m_Vertices.Add(v); m_geometry.m_Normals.Add(n); - m_geometry.m_Colors.Add(m_Color); + Color32 color = k.color; + m_geometry.m_Colors.Add(color); k.nVert += 1; if (m_bDoubleSided) { @@ -463,7 +464,7 @@ void AppendVert(ref Knot k, Vector3 v, Vector3 n) m_geometry.m_Normals.Add(-n); // TODO: backface is a different color for visualization reasons // Probably better to use a non-culling shader instead of doubling the geo. - m_geometry.m_Colors.Add(m_Color); + m_geometry.m_Colors.Add(color); k.nVert += 1; } } diff --git a/Assets/Scripts/Brushes/EnvironmentBrushScript.cs b/Assets/Scripts/Brushes/EnvironmentBrushScript.cs index 10f2f1e23b..1af60f8c03 100644 --- a/Assets/Scripts/Brushes/EnvironmentBrushScript.cs +++ b/Assets/Scripts/Brushes/EnvironmentBrushScript.cs @@ -52,7 +52,7 @@ public override GeometryPool.VertexLayout GetVertexLayout(BrushDescriptor desc) // -------------------------------------------------------------------------------------------- // // This is OK because this isn't a real brush, yet required because these functions are abstract. // - override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure) + override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure, Color32? color = null) { return true; } diff --git a/Assets/Scripts/Brushes/FlatGeometryBrush.cs b/Assets/Scripts/Brushes/FlatGeometryBrush.cs index 00fb4ab7cf..0d0c52e915 100644 --- a/Assets/Scripts/Brushes/FlatGeometryBrush.cs +++ b/Assets/Scripts/Brushes/FlatGeometryBrush.cs @@ -39,7 +39,6 @@ protected enum UVStyle protected List m_sizes; - const float kSolidMinLengthMeters_PS = 0.002f; const float kMinMoveLengthMeters_PS = 5e-4f; const float kBreakAngleScalar = 2.0f; const float kSolidAspectRatio = 0.2f; @@ -47,6 +46,29 @@ protected enum UVStyle [SerializeField] protected UVStyle m_uvStyle = UVStyle.Distance; [SerializeField] protected bool m_bOffsetInTexcoord1; + [SerializeField] protected bool m_DisableWidthSmoothing; + [SerializeField] protected bool m_ForceAllKnots; + + protected override bool ForceAllKnots + { + get { return m_ForceAllKnots; } + } + + protected virtual void ComputeSurfaceFrame( + Vector3 preferredRight, + Vector3 nTangent, + Quaternion brushOrientation, + out Vector3 nRight, + out Vector3 nSurface) + { + ComputeSurfaceFrameNew( + preferredRight, nTangent, brushOrientation, out nRight, out nSurface); + } + + protected virtual float GetVertexAlpha(Knot knot) + { + return PressuredOpacity(knot.smoothedPressure); + } public FlatGeometryBrush() : base(bCanBatch: true, @@ -86,7 +108,7 @@ override public GeometryPool.VertexLayout GetVertexLayout(BrushDescriptor desc) override public float GetSpawnInterval(float pressure01) { - return kSolidMinLengthMeters_PS * POINTER_TO_LOCAL * App.METERS_TO_UNITS + + return m_Desc.m_SolidMinLengthMeters_PS * POINTER_TO_LOCAL * App.METERS_TO_UNITS + (PressuredSize(pressure01) * kSolidAspectRatio); } @@ -183,6 +205,7 @@ void OnChanged_FrameKnots(int iKnot0) Knot cur = m_knots[iKnot]; bool shouldBreak = false; + bool forceAllKnots = ForceAllKnots; Vector3 vMove = cur.point.m_Pos - prev.point.m_Pos; cur.length = vMove.magnitude; @@ -190,21 +213,51 @@ void OnChanged_FrameKnots(int iKnot0) // Rather than use unstable math, just bail and don't change the geometry. if (cur.length < minMove) { - shouldBreak = true; + if (!forceAllKnots) + { + shouldBreak = true; + } } // invariant: nSurface = nMove x nRight // If single-sided, always point the frontside towards the brush. Causes twisting. - Vector3 nTangent = vMove / cur.length; + Vector3 nTangent; + if (cur.length < minMove && forceAllKnots) + { + // Fall back to previous motion or orientation to avoid a zero-length tangent. + Vector3 fallback = Vector3.zero; + if (iKnot >= 2) + { + Vector3 prevMove = prev.point.m_Pos - m_knots[iKnot - 2].point.m_Pos; + if (prevMove.sqrMagnitude > 1e-8f) + { + fallback = prevMove.normalized; + } + } + if (fallback == Vector3.zero) + { + fallback = prev.point.m_Orient * Vector3.forward; + } + nTangent = fallback; + } + else + { + nTangent = vMove / cur.length; + } if (!m_bM11Compatibility && iKnot < m_knots.Count - 1) { // Calculate a smoother tangent. // TODO: Look into whether we should do something more accurate with the tangent // like a cubic spline. Knot next = m_knots[iKnot + 1]; - nTangent = (next.point.m_Pos - prev.point.m_Pos).normalized; + Vector3 smoothTangent = next.point.m_Pos - prev.point.m_Pos; + if (smoothTangent.sqrMagnitude > 1e-8f) + { + nTangent = smoothTangent.normalized; + } - if (Vector3.Dot(vMove, next.point.m_Pos - cur.point.m_Pos) < 0) + if (!forceAllKnots && + Vector3.Dot(vMove, next.point.m_Pos - cur.point.m_Pos) < 0) { shouldBreak = true; } @@ -212,12 +265,12 @@ void OnChanged_FrameKnots(int iKnot0) Vector3 vPreferredRight = m_Desc.m_BackIsInvisible ? Vector3.Cross(cur.point.m_Orient * Vector3.forward, nTangent) : prev.nRight; - ComputeSurfaceFrameNew( + ComputeSurfaceFrame( vPreferredRight, nTangent, cur.point.m_Orient, out cur.nRight, out cur.nSurface); // More break checking; replicates previous logic - if (m_bM11Compatibility && prev.HasGeometry) + if (m_bM11Compatibility && prev.HasGeometry && !forceAllKnots) { float fWidthHeightRatio = cur.length / PressuredSize(cur.smoothedPressure); float fBreakAngle = Mathf.Atan(fWidthHeightRatio) * Mathf.Rad2Deg * kBreakAngleScalar; @@ -286,10 +339,10 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) { // Can't use prev.nRight, prev.nSurface; they're invalid if no geometry float size = PressuredSize(prev.smoothedPressure); - float alpha = PressuredOpacity(prev.smoothedPressure); + float alpha = GetVertexAlpha(prev); Vector3 halfRight = cur.nRight * (size / 2); - SetVert(cur.iVert, BR, prev.point.m_Pos + halfRight, cur.nSurface, m_Color, alpha); - SetVert(cur.iVert, BL, prev.point.m_Pos - halfRight, cur.nSurface, m_Color, alpha); + SetVert(cur.iVert, BR, prev.point.m_Pos + halfRight, cur.nSurface, prev.color, alpha); + SetVert(cur.iVert, BL, prev.point.m_Pos - halfRight, cur.nSurface, prev.color, alpha); if (m_bOffsetInTexcoord1) { SetUv1(cur.iVert, BR, halfRight); @@ -298,13 +351,13 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) sizePrev = m_sizes[iKnot - 1] = size; } - if (m_bM11Compatibility) + if (m_bM11Compatibility || m_DisableWidthSmoothing) { float size = PressuredSize(cur.smoothedPressure); - float alpha = PressuredOpacity(cur.smoothedPressure); + float alpha = GetVertexAlpha(cur); Vector3 halfRight = cur.nRight * (size / 2); - SetVert(cur.iVert, FR, cur.point.m_Pos + halfRight, cur.nSurface, m_Color, alpha); - SetVert(cur.iVert, FL, cur.point.m_Pos - halfRight, cur.nSurface, m_Color, alpha); + SetVert(cur.iVert, FR, cur.point.m_Pos + halfRight, cur.nSurface, cur.color, alpha); + SetVert(cur.iVert, FL, cur.point.m_Pos - halfRight, cur.nSurface, cur.color, alpha); if (m_bOffsetInTexcoord1) { SetUv1(cur.iVert, FR, halfRight); @@ -352,7 +405,7 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) prev = cur; } - if (!m_bM11Compatibility) + if (!m_bM11Compatibility && !m_DisableWidthSmoothing) { // Run through the knots again to set the vertices based on the original knots and the // resulting size array. @@ -376,7 +429,7 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) if (cur.HasGeometry) { - float alpha = PressuredOpacity(cur.smoothedPressure); + float alpha = GetVertexAlpha(cur); Vector3 surface = cur.nSurface; Vector3 knotPoint = 0.3f * knotPointPrev + 0.4f * knotPointCur + 0.3f * knotPointNext; Vector3 halfRight = 0.3f * halfRightPrev + 0.4f * halfRightCur + 0.3f * halfRightNext; @@ -386,8 +439,8 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) { halfRight = halfRightCur; } - SetVert(cur.iVert, FL, knotPoint - halfRight, surface, m_Color, alpha); - SetVert(cur.iVert, FR, knotPoint + halfRight, surface, m_Color, alpha); + SetVert(cur.iVert, FL, knotPoint - halfRight, surface, cur.color, alpha); + SetVert(cur.iVert, FR, knotPoint + halfRight, surface, cur.color, alpha); if (m_bOffsetInTexcoord1) { SetUv1(cur.iVert, FR, halfRightCur); diff --git a/Assets/Scripts/Brushes/GeniusParticlesBrush.cs b/Assets/Scripts/Brushes/GeniusParticlesBrush.cs index 66a994ed34..70224b6005 100644 --- a/Assets/Scripts/Brushes/GeniusParticlesBrush.cs +++ b/Assets/Scripts/Brushes/GeniusParticlesBrush.cs @@ -170,9 +170,9 @@ public override void DecayBrush() /// Bit naughty, but I'm back to overriding UpdatePositionImpl. I think in this case it's /// acceptable as it is simply wrapping the call so that we can trap the cursor position to /// work out how far the pointer has traveled. - protected override bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pressure) + protected override bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pressure, Color32? color = null) { - bool result = base.UpdatePositionImpl(pos, ori, pressure); + bool result = base.UpdatePositionImpl(pos, ori, pressure, color); if (m_DistancePointerTravelled < 0f) { m_DistancePointerTravelled = 0f; @@ -405,10 +405,11 @@ private void CreateParticleGeometry(int knotIndex, int particleIndex, Vector3 po SetTri(triIndex, vertIndex, 0, kBr, kBl, kFl); SetTri(triIndex, vertIndex, 1, kBr, kFl, kFr); - SetVert(vertIndex, kBr, center - upOffset + rightOffset, center, m_Color, alpha); - SetVert(vertIndex, kBl, center - upOffset - rightOffset, center, m_Color, alpha); - SetVert(vertIndex, kFr, center + upOffset + rightOffset, center, m_Color, alpha); - SetVert(vertIndex, kFl, center + upOffset - rightOffset, center, m_Color, alpha); + Color32 color = cur.color; + SetVert(vertIndex, kBr, center - upOffset + rightOffset, center, color, alpha); + SetVert(vertIndex, kBl, center - upOffset - rightOffset, center, color, alpha); + SetVert(vertIndex, kFr, center + upOffset + rightOffset, center, color, alpha); + SetVert(vertIndex, kFl, center + upOffset - rightOffset, center, color, alpha); // When a stroke is loaded from a .tilt, m_TimestampMs is _not_ initialized from the // timestamp in the Stroke. Therefore we don't have to worry about it being in the future diff --git a/Assets/Scripts/Brushes/GeometryBrush.cs b/Assets/Scripts/Brushes/GeometryBrush.cs index d5aca8c86e..f7c5ff75d5 100644 --- a/Assets/Scripts/Brushes/GeometryBrush.cs +++ b/Assets/Scripts/Brushes/GeometryBrush.cs @@ -20,6 +20,10 @@ namespace TiltBrush public abstract class GeometryBrush : BaseBrushScript { + protected virtual bool ForceAllKnots + { + get { return false; } + } // TODO: change to class? public struct Knot { @@ -31,6 +35,9 @@ public struct Knot /// Constant, associated with this knot public float smoothedPressure; + /// Color for this knot (from per-point colors or base color) + public Color32 color; + /// Distance from previous knot to this knot, or 0 (if first). /// Mutated during geometry generation. public float length; @@ -108,6 +115,10 @@ public struct Knot protected bool m_bDoubleSided; protected readonly bool m_bSmoothPositions; + protected virtual bool SmoothPositions + { + get { return m_bSmoothPositions; } + } protected bool m_bM11Compatibility; @@ -302,7 +313,8 @@ override public void ResetBrushForPreview(TrTransform localPointerXf) m_Pressure = 1 }, length = 0, - smoothedPos = pos + smoothedPos = pos, + color = m_Color }; m_knots.Add(knot); m_knots.Add(knot); @@ -347,7 +359,8 @@ protected override void InitBrush(BrushDescriptor desc, TrTransform localPointer m_Pressure = 1 }, length = 0, - smoothedPos = pos + smoothedPos = pos, + color = m_Color }; m_knots.Add(knot); m_knots.Add(knot); @@ -429,7 +442,7 @@ override protected void InitUndoClone(GameObject clone) rMeshScript.Init(); } - override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pressure) + override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pressure, Color32? color = null) { Debug.Assert(m_knots.Count >= 2); @@ -441,6 +454,12 @@ override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pr updated.point.m_Pressure = pressure; updated.point.m_TimestampMs = (uint)(App.Instance.CurrentSketchTime * 1000); updated.smoothedPos = pos; + + // Use passed color if available, otherwise fall back to stroke data or base color + if (color.HasValue) + { + updated.color = color.Value; + } if (iUpdate < 2) { // Retroactively update the 0th knot with better pressure data. @@ -450,7 +469,7 @@ override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pr initialKnot.smoothedPressure = initialPressure; m_knots[0] = initialKnot; } - else if (m_bSmoothPositions) + else if (SmoothPositions) { Knot middle = m_knots[iUpdate - 1]; Vector3 v0 = m_knots[iUpdate - 2].point.m_Pos; @@ -459,7 +478,7 @@ override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pr middle.smoothedPos = (v0 + 2 * v1 + v2) / 4; m_knots[iUpdate - 1] = middle; } - if (m_bSmoothPositions) + if (SmoothPositions) { ApplySmoothing(m_knots[iUpdate - 1], ref updated); } @@ -479,7 +498,7 @@ override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pr } float lastLength = DistanceFromKnot(iUpdate - 1, updated.point.m_Pos); - bool keep = (lastLength > GetSpawnInterval(updated.smoothedPressure)); + bool keep = ForceAllKnots || (lastLength > GetSpawnInterval(updated.smoothedPressure)); // TODO: change this to the way PointerScript keeps control points if (keep) @@ -489,6 +508,7 @@ override protected bool UpdatePositionImpl(Vector3 pos, Quaternion ori, float pr dupe.nVert = 0; dupe.iTri = updated.iTri + updated.nTri; dupe.nTri = 0; + dupe.color = color ?? m_Color; m_knots.Add(dupe); } return keep; diff --git a/Assets/Scripts/Brushes/HullBrush.cs b/Assets/Scripts/Brushes/HullBrush.cs index a1a69a2805..1cf495422a 100644 --- a/Assets/Scripts/Brushes/HullBrush.cs +++ b/Assets/Scripts/Brushes/HullBrush.cs @@ -52,6 +52,7 @@ public class Vertex : IVertex /// Temporary storage; only used during geometry creation public int TempIndex { get; set; } public Vector3 TempNormal { get; set; } + public Color32 TempColor { get; set; } public Vertex() { @@ -248,6 +249,7 @@ void CreateVerticesFromKnots(int iKnot0) for (int iKnot = iKnot0; iKnot < m_knots.Count; ++iKnot) { m_AllVertices[iKnot].SetData(m_knots[iKnot].point.m_Pos); + m_AllVertices[iKnot].TempColor = m_knots[iKnot].color; } break; @@ -264,10 +266,15 @@ void CreateVerticesFromKnots(int iKnot0) { Vector3 p = m_knots[iKnot].point.m_Pos; int iv0 = iKnot * verticesPerKnot; + Color32 knotColor = m_knots[iKnot].color; m_AllVertices[iv0 + 0].SetData(p + new Vector3(-hw, -hw, -hw)); + m_AllVertices[iv0 + 0].TempColor = knotColor; m_AllVertices[iv0 + 1].SetData(p + new Vector3(+hw, +hw, -hw)); + m_AllVertices[iv0 + 1].TempColor = knotColor; m_AllVertices[iv0 + 2].SetData(p + new Vector3(+hw, -hw, +hw)); + m_AllVertices[iv0 + 2].TempColor = knotColor; m_AllVertices[iv0 + 3].SetData(p + new Vector3(-hw, +hw, +hw)); + m_AllVertices[iv0 + 3].TempColor = knotColor; } break; } @@ -291,12 +298,14 @@ void CreateVerticesFromKnots(int iKnot0) for (int iKnot = iKnot0; iKnot < m_knots.Count; ++iKnot) { Vector3 center = m_knots[iKnot].point.m_Pos; + Color32 knotColor = m_knots[iKnot].color; if (iKnot == 0) { // For indexing simplicity, put 'em all in the same place for (int i = 0; i < verticesPerKnot; ++i) { m_AllVertices[i].SetData(center); + m_AllVertices[i].TempColor = knotColor; } } else @@ -311,6 +320,7 @@ void CreateVerticesFromKnots(int iKnot0) // One point at the tip m_AllVertices[iv0 + 0].SetData(center + p); + m_AllVertices[iv0 + 0].TempColor = knotColor; // And rings of points around that tip. // phi is the angle with dir; theta is the angle around the ring. @@ -324,6 +334,7 @@ void CreateVerticesFromKnots(int iKnot0) for (int i = 0; i < kDirectedSphereRingPoints; ++i) { m_AllVertices[iv0 + 1 + iRing * kDirectedSphereRingPoints + i].SetData(center + p); + m_AllVertices[iv0 + 1 + iRing * kDirectedSphereRingPoints + i].TempColor = knotColor; p = qTheta * p; } } @@ -499,7 +510,7 @@ void CreateFacetedGeometry(ref Knot knot, ConvexHull hull) Vector3 normal = AsVector3(face.Normal); foreach (var vertex in face.Vertices) { - AppendVert(ref knot, AsVector3(vertex.Position), normal); + AppendVert(ref knot, AsVector3(vertex.Position), normal, vertex.TempColor); } // Tesselate the polygon into a fan @@ -548,7 +559,7 @@ void CreateSmoothGeometry(ref Knot knot, ConvexHull hull) foreach (var vertex in hull.Points) { - AppendVert(ref knot, AsVector3(vertex.Position), vertex.TempNormal.normalized); + AppendVert(ref knot, AsVector3(vertex.Position), vertex.TempNormal.normalized, vertex.TempColor); } } @@ -564,13 +575,13 @@ override public GeometryPool.VertexLayout GetVertexLayout(BrushDescriptor desc) }; } - void AppendVert(ref Knot k, Vector3 v, Vector3 n) + void AppendVert(ref Knot k, Vector3 v, Vector3 n, Color32 color) { Debug.Assert(k.iVert + k.nVert == m_geometry.m_Vertices.Count); Vector3 uv = new Vector3(0, 0, m_BaseSize_PS); m_geometry.m_Vertices.Add(v); m_geometry.m_Normals.Add(n); - m_geometry.m_Colors.Add(m_Color); + m_geometry.m_Colors.Add(color); m_geometry.m_Texcoord0.v3.Add(uv); k.nVert += 1; if (m_bDoubleSided) @@ -579,7 +590,7 @@ void AppendVert(ref Knot k, Vector3 v, Vector3 n) m_geometry.m_Normals.Add(-n); // TODO: backface is a different color for visualization reasons // Probably better to use a non-culling shader instead of doubling the geo. - m_geometry.m_Colors.Add(m_Color); + m_geometry.m_Colors.Add(color); m_geometry.m_Texcoord0.v3.Add(uv); k.nVert += 1; } diff --git a/Assets/Scripts/Brushes/MidpointPlusLifetimeSprayBrush.cs b/Assets/Scripts/Brushes/MidpointPlusLifetimeSprayBrush.cs index c9f1742ed3..90ca54c2c7 100644 --- a/Assets/Scripts/Brushes/MidpointPlusLifetimeSprayBrush.cs +++ b/Assets/Scripts/Brushes/MidpointPlusLifetimeSprayBrush.cs @@ -180,22 +180,23 @@ void OnChanged_MakeGeometry(int iKnot0) : (float)App.Instance.SketchTimeToLevelLoadTime(cur.point.m_TimestampMs * .001); Vector4 x; Vector3 tmp; - SetVert(iVertIndex, BR, vCenter - vForwardOffset + vRightOffset, cur.nSurface, m_Color, alpha); + Color32 color = cur.color; + SetVert(iVertIndex, BR, vCenter - vForwardOffset + vRightOffset, cur.nSurface, color, alpha); tmp = -vForwardOffset + vRightOffset; x = new Vector4(tmp.x, tmp.y, tmp.z, knotCreationTimeSinceLevelLoad); SetUv1(iVertIndex, BR, x); - SetVert(iVertIndex, BL, vCenter - vForwardOffset - vRightOffset, cur.nSurface, m_Color, alpha); + SetVert(iVertIndex, BL, vCenter - vForwardOffset - vRightOffset, cur.nSurface, color, alpha); tmp = -vForwardOffset - vRightOffset; x = new Vector4(tmp.x, tmp.y, tmp.z, knotCreationTimeSinceLevelLoad); SetUv1(iVertIndex, BL, x); - SetVert(iVertIndex, FR, vCenter + vForwardOffset + vRightOffset, cur.nSurface, m_Color, alpha); + SetVert(iVertIndex, FR, vCenter + vForwardOffset + vRightOffset, cur.nSurface, color, alpha); tmp = vForwardOffset + vRightOffset; x = new Vector4(tmp.x, tmp.y, tmp.z, knotCreationTimeSinceLevelLoad); SetUv1(iVertIndex, FR, x); - SetVert(iVertIndex, FL, vCenter + vForwardOffset - vRightOffset, cur.nSurface, m_Color, alpha); + SetVert(iVertIndex, FL, vCenter + vForwardOffset - vRightOffset, cur.nSurface, color, alpha); tmp = vForwardOffset - vRightOffset; x = new Vector4(tmp.x, tmp.y, tmp.z, knotCreationTimeSinceLevelLoad); SetUv1(iVertIndex, FL, x); diff --git a/Assets/Scripts/Brushes/ParentBrush.cs b/Assets/Scripts/Brushes/ParentBrush.cs index 1e5c0e4d6d..edc8a2152b 100644 --- a/Assets/Scripts/Brushes/ParentBrush.cs +++ b/Assets/Scripts/Brushes/ParentBrush.cs @@ -347,7 +347,7 @@ void OnDestroy() // protected override bool UpdatePositionImpl( - Vector3 translation, Quaternion rotation, float pressure) + Vector3 translation, Quaternion rotation, float pressure, Color32? color = null) { TrTransform parentXf = TrTransform.TR(translation, rotation); @@ -375,7 +375,7 @@ protected override bool UpdatePositionImpl( { PbChild child = m_children[i]; var childXf = child.CalculateChildXfFixedScale(m_knots); - if (child.m_brush.UpdatePosition_LS(childXf, pressure)) + if (child.m_brush.UpdatePosition_LS(childXf, pressure, color)) { // Need to save off any control point which is applicable to any of our children. // This does mean that if we have a giant tree of children, we might be saving diff --git a/Assets/Scripts/Brushes/PbrBrushScript.cs b/Assets/Scripts/Brushes/PbrBrushScript.cs index c3aef362cc..e728876fc7 100644 --- a/Assets/Scripts/Brushes/PbrBrushScript.cs +++ b/Assets/Scripts/Brushes/PbrBrushScript.cs @@ -43,7 +43,7 @@ public override GeometryPool.VertexLayout GetVertexLayout(BrushDescriptor desc) // -------------------------------------------------------------------------------------------- // // This is OK because this isn't a real brush, yet required because these functions are abstract. // - override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure) + override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure, Color32? color = null) { return true; } diff --git a/Assets/Scripts/Brushes/QuadStripBrush.cs b/Assets/Scripts/Brushes/QuadStripBrush.cs index 0655d17739..4c8c41fc2c 100644 --- a/Assets/Scripts/Brushes/QuadStripBrush.cs +++ b/Assets/Scripts/Brushes/QuadStripBrush.cs @@ -458,6 +458,7 @@ private void AppendLeadingQuad( bool bGenerateNew, float opacity01, Vector3 vCenter, Vector3 vForward, Vector3 vNormal, Vector3 vRight, MasterBrush rMasterBrush, + Color32? cpColor, out int earliestChangedQuad) { // Get the current stroke from the MasterBrush so that quad positions and @@ -477,7 +478,7 @@ private void AppendLeadingQuad( earliestChangedQuad = m_LeadingQuadIndex; - Color32 cColor = m_Color; + Color32 cColor = cpColor ?? m_Color; cColor.a = (byte)(opacity01 * 255.0f); Color32 cLastColor = (iVertIndex - stride >= 0) ? aColors[iVertIndex - stride + 4] : cColor; @@ -504,9 +505,11 @@ private void AppendLeadingQuad( } else { - HSLColor hsl = (HSLColor)(Color)m_Color; + Color32 currentColor = cpColor ?? m_Color; + HSLColor hsl = (HSLColor)(Color)currentColor; hsl.HueDegrees += m_Desc.m_BackfaceHueShift; backColor = (Color32)(Color)hsl; + backColor.a = (byte)(opacity01 * 255.0f); lastBackColor = (iCurrVertIndex - stride >= 0) ? aColors[iCurrVertIndex - stride + 4] : backColor; @@ -717,7 +720,7 @@ override public void ApplyChangesToVisuals() } override protected bool UpdatePositionImpl( - Vector3 vPos, Quaternion ori, float fPressure) + Vector3 vPos, Quaternion ori, float fPressure, Color32? color = null) { UnityEngine.Profiling.Profiler.BeginSample("QuadStripBrush.UpdatePositionImpl"); var rMasterBrush = m_Geometry; @@ -819,7 +822,7 @@ override protected bool UpdatePositionImpl( int earliestQuad; AppendLeadingQuad(bGenerateNewQuad, PressuredOpacity(fSmoothedPressure), vQuadCenter, vQuadForward, vSurfaceNormal, vQuadRight, - rMasterBrush, out earliestQuad); + rMasterBrush, color, out earliestQuad); Debug.Assert(m_LeadingQuadIndex == iPrevLeadingIndex + iNumQuadsPer); UpdateUVs(Mathf.Min(iPrevInitialIndex, earliestQuad), m_LeadingQuadIndex, pressuredSize); diff --git a/Assets/Scripts/Brushes/QuillFlatBrush.cs b/Assets/Scripts/Brushes/QuillFlatBrush.cs new file mode 100644 index 0000000000..b2b0ba4412 --- /dev/null +++ b/Assets/Scripts/Brushes/QuillFlatBrush.cs @@ -0,0 +1,42 @@ +// 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 UnityEngine; + +namespace TiltBrush +{ + class QuillFlatBrush : FlatGeometryBrush + { + protected override bool SmoothPositions + { + get { return false; } + } + + protected override void ComputeSurfaceFrame( + Vector3 preferredRight, + Vector3 nTangent, + Quaternion brushOrientation, + out Vector3 nRight, + out Vector3 nSurface) + { + nRight = brushOrientation * Vector3.right; + nSurface = brushOrientation * Vector3.up; + } + + protected override float GetVertexAlpha(Knot knot) + { + return knot.color.a / 255.0f; + } + } +} diff --git a/Assets/Scripts/Brushes/QuillFlatBrush.cs.meta b/Assets/Scripts/Brushes/QuillFlatBrush.cs.meta new file mode 100644 index 0000000000..7e0192d46f --- /dev/null +++ b/Assets/Scripts/Brushes/QuillFlatBrush.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d5d5b674ee74df0ae7b4a6f145ff122 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Brushes/QuillTubeBrush.cs b/Assets/Scripts/Brushes/QuillTubeBrush.cs new file mode 100644 index 0000000000..146ef2696f --- /dev/null +++ b/Assets/Scripts/Brushes/QuillTubeBrush.cs @@ -0,0 +1,34 @@ +// 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 UnityEngine; + +namespace TiltBrush +{ + class QuillTubeBrush : TubeBrush + { + protected override bool SmoothPositions + { + get { return false; } + } + + protected override Quaternion ComputeFrame( + Vector3 nTangent, + Quaternion? prevFrame, + Quaternion brushOrientation) + { + return brushOrientation; + } + } +} diff --git a/Assets/Scripts/Brushes/QuillTubeBrush.cs.meta b/Assets/Scripts/Brushes/QuillTubeBrush.cs.meta new file mode 100644 index 0000000000..177bcb46ee --- /dev/null +++ b/Assets/Scripts/Brushes/QuillTubeBrush.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87cab018d8184d009d8f212cb1506bc7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Brushes/SprayBrush.cs b/Assets/Scripts/Brushes/SprayBrush.cs index 1fccc12dd4..6ec771da88 100644 --- a/Assets/Scripts/Brushes/SprayBrush.cs +++ b/Assets/Scripts/Brushes/SprayBrush.cs @@ -132,9 +132,9 @@ public override void ResetBrushForPreview(TrTransform localPointerXf) } override protected bool UpdatePositionImpl( - Vector3 pos, Quaternion ori, float pressure) + Vector3 pos, Quaternion ori, float pressure, Color32? color = null) { - bool keep = base.UpdatePositionImpl(pos, ori, pressure); + bool keep = base.UpdatePositionImpl(pos, ori, pressure, color); if (keep && m_PreviewMode) { m_DecayTimers.Add(0); @@ -244,13 +244,14 @@ void OnChanged_MakeGeometry(int iKnot0) alpha = m_rng.InRange(salt + kSaltAlpha, 0.0f, 1.0f); } - SetVert(iVertIndex, BR, vCenter - vForwardOffset + vRightOffset, cur.nSurface, m_Color, + Color32 color = cur.color; + SetVert(iVertIndex, BR, vCenter - vForwardOffset + vRightOffset, cur.nSurface, color, alpha); - SetVert(iVertIndex, BL, vCenter - vForwardOffset - vRightOffset, cur.nSurface, m_Color, + SetVert(iVertIndex, BL, vCenter - vForwardOffset - vRightOffset, cur.nSurface, color, alpha); - SetVert(iVertIndex, FR, vCenter + vForwardOffset + vRightOffset, cur.nSurface, m_Color, + SetVert(iVertIndex, FR, vCenter + vForwardOffset + vRightOffset, cur.nSurface, color, alpha); - SetVert(iVertIndex, FL, vCenter + vForwardOffset - vRightOffset, cur.nSurface, m_Color, + SetVert(iVertIndex, FL, vCenter + vForwardOffset - vRightOffset, cur.nSurface, color, alpha); iTriIndex += kTrisInSolid * NS; diff --git a/Assets/Scripts/Brushes/Square3DPrintBrush.cs b/Assets/Scripts/Brushes/Square3DPrintBrush.cs index 7bf79c209d..d033212580 100644 --- a/Assets/Scripts/Brushes/Square3DPrintBrush.cs +++ b/Assets/Scripts/Brushes/Square3DPrintBrush.cs @@ -373,40 +373,43 @@ void OnChanged_MakeGeometry(int iKnot0) void AddStartCapVerts(ref Knot cur, Vector3 pos, GeometryBasis gb) { + Color32 color = cur.color; AppendVertSquare( ref cur, pos + gb.widthVectorToBevel - gb.thicknessVectorToBevel - gb.capNormalOffset, - m_Color); + color); AppendVertSquare( ref cur, pos - gb.widthVectorToBevel - gb.thicknessVectorToBevel - gb.capNormalOffset, - m_Color); + color); AppendVertSquare( ref cur, pos - gb.widthVectorToBevel + gb.thicknessVectorToBevel - gb.capNormalOffset, - m_Color); + color); AppendVertSquare( ref cur, pos + gb.widthVectorToBevel + gb.thicknessVectorToBevel - gb.capNormalOffset, - m_Color); + color); } void AddEndCapVerts(ref Knot cur, Vector3 pos, GeometryBasis gb) { + Color32 color = cur.color; AppendVertSquare( ref cur, pos + gb.widthVectorToBevel - gb.thicknessVectorToBevel + gb.capNormalOffset, - m_Color); + color); AppendVertSquare( ref cur, pos - gb.widthVectorToBevel - gb.thicknessVectorToBevel + gb.capNormalOffset, - m_Color); + color); AppendVertSquare( ref cur, pos - gb.widthVectorToBevel + gb.thicknessVectorToBevel + gb.capNormalOffset, - m_Color); + color); AppendVertSquare( ref cur, pos + gb.widthVectorToBevel + gb.thicknessVectorToBevel + gb.capNormalOffset, - m_Color); + color); } void AddRingVerts(ref Knot cur, Vector3 pos, GeometryBasis gb) { - Color32 c1 = m_Color; - Color32 c2 = m_Color; + Color32 color = cur.color; + Color32 c1 = color; + Color32 c2 = color; if (m_debugShowSurfaceOrientation) { c1 = Color.blue; diff --git a/Assets/Scripts/Brushes/SquareBrush.cs b/Assets/Scripts/Brushes/SquareBrush.cs index 676e2ee7b9..8fa704bdd2 100644 --- a/Assets/Scripts/Brushes/SquareBrush.cs +++ b/Assets/Scripts/Brushes/SquareBrush.cs @@ -251,28 +251,28 @@ void OnChanged_MakeGeometry(int iKnot0) float size = PressuredSize(prev.smoothedPressure); Vector3 halfR = cur.nRight * (size / 2); Vector3 halfU = cur.nSurface * ((size / 2) * kCrossSectionAspectRatio); - MySetVert(cur.iVert, BBR_B, prev.point.m_Pos - halfU + halfR, -cur.nSurface); - MySetVert(cur.iVert, BBR_R, prev.point.m_Pos - halfU + halfR, cur.nRight); - MySetVert(cur.iVert, BTL_T, prev.point.m_Pos + halfU - halfR, cur.nSurface); - MySetVert(cur.iVert, BTL_L, prev.point.m_Pos + halfU - halfR, -cur.nRight); - MySetVert(cur.iVert, BTR_T, prev.point.m_Pos + halfU + halfR, cur.nSurface); - MySetVert(cur.iVert, BTR_R, prev.point.m_Pos + halfU + halfR, cur.nRight); - MySetVert(cur.iVert, BBL_B, prev.point.m_Pos - halfU - halfR, -cur.nSurface); - MySetVert(cur.iVert, BBL_L, prev.point.m_Pos - halfU - halfR, -cur.nRight); + MySetVert(cur.iVert, BBR_B, prev.point.m_Pos - halfU + halfR, -cur.nSurface, cur.color); + MySetVert(cur.iVert, BBR_R, prev.point.m_Pos - halfU + halfR, cur.nRight, cur.color); + MySetVert(cur.iVert, BTL_T, prev.point.m_Pos + halfU - halfR, cur.nSurface, cur.color); + MySetVert(cur.iVert, BTL_L, prev.point.m_Pos + halfU - halfR, -cur.nRight, cur.color); + MySetVert(cur.iVert, BTR_T, prev.point.m_Pos + halfU + halfR, cur.nSurface, cur.color); + MySetVert(cur.iVert, BTR_R, prev.point.m_Pos + halfU + halfR, cur.nRight, cur.color); + MySetVert(cur.iVert, BBL_B, prev.point.m_Pos - halfU - halfR, -cur.nSurface, cur.color); + MySetVert(cur.iVert, BBL_L, prev.point.m_Pos - halfU - halfR, -cur.nRight, cur.color); } { float size = PressuredSize(cur.smoothedPressure); Vector3 halfR = cur.nRight * (size / 2); Vector3 halfU = cur.nSurface * ((size / 2) * kCrossSectionAspectRatio); - MySetVert(cur.iVert, FBR_B, cur.point.m_Pos - halfU + halfR, -cur.nSurface); - MySetVert(cur.iVert, FBR_R, cur.point.m_Pos - halfU + halfR, cur.nRight); - MySetVert(cur.iVert, FTL_T, cur.point.m_Pos + halfU - halfR, cur.nSurface); - MySetVert(cur.iVert, FTL_L, cur.point.m_Pos + halfU - halfR, -cur.nRight); - MySetVert(cur.iVert, FTR_T, cur.point.m_Pos + halfU + halfR, cur.nSurface); - MySetVert(cur.iVert, FTR_R, cur.point.m_Pos + halfU + halfR, cur.nRight); - MySetVert(cur.iVert, FBL_B, cur.point.m_Pos - halfU - halfR, -cur.nSurface); - MySetVert(cur.iVert, FBL_L, cur.point.m_Pos - halfU - halfR, -cur.nRight); + MySetVert(cur.iVert, FBR_B, cur.point.m_Pos - halfU + halfR, -cur.nSurface, cur.color); + MySetVert(cur.iVert, FBR_R, cur.point.m_Pos - halfU + halfR, cur.nRight, cur.color); + MySetVert(cur.iVert, FTL_T, cur.point.m_Pos + halfU - halfR, cur.nSurface, cur.color); + MySetVert(cur.iVert, FTL_L, cur.point.m_Pos + halfU - halfR, -cur.nRight, cur.color); + MySetVert(cur.iVert, FTR_T, cur.point.m_Pos + halfU + halfR, cur.nSurface, cur.color); + MySetVert(cur.iVert, FTR_R, cur.point.m_Pos + halfU + halfR, cur.nRight, cur.color); + MySetVert(cur.iVert, FBL_B, cur.point.m_Pos - halfU - halfR, -cur.nSurface, cur.color); + MySetVert(cur.iVert, FBL_L, cur.point.m_Pos - halfU - halfR, -cur.nRight, cur.color); } } @@ -280,12 +280,12 @@ void OnChanged_MakeGeometry(int iKnot0) } } - void MySetVert(int iVert, int vp, Vector3 v, Vector3 n) + void MySetVert(int iVert, int vp, Vector3 v, Vector3 n, Color32 color) { int i = iVert + vp * NS; m_geometry.m_Vertices[i] = v; m_geometry.m_Normals[i] = n; - Color32 c = m_Color; + Color32 c = color; c.a = 255; m_geometry.m_Colors[i] = c; m_geometry.m_Texcoord0.v2[i] = new Vector2(.5f, .5f); diff --git a/Assets/Scripts/Brushes/SvgBrushScript.cs b/Assets/Scripts/Brushes/SvgBrushScript.cs index f144a2146e..2813ead5a3 100644 --- a/Assets/Scripts/Brushes/SvgBrushScript.cs +++ b/Assets/Scripts/Brushes/SvgBrushScript.cs @@ -43,7 +43,7 @@ public override GeometryPool.VertexLayout GetVertexLayout(BrushDescriptor desc) // -------------------------------------------------------------------------------------------- // // This is OK because this isn't a real brush, yet required because these functions are abstract. // - override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure) + override protected bool UpdatePositionImpl(Vector3 vPos, Quaternion ori, float fPressure, Color32? color = null) { return true; } diff --git a/Assets/Scripts/Brushes/ThickGeometryBrush.cs b/Assets/Scripts/Brushes/ThickGeometryBrush.cs index aba8e82875..2e352de190 100644 --- a/Assets/Scripts/Brushes/ThickGeometryBrush.cs +++ b/Assets/Scripts/Brushes/ThickGeometryBrush.cs @@ -261,14 +261,14 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) float size = PressuredSize(prev.smoothedPressure); float alpha = PressuredOpacity(prev.smoothedPressure); Vector3 r = cur.nRight * (size / 2); - SetVert(cur.iVert, BRT, prev.point.m_Pos + r, nUp, m_Color, alpha); - SetVert(cur.iVert, BRB, prev.point.m_Pos + r, -nUp, m_Color, alpha); + SetVert(cur.iVert, BRT, prev.point.m_Pos + r, nUp, prev.color, alpha); + SetVert(cur.iVert, BRB, prev.point.m_Pos + r, -nUp, prev.color, alpha); - SetVert(cur.iVert, BMT, prev.point.m_Pos, nUp, m_Color, alpha); - SetVert(cur.iVert, BMB, prev.point.m_Pos, -nUp, m_Color, alpha); + SetVert(cur.iVert, BMT, prev.point.m_Pos, nUp, prev.color, alpha); + SetVert(cur.iVert, BMB, prev.point.m_Pos, -nUp, prev.color, alpha); - SetVert(cur.iVert, BLT, prev.point.m_Pos - r, nUp, m_Color, alpha); - SetVert(cur.iVert, BLB, prev.point.m_Pos - r, -nUp, m_Color, alpha); + SetVert(cur.iVert, BLT, prev.point.m_Pos - r, nUp, prev.color, alpha); + SetVert(cur.iVert, BLB, prev.point.m_Pos - r, -nUp, prev.color, alpha); } { @@ -290,14 +290,14 @@ void OnChanged_MakeVertsAndNormals(int iKnot0) sinRt = sinTheta * cur.nRight; } - SetVert(cur.iVert, FRT, cur.point.m_Pos + r, cosUp + sinRt, m_Color, alpha); - SetVert(cur.iVert, FRB, cur.point.m_Pos + r, -cosUp + sinRt, m_Color, alpha); + SetVert(cur.iVert, FRT, cur.point.m_Pos + r, cosUp + sinRt, cur.color, alpha); + SetVert(cur.iVert, FRB, cur.point.m_Pos + r, -cosUp + sinRt, cur.color, alpha); - SetVert(cur.iVert, FMT, cur.point.m_Pos + u, nUp, m_Color, alpha); - SetVert(cur.iVert, FMB, cur.point.m_Pos - u, -nUp, m_Color, alpha); + SetVert(cur.iVert, FMT, cur.point.m_Pos + u, nUp, cur.color, alpha); + SetVert(cur.iVert, FMB, cur.point.m_Pos - u, -nUp, cur.color, alpha); - SetVert(cur.iVert, FLT, cur.point.m_Pos - r, cosUp - sinRt, m_Color, alpha); - SetVert(cur.iVert, FLB, cur.point.m_Pos - r, -cosUp - sinRt, m_Color, alpha); + SetVert(cur.iVert, FLT, cur.point.m_Pos - r, cosUp - sinRt, cur.color, alpha); + SetVert(cur.iVert, FLB, cur.point.m_Pos - r, -cosUp - sinRt, cur.color, alpha); } } diff --git a/Assets/Scripts/Brushes/TubeBrush.cs b/Assets/Scripts/Brushes/TubeBrush.cs index 4b85bf37e9..6b769eafbb 100644 --- a/Assets/Scripts/Brushes/TubeBrush.cs +++ b/Assets/Scripts/Brushes/TubeBrush.cs @@ -31,21 +31,40 @@ class TubeBrush : GeometryBrush const float kSolidAspectRatio = 0.2f; [SerializeField] float m_CapAspect = .8f; - [SerializeField] ushort m_PointsInClosedCircle = 8; - [SerializeField] bool m_EndCaps = true; - [SerializeField] bool m_HardEdges = false; + [SerializeField] protected ushort m_PointsInClosedCircle = 8; + [SerializeField] protected bool m_EndCaps = true; + [SerializeField] protected bool m_HardEdges = false; [SerializeField] protected UVStyle m_uvStyle = UVStyle.Distance; + [SerializeField] protected float m_RadiusMultiplier = 1.0f; + /// Angle of the first vertex of the cross section, in radians. + [SerializeField] protected float m_CrossSectionAngleOffset = 0.0f; [SerializeField] protected ShapeModifier m_ShapeModifier = ShapeModifier.None; /// Specific to Taper shape modifier. [SerializeField] float m_TaperScalar = 1.0f; /// Specific to Petal shape modifier. [SerializeField] float m_PetalDisplacementAmt = 0.5f; [SerializeField] float m_PetalDisplacementExp = 3.0f; + /// Specific to Ellipse shape modifier. + [SerializeField] float m_EllipseMinorScale = 0.25f; /// XXX - in my experience a higher multiplier actually makes /// the break LESS sensitive. Not more. /// /// Positive multiplier; 1.0 is standard, higher is more sensitive. [SerializeField] float m_BreakAngleMultiplier = 2; + [SerializeField] bool m_ForceAllKnots; + + protected override bool ForceAllKnots + { + get { return m_ForceAllKnots; } + } + + protected virtual Quaternion ComputeFrame( + Vector3 nTangent, + Quaternion? prevFrame, + Quaternion brushOrientation) + { + return MathUtils.ComputeMinimalRotationFrame(nTangent, prevFrame, brushOrientation); + } int m_VertsInClosedCircle; int m_VertsInCap; @@ -67,6 +86,7 @@ protected enum ShapeModifier Comet, Taper, Petal, + Ellipse }; public TubeBrush() : this(true) { } @@ -174,24 +194,27 @@ bool OnChanged_FrameKnots(int iKnot0) Knot cur = m_knots[iKnot]; bool shouldBreak = false; + bool forceAllKnots = ForceAllKnots; Vector3 vMove = cur.smoothedPos - prev.smoothedPos; cur.length = vMove.magnitude; if (cur.length < kMinimumMoveMeters_PS * App.METERS_TO_UNITS * POINTER_TO_LOCAL) { - shouldBreak = true; + if (!forceAllKnots) + { + shouldBreak = true; + } } else { Vector3 nTangent = vMove / cur.length; - cur.qFrame = MathUtils.ComputeMinimalRotationFrame( - nTangent, prev.Frame, cur.point.m_Orient); + cur.qFrame = ComputeFrame(nTangent, prev.Frame, cur.point.m_Orient); // More break checking; replicates previous logic // TODO: decompose into twist and swing; use different constraints // http://www.euclideanspace.com/maths/geometry/rotations/for/decomposition/ - if (prev.HasGeometry && !m_PreviewMode) + if (prev.HasGeometry && !m_PreviewMode && !forceAllKnots) { float fWidthHeightRatio = cur.length / PressuredSize(cur.smoothedPressure); float fBreakAngle = Mathf.Atan(fWidthHeightRatio) * Mathf.Rad2Deg @@ -204,6 +227,20 @@ bool OnChanged_FrameKnots(int iKnot0) } } + if (forceAllKnots && + !shouldBreak && + cur.length < kMinimumMoveMeters_PS * App.METERS_TO_UNITS * POINTER_TO_LOCAL) + { + // Keep a stable frame even for tiny moves. + Vector3 fallback = prev.HasGeometry ? (prev.qFrame * Vector3.forward) + : (cur.point.m_Orient * Vector3.forward); + if (fallback.sqrMagnitude < 1e-8f) + { + fallback = Vector3.forward; + } + cur.qFrame = ComputeFrame(fallback.normalized, prev.Frame, cur.point.m_Orient); + } + if (shouldBreak) { cur.qFrame = new Quaternion(0, 0, 0, 0); @@ -327,7 +364,7 @@ void OnChanged_MakeGeometry(int iKnot0) // Verts, front half { float size = PressuredSize(cur.smoothedPressure); - float radius = size / 2; + float radius = size * 0.5f * m_RadiusMultiplier; float circumference = TWOPI * radius; float uRate = m_Desc.m_TileRate / circumference; @@ -681,11 +718,15 @@ int ModifySilhouetteOfSegment(int initialSegmentKnot) distance += cur.length; float t = distance / totalLength; + // Because the vertices are shared between knots we only handle half of them. + // In the m_Displacements array only the second half of the chunk of vertices + // controlled by a given knot are relative to that knot, the first half is relative + // to the previous one, so we start the loop at m_VertsInClosedCircle. int numVerts = cur.nVert; - for (int i = 0; i < numVerts; i++) + for (int i = m_VertsInClosedCircle; i < numVerts; i++) { int vert = (cur.iVert + i); - float radius = PressuredSize(cur.smoothedPressure) / 2.0f; + float radius = PressuredSize(cur.smoothedPressure) * 0.5f * m_RadiusMultiplier; Vector3 dir = m_Displacements[vert]; // skip start/end cap verts @@ -704,7 +745,7 @@ int ModifySilhouetteOfSegment(int initialSegmentKnot) } } - float curve = 0; + float curve = 1.0f; Vector3 offset = Vector3.zero; switch (m_ShapeModifier) @@ -732,6 +773,16 @@ int ModifySilhouetteOfSegment(int initialSegmentKnot) offset = m_geometry.m_Normals[vert] * displacement * petalAmtCacheValue * cur.smoothedPressure; break; + case ShapeModifier.Ellipse: + // Calculate offset to create an elliptical cross-section + // Minor/major ratio. + float minorScale = m_EllipseMinorScale == 0 ? 1.0f : m_EllipseMinorScale; + float horzScale = minorScale > 1.0f ? 1.0f / minorScale : 1.0f; + float vertScale = minorScale > 1.0f ? 1.0f : minorScale; + float rtAmt = Vector3.Dot(dir, cur.nRight); + float upAmt = Vector3.Dot(dir, cur.nSurface); + dir = cur.nRight * (rtAmt * horzScale) + cur.nSurface * (upAmt * vertScale); + break; } m_geometry.m_Vertices[vert] = offset + cur.smoothedPos + radius * dir * curve; } @@ -773,7 +824,7 @@ void MakeCapVerts( // Additionally, be aware that here "radius" is packed into a vertex channel but // does not actually have anything to do with the radius of the created geometry. // - AppendVert(ref k, tip, normal.normalized, m_Color, tan, uv, /*radius*/ 0); + AppendVert(ref k, tip, normal.normalized, k.color, tan, uv, /*radius*/ 0); AppendDisplacement(ref k, fwdNormal); } } @@ -808,12 +859,13 @@ void MakeClosedCircleSoftEdges( { float t = (float)i / (numVerts - 1); // Ensure that the first and last verts are exactly coincident - float theta = (t == 1) ? 0 : TWOPI * t; + float theta = (t == 1) ? m_CrossSectionAngleOffset : TWOPI * t + m_CrossSectionAngleOffset; Vector2 uv = new Vector2(u, Mathf.Lerp(v0, v1, t)); - Vector3 off = -Mathf.Cos(theta) * up + -Mathf.Sin(theta) * rt; + Vector3 dir = -Mathf.Cos(theta) * up + -Mathf.Sin(theta) * rt; + dir.Normalize(); - AppendVert(ref k, center + radius * off, off, m_Color, fwd, uv, radius); - AppendDisplacement(ref k, off.normalized); + AppendVert(ref k, center + radius * dir, dir, k.color, fwd, uv, radius); + AppendDisplacement(ref k, dir); } } @@ -833,7 +885,7 @@ void MakeClosedCircleHardEdges( float t = (float)i / (numPoints); // Ensure that the first and last verts are exactly coincident - float theta = (t == 0) ? 0 : TWOPI * t; + float theta = TWOPI * t + m_CrossSectionAngleOffset; if (!lastTheta.HasValue) { lastTheta = theta - (TWOPI / numPoints); @@ -853,14 +905,14 @@ void MakeClosedCircleHardEdges( float v = Mathf.Lerp(v0, v1, (float)prevFace / (float)(numPoints) + (1.0f / numPoints)); Vector2 uv = new Vector2(u, v); - AppendVert(ref k, center + radius * off1, nPrev, m_Color, tan, uv, radius); + AppendVert(ref k, center + radius * off1, nPrev, k.color, tan, uv, radius); AppendDisplacement(ref k, off1); int currentFace = i; v = Mathf.Lerp(v0, v1, (float)currentFace / (float)(numPoints)); uv = new Vector2(u, v); - AppendVert(ref k, center + radius * off1, nCur, m_Color, tan, uv, radius); + AppendVert(ref k, center + radius * off1, nCur, k.color, tan, uv, radius); AppendDisplacement(ref k, off1); } } diff --git a/Assets/Scripts/Commands/BreakModelApartCommand.cs b/Assets/Scripts/Commands/BreakModelApartCommand.cs index c1058edfd9..5f27880128 100644 --- a/Assets/Scripts/Commands/BreakModelApartCommand.cs +++ b/Assets/Scripts/Commands/BreakModelApartCommand.cs @@ -26,6 +26,7 @@ public class BreakModelApartCommand : BaseCommand private ModelWidget m_InitialWidget; private List m_NewModelWidgets; private List m_NewLightWidgets; + private List m_NewSoundClipWidgets; private List m_NodePaths; override public bool NeedsSave @@ -51,7 +52,8 @@ bool isValidSelf(Transform node) if (!node.gameObject.activeSelf) return false; // Skip nodes with no valid children if (node.GetComponent() == null && - node.GetComponent() == null) return false; + node.GetComponent() == null && + node.GetComponent() == null) return false; return true; } @@ -62,7 +64,8 @@ bool isValid(Transform node) if (!node.gameObject.activeSelf) return false; // Skip nodes with no valid children if (node.GetComponentInChildren() == null && - node.GetComponentInChildren() == null) return false; + node.GetComponentInChildren() == null && + node.GetComponentInChildren() == null) return false; return true; } @@ -162,6 +165,7 @@ public BreakModelApartCommand(ModelWidget initialWidget, BaseCommand parent = nu m_InitialWidget = initialWidget; m_NewModelWidgets = new List(); m_NewLightWidgets = new List(); + m_NewSoundClipWidgets = new List(); var widgetObjScript = initialWidget.GetComponentInChildren(); m_NodePaths = ExtractPaths(widgetObjScript.transform); } @@ -293,12 +297,19 @@ protected override void OnRedo() newWidget.RegisterHighlight(); newWidget.UpdateBatchInfo(); - // If a ModelWidget contains no more meshes - // then try and convert it to multiple LightWidgets + // If a ModelWidget contains no more meshes, convert to widget(s) of the + // appropriate type based on what components the subtree contains. var objModel = newWidget.GetComponentInChildren(); if (objModel != null && objModel.NumMeshes == 0) { - m_NewLightWidgets.AddRange(LightWidget.FromModelWidget(newWidget)); + if (newWidget.GetComponentInChildren() != null) + { + m_NewSoundClipWidgets.AddRange(SoundClipWidget.FromModelWidget(newWidget)); + } + else + { + m_NewLightWidgets.AddRange(LightWidget.FromModelWidget(newWidget)); + } } else { @@ -323,6 +334,12 @@ protected override void OnUndo() WidgetManager.m_Instance.UnregisterGrabWidget(widget.gameObject); GameObject.Destroy(widget.gameObject); } + SelectionManager.m_Instance.DeselectWidgets(m_NewSoundClipWidgets); + foreach (var widget in m_NewSoundClipWidgets) + { + WidgetManager.m_Instance.UnregisterGrabWidget(widget.gameObject); + GameObject.Destroy(widget.gameObject); + } m_InitialWidget.gameObject.SetActive(true); SelectionManager.m_Instance.SelectWidget(m_InitialWidget); } diff --git a/Assets/Scripts/Commands/CreateWidgetCommand.cs b/Assets/Scripts/Commands/CreateWidgetCommand.cs index f611e8dec8..7642373f04 100644 --- a/Assets/Scripts/Commands/CreateWidgetCommand.cs +++ b/Assets/Scripts/Commands/CreateWidgetCommand.cs @@ -102,6 +102,7 @@ protected override void OnRedo() case ImageWidget: case TextWidget: case VideoWidget: + case SoundClipWidget: m_Widget.transform.parent = m_Canvas.transform; m_Widget.Show(true); break; diff --git a/Assets/Scripts/Commands/LoadQuillCommand.cs b/Assets/Scripts/Commands/LoadQuillCommand.cs new file mode 100644 index 0000000000..227c4d8fe0 --- /dev/null +++ b/Assets/Scripts/Commands/LoadQuillCommand.cs @@ -0,0 +1,109 @@ +// 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 System.Collections.Generic; +using UnityEngine; + +namespace TiltBrush +{ + public class LoadQuillCommand : BaseCommand + { + private List m_Strokes; + private List m_Layers; + private List m_Widgets; + private bool m_Active; + + public override bool NeedsSave => true; + + public LoadQuillCommand(List strokes, List layers, List widgets, BaseCommand parent = null) + : base(parent) + { + m_Strokes = strokes; + m_Layers = layers; + m_Widgets = widgets; + m_Active = true; + } + + protected override void OnRedo() + { + foreach (var layer in m_Layers) + { + layer.gameObject.SetActive(true); + } + if (m_Widgets != null) + { + foreach (var widget in m_Widgets) + { + if (widget == null) continue; + widget.gameObject.SetActive(true); + widget.RestoreFromToss(); + } + } + foreach (var stroke in m_Strokes) + { + stroke.Hide(false); + } + m_Active = true; + } + + protected override void OnUndo() + { + foreach (var stroke in m_Strokes) + { + stroke.Hide(true); + } + if (m_Widgets != null) + { + foreach (var widget in m_Widgets) + { + if (widget == null) continue; + widget.Hide(); + } + } + foreach (var layer in m_Layers) + { + layer.gameObject.SetActive(false); + } + m_Active = false; + } + + protected override void OnDispose() + { + if (m_Strokes != null) + { + foreach (var stroke in m_Strokes) + { + SketchMemoryScript.m_Instance.RemoveMemoryObject(stroke); + stroke.DestroyStroke(); + } + } + if (m_Layers != null) + { + foreach (var layer in m_Layers) + { + App.Scene.DestroyLayer(layer); + } + } + if (m_Widgets != null) + { + foreach (var widget in m_Widgets) + { + if (widget == null) continue; + WidgetManager.m_Instance.UnregisterGrabWidget(widget.gameObject); + Object.Destroy(widget.gameObject); + } + } + } + } +} diff --git a/Assets/Scripts/Commands/LoadQuillCommand.cs.meta b/Assets/Scripts/Commands/LoadQuillCommand.cs.meta new file mode 100644 index 0000000000..4765a065ab --- /dev/null +++ b/Assets/Scripts/Commands/LoadQuillCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3af19a76cf105004cac7f3f11a8486c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ModifyStrokePointColorsCommand.cs b/Assets/Scripts/Commands/ModifyStrokePointColorsCommand.cs new file mode 100644 index 0000000000..2e2363dc5d --- /dev/null +++ b/Assets/Scripts/Commands/ModifyStrokePointColorsCommand.cs @@ -0,0 +1,63 @@ +// 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 System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace TiltBrush +{ + public class ModifyStrokePointColorsCommand : BaseCommand + { + private readonly Stroke m_TargetStroke; + private readonly List m_StartOverrideColors; + private readonly ColorOverrideMode m_StartColorOverrideMode; + private readonly List m_EndOverrideColors; + private readonly ColorOverrideMode m_EndColorOverrideMode; + + public ModifyStrokePointColorsCommand( + Stroke stroke, + List newOverrideColors, + ColorOverrideMode newColorOverrideMode, + BaseCommand parent = null) : base(parent) + { + m_TargetStroke = stroke; + m_StartOverrideColors = stroke.m_OverrideColors?.ToList(); + m_StartColorOverrideMode = stroke.m_ColorOverrideMode; + m_EndOverrideColors = newOverrideColors?.ToList(); + m_EndColorOverrideMode = newColorOverrideMode; + } + + public override bool NeedsSave => true; + + private void ApplyNewColorsToStroke(List overrideColors, ColorOverrideMode colorOverrideMode) + { + m_TargetStroke.m_OverrideColors = overrideColors?.ToList(); + m_TargetStroke.m_ColorOverrideMode = colorOverrideMode; + m_TargetStroke.InvalidateCopy(); + m_TargetStroke.Uncreate(); + m_TargetStroke.Recreate(); + } + + protected override void OnRedo() + { + ApplyNewColorsToStroke(m_EndOverrideColors, m_EndColorOverrideMode); + } + + protected override void OnUndo() + { + ApplyNewColorsToStroke(m_StartOverrideColors, m_StartColorOverrideMode); + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/Commands/ModifyStrokePointColorsCommand.cs.meta b/Assets/Scripts/Commands/ModifyStrokePointColorsCommand.cs.meta new file mode 100644 index 0000000000..988ce1a3cf --- /dev/null +++ b/Assets/Scripts/Commands/ModifyStrokePointColorsCommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58b6452597f5c4182a60e4cf2e4590f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Config.cs b/Assets/Scripts/Config.cs index 87706a1685..3ca14e0bed 100644 --- a/Assets/Scripts/Config.cs +++ b/Assets/Scripts/Config.cs @@ -125,13 +125,13 @@ private class UserConfigChange [NonSerialized] public bool m_QuickLoad = true; public SecretsConfig.ServiceAuthData GoogleSecrets => Secrets?[SecretsConfig.Service.Google]; - public SecretsConfig.ServiceAuthData SketchfabSecrets => Secrets[SecretsConfig.Service.Sketchfab]; - public SecretsConfig.ServiceAuthData OculusSecrets => Secrets[SecretsConfig.Service.Oculus]; - public SecretsConfig.ServiceAuthData OculusMobileSecrets => Secrets[SecretsConfig.Service.OculusMobile]; - public SecretsConfig.ServiceAuthData PimaxSecrets => Secrets[SecretsConfig.Service.Pimax]; - public SecretsConfig.ServiceAuthData PhotonFusionSecrets => Secrets[SecretsConfig.Service.PhotonFusion]; - public SecretsConfig.ServiceAuthData PhotonVoiceSecrets => Secrets[SecretsConfig.Service.PhotonVoice]; - public SecretsConfig.ServiceAuthData ViveSecrets => Secrets[SecretsConfig.Service.Vive]; + public SecretsConfig.ServiceAuthData SketchfabSecrets => Secrets?[SecretsConfig.Service.Sketchfab]; + public SecretsConfig.ServiceAuthData OculusSecrets => Secrets?[SecretsConfig.Service.Oculus]; + public SecretsConfig.ServiceAuthData OculusMobileSecrets => Secrets?[SecretsConfig.Service.OculusMobile]; + public SecretsConfig.ServiceAuthData PimaxSecrets => Secrets?[SecretsConfig.Service.Pimax]; + public SecretsConfig.ServiceAuthData PhotonFusionSecrets => Secrets?[SecretsConfig.Service.PhotonFusion]; + public SecretsConfig.ServiceAuthData PhotonVoiceSecrets => Secrets?[SecretsConfig.Service.PhotonVoice]; + public SecretsConfig.ServiceAuthData ViveSecrets => Secrets?[SecretsConfig.Service.Vive]; public bool DisableAccountLogins; diff --git a/Assets/Scripts/GUI/AudioVizPopUpWindow.cs b/Assets/Scripts/GUI/AudioVizPopUpWindow.cs index ae1df7e34c..9302ebe034 100644 --- a/Assets/Scripts/GUI/AudioVizPopUpWindow.cs +++ b/Assets/Scripts/GUI/AudioVizPopUpWindow.cs @@ -38,6 +38,13 @@ override public void Init(GameObject rParent, string sText) { base.Init(rParent, sText); m_HintText.enabled = false; +#if UNITY_ANDROID || UNITY_IOS + TextMeshPro hintText = m_HintText.GetComponent(); + if (hintText != null) + { + hintText.text = "Play audio in Open Brush"; + } +#endif m_AudioFound = false; } diff --git a/Assets/Scripts/GUI/BaseButton.cs b/Assets/Scripts/GUI/BaseButton.cs index 979e9c642a..f3addc9021 100644 --- a/Assets/Scripts/GUI/BaseButton.cs +++ b/Assets/Scripts/GUI/BaseButton.cs @@ -43,6 +43,9 @@ protected enum ButtonState [SerializeField] private bool m_AddOverlay = false; protected Renderer m_ButtonRenderer; + private Renderer ButtonRenderer => m_ButtonRenderer != null + ? m_ButtonRenderer + : (m_ButtonRenderer = GetComponent()); protected bool m_ToggleActive; protected bool m_ButtonSelected; @@ -69,7 +72,7 @@ protected enum ButtonState protected void RefreshAtlasedMaterial() { - m_ButtonRenderer.material = + ButtonRenderer.material = SketchControlsScript.m_Instance.IconTextureAtlas.GetAppropriateMaterial( m_AtlasFlag_Activated, m_AtlasFlag_Focus); } @@ -165,9 +168,9 @@ virtual protected void ConfigureTextureAtlas() // If we shouldn't atlas this texture, or we can't find it, fall back to default. if (useBackupTexture) { - if (m_CurrentButtonTexture != null) + if (m_CurrentButtonTexture != null && ButtonRenderer != null) { - m_ButtonRenderer.material.mainTexture = m_CurrentButtonTexture; + ButtonRenderer.material.mainTexture = m_CurrentButtonTexture; } m_AtlasTexture = false; } @@ -203,16 +206,19 @@ public void SetButtonTexture(Texture2D rTexture, float aspect = -1) else { m_CurrentButtonTexture = rTexture; - m_ButtonRenderer.material.mainTexture = rTexture; + if (ButtonRenderer != null) + { + ButtonRenderer.material.mainTexture = rTexture; + } UpdateUVsForAspect(aspect); } } protected virtual void SetMaterialFloat(string name, float value) { - if (!m_AtlasTexture) + if (!m_AtlasTexture && ButtonRenderer != null) { - m_ButtonRenderer.material.SetFloat(name, value); + ButtonRenderer.material.SetFloat(name, value); } } @@ -282,9 +288,9 @@ protected virtual void SetMaterialColor(Color rColor) m_AtlasFlag_Focus = (rColor == Color.white); RefreshAtlasedMaterial(); } - else + else if (ButtonRenderer != null) { - m_ButtonRenderer.material.SetColor("_Color", rColor); + ButtonRenderer.material.SetColor("_Color", rColor); } } @@ -310,10 +316,10 @@ public void SetHDRButtonColor(Color color, Color secondaryColor) color.a = alpha; secondaryColor.a = alpha2; } - if (!m_AtlasTexture) + if (!m_AtlasTexture && ButtonRenderer != null) { - m_ButtonRenderer.material.SetColor("_Color", color); - m_ButtonRenderer.material.SetColor("_SecondaryColor", secondaryColor); + ButtonRenderer.material.SetColor("_Color", color); + ButtonRenderer.material.SetColor("_SecondaryColor", secondaryColor); } } @@ -466,7 +472,7 @@ void UpdateUVsForAspect(float aspect) { aspect = m_CurrentButtonTexture.width / m_CurrentButtonTexture.height; } - m_ButtonRenderer.material.SetFloat("_Aspect", aspect); + ButtonRenderer.material.SetFloat("_Aspect", aspect); } } } diff --git a/Assets/Scripts/GUI/BasePanel.cs b/Assets/Scripts/GUI/BasePanel.cs index 6012079437..9430c70e6e 100644 --- a/Assets/Scripts/GUI/BasePanel.cs +++ b/Assets/Scripts/GUI/BasePanel.cs @@ -110,9 +110,10 @@ public enum PanelType WebcamPanel = 5200, Scripts = 6000, SnapSettings = 8000, - StencilSettings = 20200, - LayersPanel = 15000, + QuillLibrary = 11600, TransformPanel = 12000, + LayersPanel = 15000, + StencilSettings = 20200, WhatsNewPanel = 20300, BlocksPromoPanel = 20301, } diff --git a/Assets/Scripts/GUI/PanelManager.cs b/Assets/Scripts/GUI/PanelManager.cs index fc92f66a3d..f5a892250e 100644 --- a/Assets/Scripts/GUI/PanelManager.cs +++ b/Assets/Scripts/GUI/PanelManager.cs @@ -366,7 +366,7 @@ public bool IsPanelUnique(BasePanel.PanelType type) type == BasePanel.PanelType.AppSettings || type == BasePanel.PanelType.AppSettingsMobile || type == BasePanel.PanelType.Sketchbook || type == BasePanel.PanelType.SketchbookMobile || type == BasePanel.PanelType.Camera || type == BasePanel.PanelType.MemoryWarning || - type == BasePanel.PanelType.Multiplayer; + type == BasePanel.PanelType.Multiplayer || type == BasePanel.PanelType.QuillLibrary; } // Core panels are those that exist in the basic mode experience. Practically, those that diff --git a/Assets/Scripts/GUI/PushPullToolMenu.cs b/Assets/Scripts/GUI/PushPullToolMenu.cs new file mode 100644 index 0000000000..349e35f985 --- /dev/null +++ b/Assets/Scripts/GUI/PushPullToolMenu.cs @@ -0,0 +1,201 @@ +// Copyright 2020 The Tilt 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 System.Collections; +using UnityEngine; + +namespace TiltBrush +{ + + public class PushPullToolMenu : UIComponent + { + [SerializeField] private GameObject m_Mesh; + [SerializeField] private Renderer m_Border; + [SerializeField] private float m_AnimateSpeed; + [SerializeField] private Vector2 m_AnimateRange; + + private UIComponentManager m_UIComponentManager; + private Coroutine m_AnimationCoroutine; + private bool m_AnimateIn; + private bool m_AnimateWhenEnabled; + + override protected void Awake() + { + base.Awake(); + m_UIComponentManager = GetComponent(); + App.Switchboard.ToolChanged += OnToolChanged; + // App.Switchboard.SelectionChanged += OnSelectionChanged; + } + + override protected void Start() + { + base.Start(); + + // Begin disabled. Do this in Start() instead of Awake() so that button descriptions have a + // chance to instantiate at the right position. + m_AnimateIn = false; + Vector3 localScale = transform.localScale; + localScale.x = m_AnimateRange.x; + transform.localScale = localScale; + m_Mesh.SetActive(false); + m_Collider.enabled = false; + } + + override protected void OnDestroy() + { + base.OnDestroy(); + App.Switchboard.ToolChanged -= OnToolChanged; + // App.Switchboard.SelectionChanged -= OnSelectionChanged; + } + + private void OnEnable() + { + if (m_AnimateWhenEnabled) + { + m_AnimationCoroutine = StartCoroutine(Animate()); + m_AnimateWhenEnabled = false; + } + } + + override protected void OnDisable() + { + if (m_AnimationCoroutine != null) + { + // Skip to the end of animation + StopCoroutine(m_AnimationCoroutine); + Vector3 localScale = transform.localScale; + localScale.x = m_AnimateIn ? m_AnimateRange.y : m_AnimateRange.x; + transform.localScale = localScale; + m_AnimationCoroutine = null; + } + } + + override public void SetColor(Color color) + { + base.SetColor(color); + m_UIComponentManager.SetColor(color); + m_Border.material.SetColor("_Color", color); + } + + override public void UpdateVisuals() + { + base.UpdateVisuals(); + m_UIComponentManager.UpdateVisuals(); + } + + override public bool UpdateStateWithInput(bool inputValid, Ray inputRay, + GameObject parentActiveObject, Collider parentCollider) + { + if (base.UpdateStateWithInput(inputValid, inputRay, parentActiveObject, parentCollider)) + { + if (parentActiveObject == null || parentActiveObject == gameObject) + { + if (BasePanel.DoesRayHitCollider(inputRay, GetCollider())) + { + m_UIComponentManager.UpdateUIComponents(inputRay, inputValid, parentCollider); + return true; + } + } + } + return false; + } + + override public void ResetState() + { + base.ResetState(); + m_UIComponentManager.Deactivate(); + } + + override public bool RaycastAgainstCustomCollider(Ray ray, + out RaycastHit hitInfo, float dist) + { + return BasePanel.DoesRayHitCollider(ray, GetCollider(), out hitInfo); + } + + void OnToolChanged() + { + bool isPushPullTool = SketchSurfacePanel.m_Instance.GetCurrentToolType() == + BaseTool.ToolType.PushPullTool; + if (isPushPullTool != m_AnimateIn) + { + if (m_AnimationCoroutine != null) + { + StopCoroutine(m_AnimationCoroutine); + } + m_AnimateIn = !m_AnimateIn; + + // If we get a callback that our tool changed while we're inactive, don't try to + // start our coroutine until we've been enabled. + if (isActiveAndEnabled) + { + m_AnimationCoroutine = StartCoroutine(Animate()); + } + else + { + m_AnimateWhenEnabled = true; + } + } + } + + // void OnSelectionChanged() { + // m_GroupButton.UpdateVisuals(); + // } + + IEnumerator Animate() + { + Vector3 localScale = transform.localScale; + if (m_AnimateIn) + { + // Enable right away for animating in. + m_Mesh.SetActive(true); + m_Collider.enabled = true; + + float x = localScale.x; + while (x < m_AnimateRange.y) + { + x += Time.deltaTime * m_AnimateSpeed; + if (x >= m_AnimateRange.y) + { + x = m_AnimateRange.y; + } + localScale.x = x; + transform.localScale = localScale; + yield return null; + } + } + else + { + // Disable collider immediately so we can't select something. + m_Collider.enabled = false; + + float x = localScale.x; + while (x > m_AnimateRange.x) + { + x -= Time.deltaTime * m_AnimateSpeed; + if (x <= m_AnimateRange.x) + { + x = m_AnimateRange.x; + // Disable mesh after animation for animating out. + m_Mesh.SetActive(false); + } + localScale.x = x; + transform.localScale = localScale; + yield return null; + } + } + m_AnimationCoroutine = null; + } + } + +} // namespace TiltBrush diff --git a/Assets/Scripts/GUI/PushPullToolMenu.cs.meta b/Assets/Scripts/GUI/PushPullToolMenu.cs.meta new file mode 100644 index 0000000000..c1fb2c31ff --- /dev/null +++ b/Assets/Scripts/GUI/PushPullToolMenu.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6c931003f8e94de1bc6d07a5face43d0 +timeCreated: 1669377989 \ No newline at end of file diff --git a/Assets/Scripts/GUI/QuillChapterNavButton.cs b/Assets/Scripts/GUI/QuillChapterNavButton.cs new file mode 100644 index 0000000000..21da1b3d6d --- /dev/null +++ b/Assets/Scripts/GUI/QuillChapterNavButton.cs @@ -0,0 +1,34 @@ +// 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. + +namespace TiltBrush +{ + /// + /// Prev/next chapter navigation button for the Quill file browser. + /// Now finds the QuillLibraryPanel instead of individual file buttons + /// since chapter controls are centralized in the action area. + /// + public class QuillChapterNavButton : BaseButton + { + [UnityEngine.SerializeField] private bool m_IsNext; + + protected override void OnButtonPressed() + { + base.OnButtonPressed(); + var panel = GetComponentInParent(); + if (m_IsNext) panel?.OnNextChapterPressed(); + else panel?.OnPrevChapterPressed(); + } + } +} diff --git a/Assets/Scripts/GUI/QuillChapterNavButton.cs.meta b/Assets/Scripts/GUI/QuillChapterNavButton.cs.meta new file mode 100644 index 0000000000..56f2f21020 --- /dev/null +++ b/Assets/Scripts/GUI/QuillChapterNavButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 065fe1d14b34696409fc114babcd2c05 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/QuillFileButton.cs b/Assets/Scripts/GUI/QuillFileButton.cs new file mode 100644 index 0000000000..9e8ee771b1 --- /dev/null +++ b/Assets/Scripts/GUI/QuillFileButton.cs @@ -0,0 +1,125 @@ +// 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 System; +using TMPro; +using UnityEngine; + +namespace TiltBrush +{ + public class QuillFileButton : BaseButton + { + [SerializeField] private TextMeshPro m_LabelText; + [SerializeField] private bool m_MergeMode; + + [Header("Selection Visual State")] + [SerializeField] private GameObject m_SelectionBorder; + [SerializeField] private Renderer m_BackgroundRenderer; + [SerializeField] private Material m_SelectedMaterial; + + private QuillFileInfo m_QuillFile; + private bool m_IsSelected; + private Material m_DefaultMaterial; + + protected override void Awake() + { + base.Awake(); + m_DefaultMaterial = m_BackgroundRenderer?.material; + } + + public QuillFileInfo QuillFile + { + get => m_QuillFile; + set + { + m_QuillFile = value; + RefreshDescription(); + } + } + + public bool IsSelected + { + get => m_IsSelected; + set + { + if (m_IsSelected == value) return; + m_IsSelected = value; + UpdateSelectionVisuals(); + } + } + + private void UpdateSelectionVisuals() + { + if (m_SelectionBorder != null) + m_SelectionBorder.SetActive(m_IsSelected); + + if (m_DefaultMaterial != null && m_SelectedMaterial != null) + { + m_BackgroundRenderer.material = m_IsSelected ? m_SelectedMaterial : m_DefaultMaterial; + } + + // Subtle scale effect for selection + transform.localScale = m_IsSelected ? Vector3.one * 1.02f : Vector3.one; + } + + protected override void OnButtonPressed() + { + base.OnButtonPressed(); + + if (m_QuillFile == null || string.IsNullOrEmpty(m_QuillFile.FullPath)) + { + return; + } + + // New behavior: Select the file instead of loading it directly + var libraryPanel = GetComponentInParent(); + if (libraryPanel != null) + { + libraryPanel.SelectFile(m_QuillFile); + } + else + { + Debug.LogWarning("QuillFileButton could not find parent QuillLibraryPanel for selection"); + } + } + + public void RefreshDescription() + { + if (m_QuillFile == null) + { + SetLabelText(string.Empty); + SetDescriptionText(string.Empty); + SetExtraDescriptionText(string.Empty); + return; + } + + SetLabelText(m_QuillFile.DisplayName); + SetDescriptionText($"{m_QuillFile.DisplayName}"); + SetExtraDescriptionText($"{m_QuillFile.DescriptionLabel}"); + } + + private void SetLabelText(string value) + { + if (m_LabelText == null) + { + m_LabelText = GetComponentInChildren(); + } + + if (m_LabelText != null) + { + m_LabelText.text = value; + } + } + } +} diff --git a/Assets/Scripts/GUI/QuillFileButton.cs.meta b/Assets/Scripts/GUI/QuillFileButton.cs.meta new file mode 100644 index 0000000000..cbf2c2f7b3 --- /dev/null +++ b/Assets/Scripts/GUI/QuillFileButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c43692ba6a8cc634eb531df62deeac69 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/QuillLibraryPanel.cs b/Assets/Scripts/GUI/QuillLibraryPanel.cs new file mode 100644 index 0000000000..6f688129a3 --- /dev/null +++ b/Assets/Scripts/GUI/QuillLibraryPanel.cs @@ -0,0 +1,502 @@ +// 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 System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; + +namespace TiltBrush +{ + public class QuillLibraryPanel : ModalPanel + { + [Header("Quill Library")] + [SerializeField] private TextMeshPro m_PanelText; + [SerializeField] private string m_PanelTitle = "Quill Library"; + [SerializeField] private TextMeshPro m_InfoText; + [SerializeField] private GameObject m_NoQuillData; + [SerializeField] private GameObject m_NoImmData; + [SerializeField] private GameObject m_RefreshingSpinner; + [SerializeField] private GameObject m_ConfirmLoadPopUpPrefab; + + [Header("Selection & Action Controls")] + [SerializeField] private GameObject m_ActionControlsContainer; + [SerializeField] private ActionButton m_LoadButton; + [SerializeField] private ActionButton m_MergeButton; + [SerializeField] private GameObject m_ChapterControls; + [SerializeField] private TextMeshPro m_ChapterLabel; + [SerializeField] private QuillChapterNavButton m_PrevChapterButton; + [SerializeField] private QuillChapterNavButton m_NextChapterButton; + [SerializeField] private GameObject m_ChapterLoadingSpinner; + + private QuillFileCatalog m_Catalog; + private QuillFileInfo m_SelectedFile; + private bool m_IsDetectingChapters; + + private List m_IconButtons; + private QuillFileButton[] m_FileButtons; + private int m_EnabledCount; + + protected override List Icons => m_IconButtons; + + public override bool IsInButtonMode(ModeButton button) + { + QuillSourceButton sourceButton = button as QuillSourceButton; + if (sourceButton == null || m_Catalog == null) + { + return false; + } + + return (sourceButton.m_ButtonType == QuillSourceButton.Type.QuillProjects && + m_Catalog.CurrentSourceDirectory == QuillFileCatalog.SourceDirectory.QuillProjects) || + (sourceButton.m_ButtonType == QuillSourceButton.Type.Imm && + m_Catalog.CurrentSourceDirectory == QuillFileCatalog.SourceDirectory.Imm); + } + + public void ButtonPressed(QuillSourceButton.Type buttonType, QuillSourceButton button) + { + if (m_Catalog == null) + { + return; + } + + switch (buttonType) + { + case QuillSourceButton.Type.QuillProjects: + m_Catalog.SetSourceDirectory(QuillFileCatalog.SourceDirectory.QuillProjects); + break; + case QuillSourceButton.Type.Imm: + m_Catalog.SetSourceDirectory(QuillFileCatalog.SourceDirectory.Imm); + break; + } + + // Clear selection when switching directories + m_SelectedFile = null; + ResetPageIndex(); + RefreshPage(); + button.UpdateVisuals(); + } + + /// + /// Shows a confirmation popup before loading a Quill file that will clear the scene. + /// Requires m_ConfirmLoadPopUpPrefab to be set in the inspector. + /// + public void ShowConfirmLoadPopUp() + { + if (m_ConfirmLoadPopUpPrefab == null) + { + Debug.LogError("QuillLibraryPanel: m_ConfirmLoadPopUpPrefab is not set."); + return; + } + + CreatePopUp( + m_ConfirmLoadPopUpPrefab, Vector3.zero, + false, false, 0, 0, + SketchControlsScript.GlobalCommands.LoadQuillFile); + } + + /// + /// Selects a file for action. Called by QuillFileButton when clicked. + /// + public void SelectFile(QuillFileInfo file) + { + if (m_SelectedFile == file) return; + + // Clear previous selection visual state + if (m_SelectedFile != null) + { + UpdateFileButtonSelection(m_SelectedFile, false); + } + + m_SelectedFile = file; + + // Set new selection visual state + if (m_SelectedFile != null) + { + UpdateFileButtonSelection(m_SelectedFile, true); + StartCoroutine(DetectChaptersForSelectedFile()); + } + + RefreshActionControls(); + } + + private void UpdateFileButtonSelection(QuillFileInfo fileInfo, bool selected) + { + if (m_FileButtons == null) return; + + foreach (var button in m_FileButtons) + { + if (button.QuillFile != null && + button.QuillFile.FullPath == fileInfo.FullPath) + { + button.IsSelected = selected; + break; + } + } + } + + private IEnumerator DetectChaptersForSelectedFile() + { + if (m_SelectedFile == null) yield break; + + m_IsDetectingChapters = true; + if (m_ChapterLoadingSpinner != null) + m_ChapterLoadingSpinner.SetActive(true); + RefreshActionControls(); + + // For IMM files, add a longer delay to allow UI to update first + if (m_SelectedFile.SourceType == QuillSourceType.Imm) + { + yield return new WaitForSeconds(0.1f); // Let UI show spinner + } + else + { + yield return null; // Just yield one frame for Quill files + } + + var startTime = System.DateTime.Now; + + try + { + // This triggers lazy chapter detection + int chapterCount = m_SelectedFile.ChapterCount; + var elapsed = (System.DateTime.Now - startTime).TotalMilliseconds; + + // Set default chapter if not already set + if (m_SelectedFile.SelectedChapterIndex < 0) + { + m_SelectedFile.SelectedChapterIndex = 0; + } + } + catch (System.Exception ex) + { + var elapsed = (System.DateTime.Now - startTime).TotalMilliseconds; + Debug.LogError($"Failed to detect chapters for {m_SelectedFile.DisplayName} after {elapsed:F0}ms: {ex}"); + } + + m_IsDetectingChapters = false; + if (m_ChapterLoadingSpinner != null) + m_ChapterLoadingSpinner.SetActive(false); + RefreshActionControls(); + } + + private void RefreshActionControls() + { + bool hasSelection = m_SelectedFile != null; + bool isDetecting = m_IsDetectingChapters; + + // Show/hide action controls container + if (m_ActionControlsContainer != null) + m_ActionControlsContainer.SetActive(hasSelection); + + if (!hasSelection) return; + + // Enable/disable action buttons + if (m_LoadButton != null) + m_LoadButton.SetButtonAvailable(!isDetecting); + if (m_MergeButton != null) + m_MergeButton.SetButtonAvailable(!isDetecting); + + // Show/hide chapter controls - use optimistic check first for better performance + bool hasMultipleChapters = false; + if (!isDetecting) + { + if (m_SelectedFile.SourceType == QuillSourceType.Quill) + { + // Quill detection is fast + hasMultipleChapters = m_SelectedFile.HasMultipleChapters; + } + else + { + // IMM detection is slow - use optimistic approach during detection + hasMultipleChapters = m_SelectedFile.HasMultipleChaptersOptimistic; + } + } + + if (m_ChapterControls != null) + m_ChapterControls.SetActive(hasMultipleChapters); + + if (hasMultipleChapters) + { + RefreshChapterControls(); + } + } + + private void RefreshChapterControls() + { + if (m_SelectedFile == null || !m_SelectedFile.HasMultipleChapters) return; + + int count = m_SelectedFile.ChapterCount; + int current = m_SelectedFile.SelectedChapterIndex < 0 ? 0 : m_SelectedFile.SelectedChapterIndex; + + if (m_ChapterLabel != null) + m_ChapterLabel.text = $"Chapter {current + 1} / {count}"; + + // Enable/disable navigation buttons + if (m_PrevChapterButton != null) + m_PrevChapterButton.SetButtonAvailable(count > 1); + if (m_NextChapterButton != null) + m_NextChapterButton.SetButtonAvailable(count > 1); + } + + // Action button handlers - called by UI buttons via inspector + public void OnLoadButtonPressed() + { + if (m_SelectedFile == null) return; + _LoadFile(m_SelectedFile.FullPath, m_SelectedFile.SelectedChapterIndex); + } + + private void _LoadFile(string filePath, int chapterIndex) + { + Quill.PendingLoadOptions = new Quill.QuillLoadOptions + { + Path = filePath, + ChapterIndex = chapterIndex, + }; + SketchControlsScript.m_Instance.IssueGlobalCommand( + SketchControlsScript.GlobalCommands.LoadQuillFile, 0, 0); + } + + public void OnMergeButtonPressed() + { + if (m_SelectedFile == null) return; + + try + { + Quill.Load(m_SelectedFile.FullPath, chapterIndex: m_SelectedFile.SelectedChapterIndex); + } + catch (System.Exception ex) + { + Debug.LogError($"Failed to merge '{m_SelectedFile.FullPath}': {ex}"); + } + } + + public void OnPrevChapterPressed() + { + if (m_SelectedFile?.HasMultipleChapters != true) return; + + int count = m_SelectedFile.ChapterCount; + int current = m_SelectedFile.SelectedChapterIndex < 0 ? 0 : m_SelectedFile.SelectedChapterIndex; + m_SelectedFile.SelectedChapterIndex = (current - 1 + count) % count; + RefreshChapterControls(); + } + + public void OnNextChapterPressed() + { + if (m_SelectedFile?.HasMultipleChapters != true) return; + + int count = m_SelectedFile.ChapterCount; + int current = m_SelectedFile.SelectedChapterIndex < 0 ? 0 : m_SelectedFile.SelectedChapterIndex; + m_SelectedFile.SelectedChapterIndex = (current + 1) % count; + RefreshChapterControls(); + } + + protected override void Awake() + { + base.Awake(); + + EnsureCatalog(); + if (m_Catalog != null) + { + m_Catalog.CatalogChanged += OnCatalogChanged; + } + else + { + Debug.LogError("QuillLibraryPanel requires a scene-level QuillFileCatalog instance."); + } + } + + private void OnDestroy() + { + if (m_Catalog != null) + { + m_Catalog.CatalogChanged -= OnCatalogChanged; + } + } + + protected override void OnStart() + { + m_FileButtons = m_Mesh.GetComponentsInChildren(includeInactive: true); + m_IconButtons = new List(m_FileButtons.Length); + foreach (var button in m_FileButtons) + { + m_IconButtons.Add(button); + button.gameObject.SetActive(false); + } + + // Initialize action controls state + RefreshActionControls(); + + ResetPageIndex(); + RefreshPage(); + } + + protected override void OnEnablePanel() + { + base.OnEnablePanel(); + m_CurrentPageFlipState = PageFlipState.TransitionIn; + + if (m_EnabledCount > 0 && !App.PlatformConfig.UseFileSystemWatcher) + { + m_Catalog?.ForceCatalogScan(); + } + + m_EnabledCount++; + RefreshPage(); + } + + private void Update() + { + BaseUpdate(); + PageFlipUpdate(); + + if (m_RefreshingSpinner != null) + { + m_RefreshingSpinner.SetActive(m_Catalog != null && m_Catalog.IsScanning); + } + } + + protected override void RefreshPage() + { + if (m_PanelText != null) + { + string suffix = m_Catalog != null && + m_Catalog.CurrentSourceDirectory == QuillFileCatalog.SourceDirectory.Imm + ? "IMM" + : "Quill"; + m_PanelText.text = $"{m_PanelTitle} - {suffix}"; + } + + if (m_FileButtons == null || m_FileButtons.Length == 0 || m_Catalog == null) + { + m_NumPages = 1; + UpdateEmptyState(); + base.RefreshPage(); + return; + } + + m_NumPages = GetPageCount(); + + for (int i = 0; i < m_FileButtons.Length; ++i) + { + int catalogIndex = m_IndexOffset + i; + bool visible = catalogIndex < m_Catalog.ItemCount; + var button = m_FileButtons[i]; + if (visible) + { + var fileInfo = m_Catalog.GetFileAtIndex(catalogIndex); + button.QuillFile = fileInfo; + button.SetButtonAvailable(true); + + // Update selection visual state + button.IsSelected = (m_SelectedFile != null && + m_SelectedFile.FullPath == fileInfo.FullPath); + } + button.gameObject.SetActive(visible); + } + + UpdateEmptyState(); + + if (m_InfoText != null) + { + m_InfoText.text = $"{m_Catalog.ItemCount} Files"; + } + + RefreshActionControls(); + base.RefreshPage(); + } + + private void UpdateEmptyState() + { + bool hasCatalog = m_Catalog != null; + bool hasFiles = hasCatalog && m_Catalog.ItemCount > 0; + bool isImmSource = hasCatalog && + m_Catalog.CurrentSourceDirectory == QuillFileCatalog.SourceDirectory.Imm; + + if (m_NoQuillData != null) + { + m_NoQuillData.SetActive(!hasFiles && !isImmSource); + } + + if (m_NoImmData != null) + { + m_NoImmData.SetActive(!hasFiles && isImmSource); + } + } + + private int GetPageCount() + { + if (m_Catalog == null || m_FileButtons == null || m_FileButtons.Length == 0) + { + return 1; + } + + if (m_Catalog.ItemCount == 0) + { + return 1; + } + + return ((m_Catalog.ItemCount - 1) / m_FileButtons.Length) + 1; + } + + private void OnCatalogChanged() + { + // Verify selection is still valid after catalog refresh + if (m_SelectedFile != null && m_Catalog != null) + { + bool fileStillExists = false; + for (int i = 0; i < m_Catalog.ItemCount; i++) + { + var file = m_Catalog.GetFileAtIndex(i); + if (file.FullPath == m_SelectedFile.FullPath) + { + fileStillExists = true; + // Update reference to refreshed file info + m_SelectedFile = file; + break; + } + } + + if (!fileStillExists) + { + m_SelectedFile = null; + } + } + + if (PageIndex > GetPageCount() - 1) + { + GotoPage(0); + } + + RefreshPage(); + } + + private void EnsureCatalog() + { + m_Catalog = QuillFileCatalog.Instance; + } + + public void SetInitialSearchText(KeyboardPopupButton btn) + { + KeyboardPopUpWindow.m_InitialText = QuillFileCatalog.Instance.SearchText; + } + + public void HandleRandomFileButton() + { + var path = m_Catalog.GetRandomFile(); + Debug.Log($"Loading: {path}"); + _LoadFile(path, 0); + } + } +} diff --git a/Assets/Scripts/GUI/QuillLibraryPanel.cs.meta b/Assets/Scripts/GUI/QuillLibraryPanel.cs.meta new file mode 100644 index 0000000000..8a266ce023 --- /dev/null +++ b/Assets/Scripts/GUI/QuillLibraryPanel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de42dd7c67225e547a781317d2062c31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/QuillSourceButton.cs b/Assets/Scripts/GUI/QuillSourceButton.cs new file mode 100644 index 0000000000..95539d7e95 --- /dev/null +++ b/Assets/Scripts/GUI/QuillSourceButton.cs @@ -0,0 +1,36 @@ +// 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. + +namespace TiltBrush +{ + public class QuillSourceButton : ModeButton + { + public enum Type + { + QuillProjects, + Imm, + } + + public Type m_ButtonType; + + protected override void OnButtonPressed() + { + QuillLibraryPanel panel = m_Manager.GetComponent(); + if (panel) + { + panel.ButtonPressed(m_ButtonType, this); + } + } + } +} diff --git a/Assets/Scripts/GUI/QuillSourceButton.cs.meta b/Assets/Scripts/GUI/QuillSourceButton.cs.meta new file mode 100644 index 0000000000..3533ed1c3f --- /dev/null +++ b/Assets/Scripts/GUI/QuillSourceButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89df2240ec38bba4ab319c4701429927 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/ReferenceButton.cs b/Assets/Scripts/GUI/ReferenceButton.cs index 17ffcc6391..25b1fcc662 100644 --- a/Assets/Scripts/GUI/ReferenceButton.cs +++ b/Assets/Scripts/GUI/ReferenceButton.cs @@ -24,7 +24,8 @@ public enum Type AddAssets, Videos, BackgroundImages, - SavedStrokes + SavedStrokes, + SoundClips } public Type m_ButtonType; diff --git a/Assets/Scripts/GUI/ReferencePanel.cs b/Assets/Scripts/GUI/ReferencePanel.cs index e4a665f150..a71e6e31ca 100644 --- a/Assets/Scripts/GUI/ReferencePanel.cs +++ b/Assets/Scripts/GUI/ReferencePanel.cs @@ -231,7 +231,8 @@ protected override void RefreshPage() ReferenceButton.Type.BackgroundImages => BackgroundImageCatalog.m_Instance.CurrentBackgroundImagesDirectory, ReferenceButton.Type.Models => ModelCatalog.m_Instance.CurrentModelsDirectory, ReferenceButton.Type.Videos => VideoCatalog.Instance.CurrentVideoDirectory, - ReferenceButton.Type.SavedStrokes => SavedStrokesCatalog.Instance.CurrentSavedStrokesDirectory + ReferenceButton.Type.SavedStrokes => SavedStrokesCatalog.Instance.CurrentSavedStrokesDirectory, + ReferenceButton.Type.SoundClips => SoundClipCatalog.Instance.CurrentSoundClipDirectory }; string displayPath; @@ -258,7 +259,7 @@ protected override void RefreshPage() } else { - displayPath = currentDir.Substring(App.MediaLibraryPath().Length); + displayPath = currentDir?.Substring(App.MediaLibraryPath().Length); } if (m_DirectoryChooserPopupButton != null) diff --git a/Assets/Scripts/GUI/SculptSubToolButton.cs b/Assets/Scripts/GUI/SculptSubToolButton.cs new file mode 100644 index 0000000000..91ede73d79 --- /dev/null +++ b/Assets/Scripts/GUI/SculptSubToolButton.cs @@ -0,0 +1,30 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 UnityEngine; + +namespace TiltBrush +{ + public class SculptSubToolButton : BaseButton + { + + [SerializeField] + public SculptSubToolManager.SubTool m_SubTool; + + override protected void OnButtonPressed() + { + SculptSubToolManager.m_Instance.SetSubTool(m_SubTool); + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/GUI/SculptSubToolButton.cs.meta b/Assets/Scripts/GUI/SculptSubToolButton.cs.meta new file mode 100644 index 0000000000..a6cecb53b6 --- /dev/null +++ b/Assets/Scripts/GUI/SculptSubToolButton.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7ca17e77a3344482a680548a69297103 +timeCreated: 1669377989 \ No newline at end of file diff --git a/Assets/Scripts/GUI/SketchSurfacePanel.cs b/Assets/Scripts/GUI/SketchSurfacePanel.cs index 8d02f5c7b4..0d47a283ea 100644 --- a/Assets/Scripts/GUI/SketchSurfacePanel.cs +++ b/Assets/Scripts/GUI/SketchSurfacePanel.cs @@ -259,6 +259,7 @@ public void VerifyValidToolWithColorUpdate() { if (ActiveTool.m_Type != BaseTool.ToolType.RepaintTool && ActiveTool.m_Type != BaseTool.ToolType.RecolorTool && + ActiveTool.m_Type != BaseTool.ToolType.TintColorTool && ActiveTool.m_Type != BaseTool.ToolType.ScriptedTool) { EnableDefaultTool(); diff --git a/Assets/Scripts/GUI/SoundClipPositionSlider.cs b/Assets/Scripts/GUI/SoundClipPositionSlider.cs new file mode 100644 index 0000000000..0f27070c40 --- /dev/null +++ b/Assets/Scripts/GUI/SoundClipPositionSlider.cs @@ -0,0 +1,51 @@ +// Copyright 2020 The Tilt 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. + +namespace TiltBrush +{ + public class SoundClipPositionSlider : BaseSlider + { + + private SoundClipWidget m_SoundClipWidget; + + public SoundClipWidget SoundClipWidget + { + get { return m_SoundClipWidget; } + set { m_SoundClipWidget = value; } + } + + public override void UpdateValue(float value) + { + if (m_SoundClipWidget == null || m_SoundClipWidget.SoundClipController == null) + { + return; + } + m_SoundClipWidget.SoundClipController.Position = value; + } + + protected virtual void Update() + { + m_IsAvailable = m_SoundClipWidget != null && m_SoundClipWidget.SoundClipController != null; + if (m_IsAvailable) + { + m_CurrentValue = m_SoundClipWidget.SoundClipController.Position; + } + else + { + m_CurrentValue = 0; + } + SetSliderPositionToReflectValue(); + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/GUI/SoundClipPositionSlider.cs.meta b/Assets/Scripts/GUI/SoundClipPositionSlider.cs.meta new file mode 100644 index 0000000000..36cb3a1f40 --- /dev/null +++ b/Assets/Scripts/GUI/SoundClipPositionSlider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e4806aced191314da8c00dae0231e5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/GUI/TintColorAmountSlider.cs b/Assets/Scripts/GUI/TintColorAmountSlider.cs new file mode 100644 index 0000000000..050d7bfda1 --- /dev/null +++ b/Assets/Scripts/GUI/TintColorAmountSlider.cs @@ -0,0 +1,43 @@ +// 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 UnityEngine; +namespace TiltBrush +{ + + public class TintColorAmountSlider : AdvancedSlider + { + public BaseTool.ToolType m_ShowOnToolType; + + protected override void Awake() + { + base.Awake(); + SetSliderPositionToReflectValue(); + App.Switchboard.ToolChanged += OnToolChanged; + gameObject.SetActive(false); + } + + protected void OnToolChanged() + { + bool isTintTool = SketchSurfacePanel.m_Instance.GetCurrentToolType() == m_ShowOnToolType; + gameObject.SetActive(isTintTool); + } + + public void HandleValueChanged(Vector3 val) + { + var tintTool = SketchSurfacePanel.m_Instance.GetToolOfType(BaseTool.ToolType.TintColorTool) as TintColorTool; + if (tintTool != null) tintTool.EffectAmount = val.z; + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/GUI/TintColorAmountSlider.cs.meta b/Assets/Scripts/GUI/TintColorAmountSlider.cs.meta new file mode 100644 index 0000000000..eb9bc18095 --- /dev/null +++ b/Assets/Scripts/GUI/TintColorAmountSlider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7a6a239b20194b669fed1c3d221b49d0 +timeCreated: 1771417081 \ No newline at end of file diff --git a/Assets/Scripts/GltfAudioSource.cs b/Assets/Scripts/GltfAudioSource.cs new file mode 100644 index 0000000000..69ddb64e8b --- /dev/null +++ b/Assets/Scripts/GltfAudioSource.cs @@ -0,0 +1,103 @@ +// 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 System.Collections; +using System.IO; +using UnityEngine; +using UnityEngine.Networking; + +namespace TiltBrush +{ + /// + /// Attached to audio-emitter nodes imported from GLTF KHR_audio_emitter. + /// Loads and plays audio when the model is active in the scene, and provides + /// the data needed to create a SoundClipWidget when the model is broken apart. + /// + public class GltfAudioSource : MonoBehaviour + { + public string AbsoluteFilePath; + public float Gain = 1f; + public bool Loop = true; + public float SpatialBlend = 0f; + public float MinDistance = 1f; + public float MaxDistance = 500f; + public bool AutoPlay = true; + + private AudioSource _audioSource; + private AudioClip _loadedClip; + + private void Awake() + { + _audioSource = GetComponent(); + if (_audioSource == null) + _audioSource = gameObject.AddComponent(); + } + + private void OnEnable() + { + if (GetComponentInParent() == null) return; + + if (_loadedClip != null) + { + _audioSource.clip = _loadedClip; + if (AutoPlay) _audioSource.Play(); + } + else if (!string.IsNullOrEmpty(AbsoluteFilePath) && File.Exists(AbsoluteFilePath)) + { + StartCoroutine(LoadAndPlay()); + } + } + + private void OnDisable() + { + _audioSource.Stop(); + StopAllCoroutines(); + } + + private IEnumerator LoadAndPlay() + { + string url = $"file:///{AbsoluteFilePath.Replace('\\', '/')}"; + AudioType audioType = GetAudioType(AbsoluteFilePath); + using var request = UnityWebRequestMultimedia.GetAudioClip(url, audioType); + yield return request.SendWebRequest(); + + if (request.result == UnityWebRequest.Result.Success) + { + _loadedClip = DownloadHandlerAudioClip.GetContent(request); + _audioSource.clip = _loadedClip; + _audioSource.volume = Gain; + _audioSource.loop = Loop; + _audioSource.spatialBlend = SpatialBlend; + _audioSource.minDistance = MinDistance; + _audioSource.maxDistance = MaxDistance; + if (AutoPlay) _audioSource.Play(); + } + else + { + Debug.LogWarning($"[GltfAudio] Failed to load audio from {AbsoluteFilePath}: {request.error}"); + } + } + + private static AudioType GetAudioType(string path) + { + return Path.GetExtension(path).ToLowerInvariant() switch + { + ".mp3" => AudioType.MPEG, + ".wav" => AudioType.WAV, + ".ogg" => AudioType.OGGVORBIS, + _ => AudioType.UNKNOWN, + }; + } + } +} diff --git a/Assets/Scripts/GltfAudioSource.cs.meta b/Assets/Scripts/GltfAudioSource.cs.meta new file mode 100644 index 0000000000..2ede5fbc8c --- /dev/null +++ b/Assets/Scripts/GltfAudioSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24a6c8dc3efb3304f8818493680e06d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ImportGltfast.cs b/Assets/Scripts/ImportGltfast.cs index 6cd0f9198a..96babf3619 100644 --- a/Assets/Scripts/ImportGltfast.cs +++ b/Assets/Scripts/ImportGltfast.cs @@ -117,6 +117,9 @@ private static async Task _ImportUsingUnityGltf( options.DataLoader = new FileLoader(Path.GetDirectoryName(fullPath)); GLTFSceneImporter gltf = new GLTFSceneImporter(Path.GetFileName(fullPath), options); + if (options.ImportContext.TryGetPlugin(out var audioPlugin)) + audioPlugin.GltfDirectory = Path.GetDirectoryName(localPath); + // Device builds only: GLTFSceneImporter hard-forces this false in the editor (to // avoid a historical editor freeze), so editor imports stay single-threaded regardless. // In a player build it moves mesh/buffer construction off the main thread, shrinking diff --git a/Assets/Scripts/Input/ControllerGeometry.cs b/Assets/Scripts/Input/ControllerGeometry.cs index 633007e5aa..2cb17fd36a 100644 --- a/Assets/Scripts/Input/ControllerGeometry.cs +++ b/Assets/Scripts/Input/ControllerGeometry.cs @@ -764,6 +764,60 @@ public void ShowSelectionToggle() } } + public void ShowSculptToggle(bool SculptOn) + { + Material toggleSculptMat = Materials.Blank; + toggleSculptMat = SculptOn ? Materials.ToggleSelectionOn : Materials.ToggleSelectionOff; + + switch (Style) + { + case ControllerStyle.Vive: + case ControllerStyle.LogitechPen: + Materials.Assign(PadMesh, toggleSculptMat); + break; + case ControllerStyle.OculusTouch: + case ControllerStyle.Knuckles: + Materials.Assign(JoystickPad, SelectPadTouched(Materials.BrushSizerActive, Materials.BrushSizer)); + Materials.Assign(JoystickMesh, SelectPadTouched(Materials.Blank, Materials.BrushSizer)); + float ratio = GetPadRatio(VrInput.Directional); + JoystickPad.material.SetFloat("_Ratio", ratio); + Materials.Assign(Button01Mesh, toggleSculptMat); + break; + case ControllerStyle.Wmr: + Materials.Assign(PadMesh, toggleSculptMat); + ShowBrushSizer(); + break; + } + } + + public void ShowTintMode(bool isOn, Texture2D icon) + { + Material mat = isOn ? Materials.ToggleSelectionOn : Materials.ToggleSelectionOff; + + switch (Style) + { + case ControllerStyle.Vive: + case ControllerStyle.LogitechPen: + Materials.Assign(PadMesh, mat); + if (icon != null) { PadMesh.material.SetTexture("_EmissionMap", icon); } + break; + case ControllerStyle.OculusTouch: + case ControllerStyle.Knuckles: + Materials.Assign(JoystickPad, SelectPadTouched(Materials.BrushSizerActive, Materials.BrushSizer)); + Materials.Assign(JoystickMesh, SelectPadTouched(Materials.Blank, Materials.BrushSizer)); + float ratio = GetPadRatio(VrInput.Directional); + JoystickPad.material.SetFloat("_Ratio", ratio); + Materials.Assign(Button01Mesh, mat); + if (icon != null) { Button01Mesh.material.SetTexture("_EmissionMap", icon); } + break; + case ControllerStyle.Wmr: + Materials.Assign(PadMesh, mat); + if (icon != null) { PadMesh.material.SetTexture("_EmissionMap", icon); } + ShowBrushSizer(); + break; + } + } + public void ShowPinToggle(bool isPinning) { Material togglePinMat = Materials.Blank; diff --git a/Assets/Scripts/Input/ControllerInfo.cs b/Assets/Scripts/Input/ControllerInfo.cs index 5421215841..ab6db115bc 100644 --- a/Assets/Scripts/Input/ControllerInfo.cs +++ b/Assets/Scripts/Input/ControllerInfo.cs @@ -302,6 +302,8 @@ public bool GetCommandDown(SketchCommands rCommand) case SketchCommands.DuplicateSelection: return GetVrInputDown(VrInput.Button04); case SketchCommands.ToggleSelection: + case SketchCommands.TogglePushPull: + case SketchCommands.ToggleTintColor: return GetVrInputDown(VrInput.Button04); } return false; diff --git a/Assets/Scripts/InputManager.cs b/Assets/Scripts/InputManager.cs index 6597a2cdae..6f581e4f9a 100644 --- a/Assets/Scripts/InputManager.cs +++ b/Assets/Scripts/InputManager.cs @@ -86,6 +86,8 @@ public enum SketchCommands Trash, Share, Fly, + TogglePushPull = 5100, + ToggleTintColor = 5101, ScriptedTool = 6000, } @@ -718,6 +720,8 @@ public bool GetCommandDown(SketchCommands rCommand) case SketchCommands.ToggleDefaultTool: case SketchCommands.MenuContextClick: case SketchCommands.ToggleSelection: + case SketchCommands.TogglePushPull: + case SketchCommands.ToggleTintColor: return Brush.GetCommandDown(rCommand); // Misc diff --git a/Assets/Scripts/Playback/StrokePlayback.cs b/Assets/Scripts/Playback/StrokePlayback.cs index 06eddbacc1..c7ecbf025c 100644 --- a/Assets/Scripts/Playback/StrokePlayback.cs +++ b/Assets/Scripts/Playback/StrokePlayback.cs @@ -112,7 +112,7 @@ public void Update() if (!m_stroke.m_ControlPointsToDrop[m_nextControlPoint]) { - rPointerScript.UpdateLineFromControlPoint(cp); + rPointerScript.UpdateLineFromControlPoint(cp, m_stroke.GetColor(m_nextControlPoint)); needMeshUpdate = true; lastCp = cp; needPointerUpdate = true; diff --git a/Assets/Scripts/PointerManager.cs b/Assets/Scripts/PointerManager.cs index fc5877620e..4cb8d6bbff 100644 --- a/Assets/Scripts/PointerManager.cs +++ b/Assets/Scripts/PointerManager.cs @@ -385,6 +385,32 @@ public List SymmetryPointerBrushes set { m_SymmetryPointerBrushes = value; } } + public List SymmetryPointerColorOverrides + { + get => m_Pointers.Select(p => p.m_Script.CurrentColorOverride).ToList(); + set + { + for (var i = 0; i < Math.Min(m_Pointers.Length, value.Count); i++) + { + var p = m_Pointers[i]; + p.m_Script.CurrentColorOverride = value[i]; + } + } + } + + public List SymmetryPointerColorOverrideModes + { + get => m_Pointers.Select(p => p.m_Script.CurrentColorOverrideMode).ToList(); + set + { + for (var i = 0; i < Math.Min(m_Pointers.Length, value.Count); i++) + { + var p = m_Pointers[i]; + p.m_Script.CurrentColorOverrideMode = value[i]; + } + } + } + static public void ClearPlayerPrefs() { PlayerPrefs.DeleteKey(PLAYER_PREFS_POINTER_ANGLE_OLD); @@ -1389,7 +1415,7 @@ private void UpdateScriptedTransforms(out bool bNeedsDummyPointer) case ScriptCoordSpace.Canvas: { bNeedsDummyPointer = false; - newTr_CS = TrTransform.T(tr.translation - LuaManager.Instance.GetPastBrushPos(0)); + newTr_CS = TrTransform.T(tr.translation); break; } case ScriptCoordSpace.Pointer: @@ -2224,5 +2250,29 @@ public List GetSymmetriesForCurrentMode() } return xfSymmetriesGS; } + + public void SetAllPointerColorOverrides(Color color) + { + for (int i = 0; i < m_NumActivePointers; ++i) + { + m_Pointers[i].m_Script.CurrentColorOverride = color; + } + } + + public void SetAllPointerColorOverrideModes(ColorOverrideMode mode) + { + for (int i = 0; i < m_NumActivePointers; ++i) + { + m_Pointers[i].m_Script.CurrentColorOverrideMode = mode; + } + } + + public void ClearSymmetryPointerColorOverrides() + { + for (int i = 0; i < m_NumActivePointers; ++i) + { + m_Pointers[i].m_Script.CurrentColorOverrideMode = ColorOverrideMode.None; + } + } } } // namespace TiltBrush diff --git a/Assets/Scripts/PointerScript.cs b/Assets/Scripts/PointerScript.cs index 15d9566be0..df07957eb3 100644 --- a/Assets/Scripts/PointerScript.cs +++ b/Assets/Scripts/PointerScript.cs @@ -15,9 +15,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using UnityEngine; -using Random = UnityEngine.Random; namespace TiltBrush { @@ -74,6 +72,8 @@ public enum BrushLerp private float m_CurrentBrushSize; // In pointer aka room space private Vector2 m_BrushSizeRange; private float m_CurrentPressure; // TODO: remove and query line instead? + public Color32? CurrentColorOverride { get; set; } + public ColorOverrideMode CurrentColorOverrideMode { get; set; } private BaseBrushScript m_CurrentLine; private ParametricStrokeCreator m_CurrentCreator; private float m_ParametricCreatorBackupStrokeSize; // In pointer aka room space @@ -94,6 +94,7 @@ public enum BrushLerp private List m_PreviewControlPoints; // FIFO queue private List m_ControlPoints; + private List m_ControlPointColors; // Used by the API public List CurrentPath @@ -589,7 +590,8 @@ public void UpdateLineFromObject() return; } - bool bQuadCreated = m_CurrentLine.UpdatePosition_LS(xf_LS, m_CurrentPressure); + Color32? colorOverride = CurrentColorOverrideMode == ColorOverrideMode.None ? null : CurrentColorOverride; + bool bQuadCreated = m_CurrentLine.UpdatePosition_LS(xf_LS, m_CurrentPressure, colorOverride); // TODO: let brush take care of storing control points, not us SetControlPoint(xf_LS, isKeeper: bQuadCreated); @@ -631,11 +633,11 @@ public void UpdateLineFromObject() /// - Do _not_ apply any normal adjustment; it's baked into the control point /// - Do not update the mesh /// TODO: replace with a bulk-ControlPoint API - public void UpdateLineFromControlPoint(PointerManager.ControlPoint cp) + public void UpdateLineFromControlPoint(PointerManager.ControlPoint cp, Color32 color) { float scale = m_CurrentLine.StrokeScale; m_CurrentLine.UpdatePosition_LS( - TrTransform.TRS(cp.m_Pos, cp.m_Orient, scale), cp.m_Pressure); + TrTransform.TRS(cp.m_Pos, cp.m_Orient, scale), cp.m_Pressure, color); } /// Bulk control point addition @@ -649,9 +651,13 @@ public void UpdateLineFromStroke(Stroke stroke) simplifier.CalculatePointsToDrop(stroke, CurrentBrushScript); } float scale = m_CurrentLine.StrokeScale; - foreach (var cp in stroke.m_ControlPoints.Where((x, i) => !stroke.m_ControlPointsToDrop[i])) + for (int i = 0; i < stroke.m_ControlPoints.Length; i++) { - m_CurrentLine.UpdatePosition_LS(TrTransform.TRS(cp.m_Pos, cp.m_Orient, scale), cp.m_Pressure); + if (stroke.m_ControlPointsToDrop[i]) continue; + var cp = stroke.m_ControlPoints[i]; + Color32 color = stroke.GetColor(i); + m_CurrentLine.UpdatePosition_LS( + TrTransform.TRS(cp.m_Pos, cp.m_Orient, scale), cp.m_Pressure, color); } } @@ -874,6 +880,11 @@ public void SetControlPoint(TrTransform lastSpawnXf_LS, bool isKeeper) } m_LastControlPointIsKeeper = isKeeper; + + if (!m_CurrentLine) return; + if (CurrentColorOverrideMode == ColorOverrideMode.None) return; + m_ControlPointColors ??= Enumerable.Repeat((Color32?)null, m_ControlPoints.Count).ToList(); + m_ControlPointColors.Add(CurrentColorOverride); } /// Pass a Canvas parent, and a transform in that canvas's space. @@ -1040,8 +1051,10 @@ public void DetachLine( WidgetManager.m_Instance.ActiveStencil, m_LineLength_CS, m_CurrentLine.RandomSeed, - isFinalStroke - ); + isFinalStroke, + m_ControlPointColors, + CurrentColorOverrideMode + ); } else { @@ -1079,7 +1092,10 @@ public void DetachLine( m_CurrentBrushSize, m_CurrentLine.StrokeScale, m_ControlPoints, strokeFlags, - WidgetManager.m_Instance.ActiveStencil, m_LineLength_CS); + WidgetManager.m_Instance.ActiveStencil, m_LineLength_CS, + m_CurrentLine.StrokeData?.m_OverrideColors, + m_CurrentLine.StrokeData?.m_ColorOverrideMode ?? ColorOverrideMode.None + ); } else { @@ -1153,6 +1169,7 @@ public GameObject BeginLineFromMemory(Stroke stroke, CanvasScript canvas) CreateNewLine(canvas, xf_CS, null); m_CurrentLine.SetIsLoading(); m_CurrentLine.RandomSeed = stroke.m_Seed; + m_CurrentLine.SetStrokeData(stroke); return m_CurrentLine.gameObject; } diff --git a/Assets/Scripts/Quill.cs b/Assets/Scripts/Quill.cs new file mode 100644 index 0000000000..ef55cd02db --- /dev/null +++ b/Assets/Scripts/Quill.cs @@ -0,0 +1,1938 @@ +// 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 System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; +using SQ = SharpQuill; + +namespace TiltBrush +{ + public static class Quill + { + /// + /// Options passed when the LoadQuillFile global command fires. + /// Set before issuing LoadQuillConfirmUnsaved or LoadQuillFile. + /// + public class QuillLoadOptions + { + public string Path { get; set; } + /// Chapter index to load. -1 = default (first/only chapter). + public int ChapterIndex { get; set; } = -1; + } + + public static QuillLoadOptions PendingLoadOptions { get; set; } + + /// + /// Backward-compatible shim. Reads/writes PendingLoadOptions.Path with ChapterIndex=-1. + /// + public static string PendingLoadPath + { + get => PendingLoadOptions?.Path; + set + { + if (value == null) + { + PendingLoadOptions = null; + } + else if (PendingLoadOptions == null) + { + PendingLoadOptions = new QuillLoadOptions { Path = value }; + } + else + { + PendingLoadOptions.Path = value; + } + } + } + + /// + /// The background color from the most recently loaded Quill sequence, in gamma space. + /// Null if no Quill file has been loaded yet. + /// + public static Color? LastLoadedBackgroundColor { get; private set; } + + /// + /// Filename (relative to App.BackgroundImagesLibraryPath) of a 360 equirectangular image + /// found in the most recently loaded Quill sequence. Null if none was found. + /// Only set during a full load, not during merge imports. + /// + public static string LastLoaded360SkyboxName { get; private set; } + + // Quill-specific brush GUIDs + private const string BRUSH_QUILL_CYLINDER = "f1c4e3e7-2a9f-4b5d-8c3e-7d9a1f8e6b4c"; + private const string BRUSH_QUILL_ELLIPSE = "a2d5f6b8-9c1e-4f3a-7b8d-2e6c9f4a1d5b"; + private const string BRUSH_QUILL_CUBE = "b3e7f8c2-4d5a-1e9b-6c8f-3a7d2f1e9c4b"; + private const string BRUSH_QUILL_RIBBON = "c4f8b3e2-9d1a-5e7f-4c3b-8a6d2f9e1c7b"; + + public static void Load( + string path, int maxStrokes = 0, + bool loadAnimations = false, string layerName = null, + bool flattenHierarchy = true, bool layersCanTransform = false, + int chapterIndex = -1) + { + string kind; + SQ.Sequence sequence = null; + if (Directory.Exists(path)) + { + kind = "quill"; + sequence = SQ.QuillSequenceReader.Read(path); + if (chapterIndex >= 0 && sequence != null) + { + ApplyQuillChapterFilter(sequence, chapterIndex, path); + } + } + else if (File.Exists(path)) + { + kind = "imm"; + sequence = ImmStrokeReader.SharpQuillCompat.ReadImmAsSequence(path, includePictures: true, chapterIndex: chapterIndex); + } + else + { + Debug.LogError($"Quill load path not found: {path}"); + return; + } + + var recorder = new QuillStatsRecorder(); + s_QuillStatsRecorder = recorder; + try + { + if (sequence == null) + { + Debug.LogError("Failed to read Quill sequence"); + return; + } + + // Store background color (Quill colors are linear; convert to gamma for Unity) + var sqBg = sequence.BackgroundColor; + LastLoadedBackgroundColor = new Color(sqBg.R, sqBg.G, sqBg.B).gamma; + LastLoaded360SkyboxName = null; + + if (!flattenHierarchy) + { + Debug.LogWarning("Quill hierarchy import not implemented yet; using flattening path."); + } + + // Recurse layers and collect all strokes + int strokeCount = 0; + List allCollectedStrokes = new List(); + List createdLayers = new List(); + List createdWidgets = new List(); + Dictionary imageCache = new Dictionary(StringComparer.OrdinalIgnoreCase); + string quillImageDirectory = GetQuillImageDirectory(path); + string quillSoundDirectory = GetQuillSoundDirectory(path); + + // The "correct" 10x global scale correction for Open Brush units creates issues + // where the scene is hard to see even at max zoom. + // 1x is a bit too small - so I went with an arbitrary 2x scale + Matrix4x4 globalCorrection = Matrix4x4.Scale(Vector3.one * 2f); + + // The RootLayer itself can have a transform + Matrix4x4 rootWorldNoFlip = globalCorrection * ConvertSQTransformMatrix(sequence.RootLayer.Transform, includeFlip: false); + Matrix4x4 rootWorldWithFlip = globalCorrection * ConvertSQTransformMatrix(sequence.RootLayer.Transform, includeFlip: true); + + bool rootVisible = sequence.RootLayer == null || sequence.RootLayer.Visible; + float rootOpacity = sequence.RootLayer == null ? 1f : sequence.RootLayer.Opacity; + if (!rootVisible || rootOpacity <= 0f) + { + return; + } + + // Iterate only over top-level layers of the root group + foreach (var topLevelLayer in sequence.RootLayer.Children) + { + // NOTE: IMM imports flatten hierarchy in the adapter, so name filtering + // only matches top-level layer names in that path. + if (!string.IsNullOrEmpty(layerName) && !LayerContainsName(topLevelLayer, layerName)) + { + continue; + } + + if (!IsLayerRenderable(topLevelLayer, rootVisible, rootOpacity, out _, out _)) + { + continue; + } + + // Create exactly one OB layer for each top-level Quill layer + CanvasScript obLayer = App.Scene.AddLayerNow(); + App.Scene.RenameLayer(obLayer, topLevelLayer.Name); + + Matrix4x4 localNoFlip = ConvertSQTransformMatrix(topLevelLayer.Transform, includeFlip: false); + Matrix4x4 localWithFlip = ConvertSQTransformMatrix(topLevelLayer.Transform, includeFlip: true); + + // Calculate world transform for this top-level layer + Matrix4x4 topLevelWorldNoFlip = rootWorldNoFlip * localNoFlip; + Matrix4x4 topLevelWorldWithFlip = rootWorldWithFlip * localWithFlip; + + // layersCanTransform is currently always false + // because layers with non-uniform transforms are buggy + // but will be important for later animation functionality + if (layersCanTransform) + { + obLayer.Pose = TrTransform.FromMatrix4x4(topLevelWorldNoFlip); + } + createdLayers.Add(obLayer); + + if (recorder != null) + { + Matrix4x4 pivotMatrix = ConvertSQTransformMatrix(topLevelLayer.Pivot, includeFlip: true); + recorder.RecordLayer(topLevelLayer.Name, topLevelWorldNoFlip, topLevelWorldWithFlip, localNoFlip, localWithFlip, pivotMatrix); + } + + // Recurse into children and flatten ALL descendant strokes into this obLayer + TraverseAndFlattenLayers( + topLevelLayer, + topLevelWorldWithFlip, + obLayer, + ref strokeCount, + maxStrokes, + loadAnimations, + allCollectedStrokes, + createdWidgets, + imageCache, + path, + quillImageDirectory, + quillSoundDirectory, + layerName, + includeAllDescendants: false, + parentVisible: rootVisible, + parentOpacity: rootOpacity); + + if (maxStrokes > 0 && strokeCount >= maxStrokes) break; + } + + if (allCollectedStrokes.Count > 0) + { + // Register strokes in memory list first + foreach (var stroke in allCollectedStrokes) + { + SketchMemoryScript.m_Instance.MemoryListAdd(stroke); + } + + // Optimized batch rendering + SketchMemoryScript.m_Instance.RenderStrokesDirectly(allCollectedStrokes); + + // Finalize batches + foreach (var layer in createdLayers) + { + layer.BatchManager.FlushMeshUpdates(); + } + + } + + if (allCollectedStrokes.Count > 0 || createdWidgets.Count > 0) + { + // Single undo step for all strokes, layers, and widgets + var cmd = new LoadQuillCommand(allCollectedStrokes, createdLayers, createdWidgets); + SketchMemoryScript.m_Instance.PerformAndRecordCommand(cmd); + + if (maxStrokes > 0 && strokeCount >= maxStrokes) + { + Debug.LogWarning($"Reached maxStrokes limit ({maxStrokes}). Partial load complete."); + } + } + } + finally + { + QuillDiagnostics.LastLoad = recorder.ToStats(path, kind); + s_QuillStatsRecorder = null; + } + + } + + private static void TraverseAndFlattenLayers( + SQ.Layer layer, + Matrix4x4 worldXf, + CanvasScript targetLayer, + ref int strokeCount, + int maxStrokes, + bool loadAnimations, + List collectedStrokes, + List createdWidgets, + Dictionary imageCache, + string quillProjectPath, + string quillImageDirectory, + string quillSoundDirectory, + string layerName, + bool includeAllDescendants, + bool parentVisible, + float parentOpacity) + { + if (maxStrokes > 0 && strokeCount >= maxStrokes) return; + + if (!IsLayerRenderable(layer, parentVisible, parentOpacity, out bool layerVisible, out float layerOpacity)) + { + return; + } + + bool hasFilter = !string.IsNullOrEmpty(layerName); + bool isMatch = hasFilter && string.Equals(layer.Name, layerName, StringComparison.OrdinalIgnoreCase); + bool allowAll = includeAllDescendants || isMatch; + + if (hasFilter && !allowAll && !LayerContainsName(layer, layerName)) + { + return; + } + + // 1. Process strokes in this layer if it's a Paint layer + if ((!hasFilter || allowAll) && layer is SQ.LayerPaint paint) + { + // NOTE: For now we always call Quill.Load with loadAnimations=false, + // so only the first frame (or first drawing) is imported. + IEnumerable drawingsToLoad; + if (loadAnimations) + { + drawingsToLoad = paint.Drawings; + } + else + { + if (paint.Frames.Count > 0) + { + int drawingIndex = paint.Frames[0]; + if (drawingIndex >= 0 && drawingIndex < paint.Drawings.Count) + { + drawingsToLoad = new[] { paint.Drawings[drawingIndex] }; + } + else + { + drawingsToLoad = paint.Drawings.Take(1); + } + } + else + { + drawingsToLoad = paint.Drawings.Take(1); + } + } + + foreach (var drawing in drawingsToLoad) + { + foreach (var sqStroke in drawing.Data.Strokes) + { + // Calculate transform from Quill world space to the OB targetLayer's local space + Matrix4x4 toLayerSpace = targetLayer.Pose.ToMatrix4x4().inverse * worldXf; + + var tbStroke = ConvertStroke(sqStroke, targetLayer, toLayerSpace, layerOpacity); + if (tbStroke != null) + { + collectedStrokes.Add(tbStroke); + strokeCount++; + } + if (maxStrokes > 0 && strokeCount >= maxStrokes) return; + } + } + } + + // 2. Process image layers + if ((!hasFilter || allowAll) && layer is SQ.LayerPicture picture) + { + var widget = CreateImageWidgetFromQuillLayer( + picture, + worldXf, + targetLayer, + imageCache, + quillProjectPath, + quillImageDirectory, + layerOpacity); + if (widget != null) + { + createdWidgets.Add(widget); + } + } + + // 2b. Process sound layers + if ((!hasFilter || allowAll) && layer is SQ.LayerSound sound) + { + var widget = CreateSoundWidgetFromQuillLayer( + sound, + worldXf, + targetLayer, + quillProjectPath, + quillSoundDirectory); + if (widget != null) + { + createdWidgets.Add(widget); + } + } + + // 3. Recurse into children if it's a Group layer + if (layer is SQ.LayerGroup group) + { + foreach (var child in group.Children) + { + Matrix4x4 childLocalXf = ConvertSQTransformMatrix(child.Transform, includeFlip: true); + Matrix4x4 childWorldXf = worldXf * childLocalXf; + TraverseAndFlattenLayers( + child, + childWorldXf, + targetLayer, + ref strokeCount, + maxStrokes, + loadAnimations, + collectedStrokes, + createdWidgets, + imageCache, + quillProjectPath, + quillImageDirectory, + quillSoundDirectory, + layerName, + includeAllDescendants: allowAll, + parentVisible: layerVisible, + parentOpacity: layerOpacity); + if (maxStrokes > 0 && strokeCount >= maxStrokes) return; + } + } + } + + private static bool IsLayerRenderable(SQ.Layer layer, bool parentVisible, float parentOpacity, out bool visible, out float opacity) + { + visible = parentVisible && (layer == null || layer.Visible); + float layerOpacity = layer == null ? 1f : layer.Opacity; + opacity = parentOpacity * layerOpacity; + return visible && opacity > 0f; + } + + private static bool LayerContainsName(SQ.Layer layer, string layerName) + { + if (layer == null || string.IsNullOrEmpty(layerName)) + { + return false; + } + + if (string.Equals(layer.Name, layerName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (layer is SQ.LayerGroup group) + { + foreach (var child in group.Children) + { + if (LayerContainsName(child, layerName)) + { + return true; + } + } + } + + return false; + } + + private static ImageWidget CreateImageWidgetFromQuillLayer( + SQ.LayerPicture picture, + Matrix4x4 worldXf, + CanvasScript targetLayer, + Dictionary imageCache, + string quillProjectPath, + string quillImageDirectory, + float opacity) + { + if (picture == null) + { + return null; + } + + int picW = picture.Data?.Width ?? 0; + int picH = picture.Data?.Height ?? 0; + int picChannels = picture.Data?.HasAlpha == true ? 4 : 3; + int actualBytes = picture.Data?.Pixels?.Length ?? 0; + int expectedRawBytes = picW * picH * picChannels; + + if (picture.PictureType == SQ.PictureType.ThreeSixty_Equirect_Mono || + picture.PictureType == SQ.PictureType.ThreeSixty_Equirect_Stereo) + { + if (LastLoaded360SkyboxName == null) + { + string skyboxFile = ExtractSkybox360Image(picture, quillProjectPath); + if (skyboxFile != null) + { + LastLoaded360SkyboxName = skyboxFile; + } + else + { + Debug.LogWarning($"Quill 360 layer could not be extracted: {picture.Name}"); + } + } + else + { + Debug.LogWarning($"Multiple Quill 360 layers found; only the first will be used as background. Skipping: {picture.Name}"); + } + return null; + } + + string sourcePath = ResolveQuillImagePath(picture.ImportFilePath, quillProjectPath); + ReferenceImage refImage = null; + if (!string.IsNullOrEmpty(sourcePath)) + { + refImage = GetOrCreateReferenceImage(sourcePath, imageCache, quillImageDirectory); + } + + if (refImage == null && picture.Data != null) + { + // Quill stores per-layer qbin offsets even when multiple layers share the same ImportFilePath. + // We treat that as a Quill bug and dedupe by source path when available. + string importKey = string.IsNullOrEmpty(picture.ImportFilePath) + ? null + : picture.ImportFilePath.Replace('\\', '/').ToLowerInvariant(); + refImage = GetOrCreateReferenceImageFromPictureData(picture, imageCache, quillImageDirectory, importKey); + } + else if (refImage == null && string.IsNullOrEmpty(sourcePath)) + { + Debug.LogWarning($"Quill picture file not found and no qbin data: {picture.Name}"); + } + + if (refImage == null) + { + return null; + } + + string importLocation = GetImportLocation(refImage); + if (string.IsNullOrEmpty(importLocation)) + { + return null; + } + + TrTransform worldXfTr = TrTransform.FromMatrix4x4(worldXf); + // Quill maps pictures to a 2x2 quad, with height driving aspect. + worldXfTr.scale = Mathf.Abs(worldXfTr.scale) * 2.0f; + + ImageWidget image = ApiMethods._ImportImage(importLocation, worldXfTr, targetLayer); + if (image == null) + { + return null; + } + + image.TwoSided = true; + + ApplyImageOpacity(image, opacity); + + return image; + } + + private static void ApplyImageOpacity(ImageWidget image, float opacity) + { + if (image == null || image.m_ImageQuad == null) + { + return; + } + + float alpha = Mathf.Clamp01(opacity); + var mat = image.m_ImageQuad.material; + if (mat == null) + { + return; + } + + Color color = mat.color; + color.a *= alpha; + mat.color = color; + } + + /// + /// Extracts a 360-degree picture layer's image into App.BackgroundImagesLibraryPath and + /// returns the filename (not full path). Returns null on failure. + /// Handles both file-referenced and embedded (qbin) picture data. + /// + private static string GetQuillBackgroundImageDirectory(string quillProjectPath) + { + string projectName = string.IsNullOrEmpty(quillProjectPath) + ? null + : SanitizeFileName(Path.GetFileName(quillProjectPath.TrimEnd( + Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar))); + + return string.IsNullOrEmpty(projectName) + ? App.BackgroundImagesLibraryPath() + : Path.Combine(App.BackgroundImagesLibraryPath(), "Quill", projectName); + } + + private static string ExtractSkybox360Image(SQ.LayerPicture picture, string quillProjectPath) + { + string bgRoot = App.BackgroundImagesLibraryPath(); + string bgDir = GetQuillBackgroundImageDirectory(quillProjectPath); + Directory.CreateDirectory(bgDir); + + // Try file path first (same approach as 2D image handling) + string sourcePath = ResolveQuillImagePath(picture.ImportFilePath, quillProjectPath); + if (!string.IsNullOrEmpty(sourcePath)) + { + string fileName = Path.GetFileName(sourcePath); + string destPath = EnsureUniqueImagePath(Path.Combine(bgDir, fileName)); + try + { + File.Copy(sourcePath, destPath, overwrite: false); + return Path.GetRelativePath(bgRoot, destPath); + } + catch (Exception e) + { + Debug.LogWarning($"Failed to copy Quill 360 image '{sourcePath}': {e.Message}"); + } + } + + // Fall back to embedded pixel data (same approach as GetOrCreateReferenceImageFromPictureData) + if (picture.Data != null) + { + var data = picture.Data; + if (data.Width <= 0 || data.Height <= 0 || data.Pixels == null) + { + Debug.LogWarning($"Quill 360 layer has no usable pixel data: {picture.Name}"); + return null; + } + + string rawName = !string.IsNullOrEmpty(picture.ImportFilePath) + ? Path.GetFileName(picture.ImportFilePath.Replace('\\', '/')) + : (string.IsNullOrEmpty(picture.Name) ? "quill-360" : picture.Name); + string baseName = SanitizeFileName(Path.GetFileNameWithoutExtension(rawName)); + string destPath = EnsureUniqueImagePath(Path.Combine(bgDir, $"{baseName}.png")); + + try + { + int pixelCount = data.Width * data.Height; + int channels = data.Pixels.Length / pixelCount; + bool hasAlpha = channels >= 4; + var tex = new Texture2D(data.Width, data.Height, TextureFormat.RGBA32, false); + var colors = new Color32[pixelCount]; + int src = 0; + for (int i = 0; i < colors.Length; i++) + { + colors[i] = new Color32( + data.Pixels[src], + data.Pixels[src + 1], + data.Pixels[src + 2], + hasAlpha ? data.Pixels[src + 3] : (byte)255); + src += channels; + } + tex.SetPixels32(colors); + tex.Apply(); + File.WriteAllBytes(destPath, tex.EncodeToPNG()); + UnityEngine.Object.Destroy(tex); + return Path.GetRelativePath(bgRoot, destPath); + } + catch (Exception e) + { + Debug.LogWarning($"Failed to write Quill 360 pixel data for '{picture.Name}': {e.Message}"); + } + } + + return null; + } + + private static string ResolveQuillImagePath(string importPath, string quillProjectPath) + { + if (string.IsNullOrEmpty(importPath)) + { + return null; + } + + try + { + string resolvedPath = importPath.Replace('/', Path.DirectorySeparatorChar); + if (!Path.IsPathRooted(resolvedPath) && !string.IsNullOrEmpty(quillProjectPath)) + { + resolvedPath = Path.Combine(quillProjectPath, resolvedPath); + } + + resolvedPath = NormalizePath(resolvedPath); + if (File.Exists(resolvedPath)) + { + return resolvedPath; + } + + return null; + } + catch (Exception e) + { + Debug.LogWarning($"Failed to resolve Quill picture path '{importPath}': {e.Message}"); + return null; + } + } + + private static ReferenceImage GetOrCreateReferenceImage( + string sourcePath, + Dictionary imageCache, + string quillImageDirectory) + { + string cacheKey = NormalizePath(sourcePath); + if (imageCache.TryGetValue(cacheKey, out var cached)) + { + return cached; + } + + string homeDir = ReferenceImageCatalog.m_Instance.HomeDirectory; + string targetDir = string.IsNullOrEmpty(quillImageDirectory) ? homeDir : quillImageDirectory; + string finalPath = cacheKey; + + if (!sourcePath.StartsWith(targetDir, StringComparison.OrdinalIgnoreCase)) + { + try + { + string fileName = Path.GetFileName(cacheKey); + string destPath = Path.Combine(targetDir, fileName); + destPath = EnsureUniqueImagePath(destPath); + Directory.CreateDirectory(targetDir); + File.Copy(cacheKey, destPath, overwrite: false); + finalPath = destPath; + } + catch (Exception e) + { + Debug.LogWarning($"Failed to copy Quill picture into media library: {e.Message}"); + return null; + } + } + + string relativePath = Path.GetRelativePath(homeDir, finalPath); + ReferenceImage refImage = ReferenceImageCatalog.m_Instance.RelativePathToImage(relativePath); + imageCache[cacheKey] = refImage; + return refImage; + } + + private static ReferenceImage GetOrCreateReferenceImageFromPictureData( + SQ.LayerPicture picture, + Dictionary imageCache, + string quillImageDirectory, + string importKey) + { + string cacheKey = !string.IsNullOrEmpty(importKey) + ? $"path:{importKey}" + : $"qbin:{picture.DataFileOffset}"; + if (imageCache.TryGetValue(cacheKey, out var cached)) + { + return cached; + } + + var data = picture.Data; + if (data.Width <= 0 || data.Height <= 0 || data.Pixels == null) + { + Debug.LogWarning($"Quill picture layer has no pixel data: {picture.Name}"); + return null; + } + + long pixelCount = (long)data.Width * data.Height; + if (pixelCount > int.MaxValue) + { + Debug.LogWarning($"Quill picture layer too large: {picture.Name}"); + return null; + } + int channels = (int)(data.Pixels.Length / pixelCount); + bool hasAlpha = channels >= 4; + byte[] pixelBytes = data.Pixels; + + string homeDir = ReferenceImageCatalog.m_Instance.HomeDirectory; + string targetDir = string.IsNullOrEmpty(quillImageDirectory) ? homeDir : quillImageDirectory; + string rawFileName = !string.IsNullOrEmpty(picture.ImportFilePath) + ? Path.GetFileName(picture.ImportFilePath.Replace('\\', '/')) + : (string.IsNullOrEmpty(picture.Name) ? "quill-image" : picture.Name); + string fileName = SanitizeFileName(Path.GetFileNameWithoutExtension(rawFileName)); + string destPath = Path.Combine(targetDir, $"{fileName}.png"); + destPath = EnsureUniqueImagePath(destPath); + + try + { + var tex = new Texture2D(data.Width, data.Height, TextureFormat.RGBA32, false); + var colors = new Color32[data.Width * data.Height]; + int srcIndex = 0; + for (int i = 0; i < colors.Length; i++) + { + colors[i] = new Color32( + pixelBytes[srcIndex], + pixelBytes[srcIndex + 1], + pixelBytes[srcIndex + 2], + hasAlpha ? pixelBytes[srcIndex + 3] : (byte)255); + srcIndex += channels; + } + tex.SetPixels32(colors); + tex.Apply(); + + byte[] png = tex.EncodeToPNG(); + UnityEngine.Object.Destroy(tex); + + Directory.CreateDirectory(targetDir); + File.WriteAllBytes(destPath, png); + } + catch (Exception e) + { + Debug.LogWarning($"Failed to write Quill picture data: {e.Message}"); + return null; + } + + string relativePath = Path.GetRelativePath(homeDir, destPath); + ReferenceImage refImage = ReferenceImageCatalog.m_Instance.RelativePathToImage(relativePath); + imageCache[cacheKey] = refImage; + return refImage; + } + + private static string GetQuillImageDirectory(string quillProjectPath) + { + if (string.IsNullOrEmpty(quillProjectPath)) + { + return null; + } + + string projectName = Path.GetFileName(quillProjectPath.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)); + projectName = SanitizeFileName(projectName); + if (string.IsNullOrEmpty(projectName)) + { + return null; + } + + string homeDir = ReferenceImageCatalog.m_Instance.HomeDirectory; + string baseDir = Path.Combine(homeDir, "Quill", projectName); + if (!Directory.Exists(baseDir)) + { + return baseDir; + } + + for (int i = 1; i < 1000; i++) + { + string candidate = $"{baseDir}-{i}"; + if (!Directory.Exists(candidate)) + { + return candidate; + } + } + + return $"{baseDir}-{Guid.NewGuid()}"; + } + private static string SanitizeFileName(string name) + { + foreach (char c in Path.GetInvalidFileNameChars()) + { + name = name.Replace(c, '_'); + } + return string.IsNullOrEmpty(name) ? "quill-image" : name; + } + + private static string NormalizePath(string path) + { + return Path.GetFullPath(path.Replace('/', Path.DirectorySeparatorChar)); + } + + private static string GetImportLocation(ReferenceImage referenceImage) + { + if (referenceImage == null) + { + return null; + } + + string homeDir = App.ReferenceImagePath(); + string fullPath = referenceImage.FileFullPath; + if (!fullPath.StartsWith(homeDir, StringComparison.OrdinalIgnoreCase)) + { + Debug.LogWarning($"Quill image not under reference image path: {fullPath}"); + return null; + } + + string relativePath = Path.GetRelativePath(homeDir, fullPath).Replace('\\', '/'); + if (relativePath.StartsWith("./", StringComparison.Ordinal) || relativePath.StartsWith(".\\", StringComparison.Ordinal)) + { + relativePath = relativePath.Substring(2); + } + + return relativePath; + } + + private static string EnsureUniqueImagePath(string destPath) + { + if (!File.Exists(destPath)) + { + return destPath; + } + + string directory = Path.GetDirectoryName(destPath); + string fileName = Path.GetFileNameWithoutExtension(destPath); + string extension = Path.GetExtension(destPath); + + for (int i = 1; i < 1000; i++) + { + string candidate = Path.Combine(directory, $"{fileName}-{i}{extension}"); + if (!File.Exists(candidate)) + { + return candidate; + } + } + + return Path.Combine(directory, $"{fileName}-{Guid.NewGuid()}{extension}"); + } + + private static SoundClipWidget CreateSoundWidgetFromQuillLayer( + SQ.LayerSound sound, + Matrix4x4 worldXf, + CanvasScript targetLayer, + string quillProjectPath, + string quillSoundDirectory) + { + if (sound == null) + { + return null; + } + + string sourcePath = null; + SoundClip soundClip = null; + + // First try external file + if (!string.IsNullOrEmpty(sound.ImportFilePath)) + { + sourcePath = ResolveQuillSoundPath(sound.ImportFilePath, quillProjectPath); + if (!string.IsNullOrEmpty(sourcePath)) + { + soundClip = GetOrCreateSoundClip(sourcePath, quillSoundDirectory); + } + } + + // If no external file, try embedded data + if (soundClip == null && sound.Data != null && sound.Data.AudioBytes != null && sound.Data.AudioBytes.Length > 0) + { + sourcePath = ExtractEmbeddedAudio(sound, quillSoundDirectory); + if (!string.IsNullOrEmpty(sourcePath)) + { + soundClip = GetOrCreateSoundClip(sourcePath, quillSoundDirectory); + } + } + + if (soundClip == null) + { + Debug.LogWarning($"Quill sound file not found: {sound.Name}"); + return null; + } + + TrTransform worldXfTr = TrTransform.FromMatrix4x4(worldXf); + // Use a default size of 2 for sound widgets (similar to images) + worldXfTr.scale = Mathf.Abs(worldXfTr.scale) * 2.0f; + + // Create the widget using the same pattern as image widgets + var previousCanvas = App.Scene.ActiveCanvas; + try + { + App.Scene.ActiveCanvas = targetLayer; + SoundClipWidget soundWidget = UnityEngine.Object.Instantiate(WidgetManager.m_Instance.SoundClipWidgetPrefab); + soundWidget.transform.parent = targetLayer.transform; + soundWidget.transform.localScale = Vector3.one; + soundWidget.SetSoundClip(soundClip); + soundWidget.SetSignedWidgetSize(worldXfTr.scale); + soundWidget.Show(bShow: true, bPlayAudio: false); + soundWidget.transform.position = worldXfTr.translation; + soundWidget.transform.rotation = worldXfTr.rotation; + + // Apply Quill sound properties (queued until controller initializes) + float spatialBlend = sound.SoundType == SharpQuill.SoundType.Flat ? 0f : 1f; + float minDist = sound.Attenuation?.Minimum ?? 1f; + float maxDist = sound.Attenuation?.Maximum ?? 500f; + soundWidget.SetAudioProperties( + sound.Gain, sound.Loop, spatialBlend, minDist, maxDist); + + return soundWidget; + } + finally + { + App.Scene.ActiveCanvas = previousCanvas; + } + } + + private static string ResolveQuillSoundPath(string importPath, string quillProjectPath) + { + if (string.IsNullOrEmpty(importPath)) + { + return null; + } + + try + { + string resolvedPath = importPath.Replace('/', Path.DirectorySeparatorChar); + if (!Path.IsPathRooted(resolvedPath) && !string.IsNullOrEmpty(quillProjectPath)) + { + resolvedPath = Path.Combine(quillProjectPath, resolvedPath); + } + + resolvedPath = NormalizePath(resolvedPath); + if (File.Exists(resolvedPath)) + { + return resolvedPath; + } + + return null; + } + catch (Exception e) + { + Debug.LogWarning($"Failed to resolve Quill sound path '{importPath}': {e.Message}"); + return null; + } + } + + private static SoundClip GetOrCreateSoundClip(string sourcePath, string quillSoundDirectory) + { + if (string.IsNullOrEmpty(sourcePath) || !File.Exists(sourcePath)) + { + return null; + } + + string homeDir = App.SoundClipLibraryPath(); + string targetDir = string.IsNullOrEmpty(quillSoundDirectory) ? homeDir : quillSoundDirectory; + string finalPath = sourcePath; + + // If the source file is not already in the sound library, copy it to the Quill subfolder + if (!sourcePath.StartsWith(homeDir, StringComparison.OrdinalIgnoreCase)) + { + try + { + string fileName = Path.GetFileName(sourcePath); + string destPath = Path.Combine(targetDir, fileName); + destPath = EnsureUniqueImagePath(destPath); // Reuse the unique path logic + Directory.CreateDirectory(targetDir); + File.Copy(sourcePath, destPath, overwrite: false); + finalPath = destPath; + } + catch (Exception e) + { + Debug.LogWarning($"Failed to copy Quill sound into library: {e.Message}"); + return null; + } + } + + // Check if it's already in the catalog + string relativePath = Path.GetRelativePath(homeDir, finalPath); + SoundClip soundClip = SoundClipCatalog.Instance.GetSoundClipByPersistentPath(relativePath); + + // If not in catalog yet, create a new SoundClip directly + if (soundClip == null) + { + try + { + soundClip = new SoundClip(finalPath); + // Trigger catalog rescan in background so it shows up in UI later + SoundClipCatalog.Instance.ForceCatalogScan(); + } + catch (Exception e) + { + Debug.LogWarning($"Failed to create SoundClip: {e.Message}"); + return null; + } + } + + return soundClip; + } + + private static string GetQuillSoundDirectory(string quillProjectPath) + { + if (string.IsNullOrEmpty(quillProjectPath)) + { + return null; + } + + string projectName = Path.GetFileName(quillProjectPath.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)); + projectName = SanitizeFileName(projectName); + if (string.IsNullOrEmpty(projectName)) + { + return null; + } + + string homeDir = App.SoundClipLibraryPath(); + string baseDir = Path.Combine(homeDir, "Quill", projectName); + if (!Directory.Exists(baseDir)) + { + return baseDir; + } + + for (int i = 1; i < 1000; i++) + { + string candidate = $"{baseDir}-{i}"; + if (!Directory.Exists(candidate)) + { + return candidate; + } + } + + return $"{baseDir}-{Guid.NewGuid()}"; + } + + private static string ExtractEmbeddedAudio(SQ.LayerSound sound, string quillSoundDirectory) + { + if (sound.Data == null || sound.Data.AudioBytes == null || sound.Data.AudioBytes.Length == 0) + { + return null; + } + + try + { + // Detect audio format from magic bytes + string extension = DetectAudioFormat(sound.Data.AudioBytes); + + // Create filename + string baseName = !string.IsNullOrEmpty(sound.Name) ? SanitizeFileName(sound.Name) : "embedded_audio"; + string fileName = $"{baseName}{extension}"; + + // Ensure directory exists + Directory.CreateDirectory(quillSoundDirectory); + + // Write audio file + string destPath = Path.Combine(quillSoundDirectory, fileName); + destPath = EnsureUniqueImagePath(destPath); // Reuse unique path logic + File.WriteAllBytes(destPath, sound.Data.AudioBytes); + + return destPath; + } + catch (Exception e) + { + Debug.LogWarning($"Failed to extract embedded audio for '{sound.Name}': {e.Message}"); + return null; + } + } + + private static string DetectAudioFormat(byte[] audioBytes) + { + if (audioBytes == null || audioBytes.Length < 12) + { + return ".bin"; // Unknown format + } + + // Check for common audio format magic bytes + // Quill stores audio as WAV in qbin, so check that first + + // WAV/RIFF: "RIFF" ... "WAVE" + if (audioBytes.Length >= 12 && + audioBytes[0] == 'R' && audioBytes[1] == 'I' && + audioBytes[2] == 'F' && audioBytes[3] == 'F' && + audioBytes[8] == 'W' && audioBytes[9] == 'A' && + audioBytes[10] == 'V' && audioBytes[11] == 'E') + { + return ".wav"; + } + + // OGG: "OggS" + if (audioBytes.Length >= 4 && + audioBytes[0] == 'O' && audioBytes[1] == 'g' && + audioBytes[2] == 'g' && audioBytes[3] == 'S') + { + return ".ogg"; + } + + // MP3: FF FB or FF F3 or FF F2 or ID3 + if (audioBytes[0] == 0xFF && (audioBytes[1] & 0xE0) == 0xE0) + { + return ".mp3"; + } + if (audioBytes.Length >= 3 && audioBytes[0] == 'I' && audioBytes[1] == 'D' && audioBytes[2] == '3') + { + return ".mp3"; + } + + // FLAC: "fLaC" + if (audioBytes.Length >= 4 && + audioBytes[0] == 'f' && audioBytes[1] == 'L' && + audioBytes[2] == 'a' && audioBytes[3] == 'C') + { + return ".flac"; + } + + // Default to WAV since that's what Quill uses in qbin + Debug.LogWarning("Could not detect audio format, defaulting to .wav"); + return ".wav"; + } + + private static Matrix4x4 ConvertSQTransformMatrix(SQ.Transform sqXf, bool includeFlip) + { + // Build the right-handed matrix first. + Vector3 pos = new Vector3(sqXf.Translation.X, sqXf.Translation.Y, sqXf.Translation.Z); + Quaternion rot = new Quaternion(sqXf.Rotation.X, sqXf.Rotation.Y, sqXf.Rotation.Z, sqXf.Rotation.W); + rot = Quaternion.Normalize(rot); + Vector3 scale = Vector3.one * sqXf.Scale; + Matrix4x4 rh = Matrix4x4.TRS(pos, rot, scale); + + if (includeFlip && !string.IsNullOrEmpty(sqXf.Flip) && sqXf.Flip != "N") + { + Vector3 flipAxis = Vector3.one; + switch (sqXf.Flip) + { + case "X": + flipAxis = new Vector3(-1, 1, 1); + break; + case "Y": + flipAxis = new Vector3(1, -1, 1); + break; + case "Z": + flipAxis = new Vector3(1, 1, -1); + break; + } + rh = rh * Matrix4x4.Scale(flipAxis); + } + + // Convert to left-handed by flipping Z in both input and output spaces. + Matrix4x4 mirror = Matrix4x4.Scale(new Vector3(1, 1, -1)); + return mirror * rh * mirror; + } + + /// + /// Computes tangent at a control point by averaging forward and backward differences. + /// This matches Quill's official importer behavior (Element::ComputeTangent). + /// Ignores Quill's stored tangent data to achieve smooth interpolation. + /// + private static Vector3 ComputeTangentFromPositions(List vertices, int index) + { + const float kEpsilon = 1e-7f; + Vector3 currentPos = new Vector3(vertices[index].Position.X, vertices[index].Position.Y, -vertices[index].Position.Z); + + // Find first valid forward difference + Vector3 forward = Vector3.zero; + for (int j = index + 1; j < vertices.Count; j++) + { + Vector3 nextPos = new Vector3(vertices[j].Position.X, vertices[j].Position.Y, -vertices[j].Position.Z); + Vector3 delta = nextPos - currentPos; + if (delta.sqrMagnitude >= kEpsilon * kEpsilon) + { + forward = delta.normalized; + break; + } + } + + // Find first valid backward difference + Vector3 backward = Vector3.zero; + for (int j = index - 1; j >= 0; j--) + { + Vector3 prevPos = new Vector3(vertices[j].Position.X, vertices[j].Position.Y, -vertices[j].Position.Z); + Vector3 delta = currentPos - prevPos; + if (delta.sqrMagnitude >= kEpsilon * kEpsilon) + { + backward = delta.normalized; + break; + } + } + + // Average the two directions + Vector3 tangent = forward + backward; + if (tangent.sqrMagnitude >= kEpsilon * kEpsilon) + { + return tangent.normalized; + } + + // Fallback: overall stroke direction with tiny offset to avoid zero vector + Vector3 first = new Vector3(vertices[0].Position.X, vertices[0].Position.Y, -vertices[0].Position.Z); + Vector3 last = new Vector3(vertices[^1].Position.X, vertices[^1].Position.Y, -vertices[^1].Position.Z); + tangent = last - first + new Vector3(0.000001f, 0.000002f, 0.000003f); + return tangent.normalized; + } + + /// + /// Builds a safe orthonormal orientation from forward and up vectors. + /// This matches Quill's official importer behavior (Element::ComputeBasis). + /// + private static Quaternion BuildSafeOrientation(Vector3 fwd, Vector3 up) + { + const float epsilon = 1e-7f; + Vector3 right = Vector3.Cross(up, fwd); + + if (right.sqrMagnitude >= epsilon * epsilon) + { + right.Normalize(); + } + else if (Mathf.Abs(fwd.x) < 0.9f) + { + right = new Vector3(0, fwd.z, fwd.y).normalized; + } + else if (Mathf.Abs(fwd.y) < 0.9f) + { + right = new Vector3(-fwd.z, 0, fwd.x).normalized; + } + else + { + right = new Vector3(fwd.y, -fwd.x, 0).normalized; + } + + up = Vector3.Cross(fwd, right).normalized; + return Quaternion.LookRotation(fwd, up); + } + + + /// + /// Maps Quill width to Open Brush pressure. + /// Currently uses linear mapping but can be extended for per-brush tuning. + /// + private static float MapPressure(float width, float maxWidth) + { + if (maxWidth <= 0f) return 1f; + + // Linear mapping for now + float pressure = width / maxWidth; + + // Future: Add per-brush pressure curves here if needed + // switch (brushGuid) + // { + // case BRUSH_QUILL_CYLINDER: + // pressure = Mathf.Pow(pressure, 1.2f); // Example adjustment + // break; + // } + + return Mathf.Clamp01(pressure); + } + + private static Stroke ConvertStroke(SQ.Stroke sqStroke, CanvasScript targetLayer, Matrix4x4 toLayerSpace, float opacityScale) + { + if (sqStroke.Vertices.Count < 2) return null; + + // Calculate max width for thresholding + float maxWidth = 0f; + foreach (var v in sqStroke.Vertices) + { + if (v.Width > maxWidth) maxWidth = v.Width; + } + + // Determine Brush GUID - map to Quill-specific brushes + string brushGuid; + + switch (sqStroke.BrushType) + { + case SQ.BrushType.Cylinder: + brushGuid = BRUSH_QUILL_CYLINDER; + break; + case SQ.BrushType.Ellipse: + brushGuid = BRUSH_QUILL_ELLIPSE; + break; + case SQ.BrushType.Cube: + brushGuid = BRUSH_QUILL_CUBE; + break; + case SQ.BrushType.Ribbon: + brushGuid = BRUSH_QUILL_RIBBON; + break; + default: + Debug.LogWarning($"Unknown Quill brush type: {sqStroke.BrushType}, falling back to Ribbon"); + brushGuid = BRUSH_QUILL_RIBBON; + break; + } + + var brush = BrushCatalog.m_Instance.GetBrush(new Guid(brushGuid)); + if (brush == null) + { + brush = BrushCatalog.m_Instance.GetBrush(new Guid(BRUSH_QUILL_RIBBON)); + } + if (brush == null) return null; + + var color = sqStroke.Vertices[0].Color; + var unityColor = new Color(color.R, color.G, color.B).gamma; + + var controlPoints = new List(sqStroke.Vertices.Count); + List perPointColors = new List(); + uint time = 0; + Quaternion prevOrientation = Quaternion.identity; + + for (int i = 0; i < sqStroke.Vertices.Count; i++) + { + var v = sqStroke.Vertices[i]; + + // Convert Quill vertex position (Right-Handed) to Unity (Left-Handed) by flipping Z + Vector3 localPos = new Vector3(v.Position.X, v.Position.Y, -v.Position.Z); + + // This matches the working Python importer and creates smooth interpolation + Vector3 localForward = ComputeTangentFromPositions(sqStroke.Vertices, i); + + // Use Quill's normal for orientation + Vector3 localUp = new Vector3(v.Normal.X, v.Normal.Y, -v.Normal.Z); + + // Apply relative transform to keep coordinates local to the top-level OB layer + Vector3 obPos = toLayerSpace.MultiplyPoint(localPos); + Vector3 obForward = toLayerSpace.MultiplyVector(localForward); + Vector3 obUp = toLayerSpace.MultiplyVector(localUp); + + // Build safe orthonormal orientation with fallback + Quaternion orient = BuildSafeOrientation(obForward, obUp); + prevOrientation = orient; + + // Map width to pressure with potential per-brush tuning + float pressure = MapPressure(v.Width, maxWidth); + + controlPoints.Add(new PointerManager.ControlPoint + { + m_Pos = obPos, + m_Orient = orient, + m_Pressure = pressure, + m_TimestampMs = time++ + }); + + // Capture per-point color from Quill vertex + float pointAlpha = Mathf.Clamp01(v.Opacity * opacityScale); + perPointColors.Add(new Color32( + (byte)(Mathf.LinearToGammaSpace(v.Color.R) * 255f), + (byte)(Mathf.LinearToGammaSpace(v.Color.G) * 255f), + (byte)(Mathf.LinearToGammaSpace(v.Color.B) * 255f), + (byte)(pointAlpha * 255f) + )); + } + + float layerScale = GetUniformScale(toLayerSpace); + var stroke = new Stroke + { + m_Type = Stroke.Type.NotCreated, + m_IntendedCanvas = targetLayer, + m_BrushGuid = brush.m_Guid, + m_BrushScale = 1f, + // Quill width appears to be radius, but OB expects diameter (or vice versa) + // Multiply by 2 to match Quill's visual appearance + m_BrushSize = maxWidth * layerScale * 2f, + m_Color = unityColor, + m_Seed = 0, + m_ControlPoints = controlPoints.ToArray(), + m_OverrideColors = perPointColors, + m_ColorOverrideMode = ColorOverrideMode.Replace + }; + + float brushSize = maxWidth * layerScale * 2f; + if (s_QuillStatsRecorder != null) + { + s_QuillStatsRecorder.RecordStroke(maxWidth, brushSize, layerScale, sqStroke, brushGuid); + } + + + stroke.m_ControlPointsToDrop = Enumerable.Repeat(false, stroke.m_ControlPoints.Length).ToArray(); + stroke.Group = SketchGroupTag.None; + + return stroke; + } + + /// + /// Returns the number of chapters in a Quill project directory. + /// A chapter is defined by Action animation keys on the root layer (Stop/Play markers). + /// Follows the same logic as IMM: Play markers take priority, then Stop markers. + /// Returns 1 if no action markers are found (the whole project is a single chapter). + /// Reads only Quill.json — does NOT load the qbin binary stroke data. + /// + public static int GetQuillChapterCount(string projectPath) + { + if (string.IsNullOrEmpty(projectPath) || !Directory.Exists(projectPath)) + { + return 0; + } + + string quillJson = Path.Combine(projectPath, "Quill.json"); + if (!File.Exists(quillJson)) + { + return 0; + } + + try + { + string json = File.ReadAllText(quillJson); + var doc = Newtonsoft.Json.Linq.JToken.Parse(json); + var actionKeys = doc["Sequence"]?["RootLayer"]?["Animation"]?["Keys"]?["Action"] + as Newtonsoft.Json.Linq.JArray; + + if (actionKeys == null || actionKeys.Count == 0) + { + return 1; // No action markers = single chapter + } + + var playTimes = new List(); + var stopTimes = new List(); + + foreach (var actionKey in actionKeys) + { + float? markerTime = actionKey["Time"]?.ToObject(); + if (!markerTime.HasValue || markerTime.Value < 0f) + { + continue; + } + + string actionValue = actionKey["Value"]?.ToObject()?.Trim(); + if (string.Equals(actionValue, "Play", StringComparison.OrdinalIgnoreCase)) + { + playTimes.Add(markerTime.Value); + } + else if (string.Equals(actionValue, "Stop", StringComparison.OrdinalIgnoreCase)) + { + if (markerTime.Value > 0f) stopTimes.Add(markerTime.Value); + } + } + + var chapterStarts = new HashSet { 0f }; + + if (playTimes.Count > 0) + { + foreach (var playTime in playTimes) + { + chapterStarts.Add(playTime); + } + } + else if (stopTimes.Count > 0) + { + foreach (var stopTime in stopTimes) + { + chapterStarts.Add(stopTime + 1f); + } + } + + return chapterStarts.Count; + } + catch (Exception e) + { + Debug.LogWarning($"[QUILL-CHAPTER] Failed to read chapter count from '{projectPath}': {e.Message}"); + return 1; + } + } + + /// + /// Applies chapter selection using root Action keys (IMM-compatible logic), then samples the + /// full sequence to the selected chapter start time for static display. + /// + private static void ApplyQuillChapterFilter(SQ.Sequence sequence, int chapterIndex, string path) + { + var actionKeys = sequence?.RootLayer?.Animation?.Keys?.Action; + int actionKeyCount = actionKeys?.Count ?? 0; + if (actionKeyCount == 0) + { + return; + } + + bool hasPlayMarkers = false; + bool hasStopMarkers = false; + foreach (var actionKey in actionKeys) + { + if (actionKey.Time < 0f) + { + continue; + } + + string action = actionKey.Value?.Trim(); + if (string.Equals(action, "Play", StringComparison.OrdinalIgnoreCase)) + { + hasPlayMarkers = true; + } + else if (string.Equals(action, "Stop", StringComparison.OrdinalIgnoreCase)) + { + hasStopMarkers = true; + } + } + + string markerType = hasPlayMarkers ? "Play" : hasStopMarkers ? "Stop" : "none"; + List chapterStarts = CalculateChapterStartTimes(actionKeys); + int chapterCount = chapterStarts.Count; + + if (chapterIndex < 0 || chapterIndex >= chapterCount) + { + Debug.LogWarning($"[QUILL-CHAPTER] Requested chapter {chapterIndex} out of range (count={chapterCount}), loading chapter 0."); + chapterIndex = 0; + } + + float chapterStart = chapterStarts[chapterIndex]; + // Chapter end is the stop time (one tick before the next chapter starts). + // This is the pause state — the frame the drawing is frozen at. + float chapterPauseTime = chapterIndex + 1 < chapterCount + ? chapterStarts[chapterIndex + 1] - 1f + : float.PositiveInfinity; + + SetSequenceToChapterTime(sequence, chapterStart, chapterPauseTime); + } + + private static List CalculateChapterStartTimes(List> actionKeys) + { + var chapterStarts = new List { 0f }; + if (actionKeys == null || actionKeys.Count == 0) + { + return chapterStarts; + } + + var playTimes = new List(); + var stopTimes = new List(); + + foreach (var actionKey in actionKeys.OrderBy(k => k.Time)) + { + float time = actionKey.Time; + if (time < 0f) + { + continue; + } + + string action = actionKey.Value?.Trim(); + if (string.Equals(action, "Play", StringComparison.OrdinalIgnoreCase)) + { + playTimes.Add(time); + } + else if (string.Equals(action, "Stop", StringComparison.OrdinalIgnoreCase)) + { + if (time > 0f) stopTimes.Add(time); + } + } + + if (playTimes.Count > 0) + { + chapterStarts.AddRange(playTimes); + } + else if (stopTimes.Count > 0) + { + chapterStarts.AddRange(stopTimes.Select(t => t + 1f)); + } + + return chapterStarts + .Distinct() + .OrderBy(t => t) + .ToList(); + } + + private static void SetSequenceToChapterTime(SQ.Sequence sequence, float startTime, float pauseTime) + { + if (sequence?.RootLayer == null) + { + return; + } + + SetLayerToTime(sequence.RootLayer, startTime, pauseTime); + } + + private static void SetLayerToTime(SQ.Layer layer, float startTime, float pauseTime) + { + if (layer == null) + { + return; + } + + var keys = layer.Animation?.Keys; + if (keys != null) + { + layer.Visible = SampleKeyframes(keys.Visibility, startTime, layer.Visible); + layer.Opacity = SampleKeyframes(keys.Opacity, startTime, layer.Opacity); + layer.Transform = SampleKeyframes(keys.Transform, startTime, layer.Transform); + } + + if (layer is SQ.LayerPaint paint && paint.Frames.Count > 0) + { + // Convert the chapter's pause time (in Quill ticks at 12600/sec) to a frame index. + const float kTicksPerSecond = 12600f; + int frameIndex = float.IsPositiveInfinity(pauseTime) + ? paint.Frames.Count - 1 + : Mathf.Clamp((int)(pauseTime * paint.Framerate / kTicksPerSecond), 0, paint.Frames.Count - 1); + int drawingIndex = paint.Frames[frameIndex]; + paint.Frames.Clear(); + paint.Frames.Add(drawingIndex); + } + else if (layer is SQ.LayerGroup group) + { + foreach (var child in group.Children) + { + SetLayerToTime(child, startTime, pauseTime); + } + } + } + + private static T SampleKeyframes(List> keyframes, float time, T defaultValue) + { + if (keyframes == null || keyframes.Count == 0) + { + return defaultValue; + } + + T sampledValue = defaultValue; + bool foundAny = false; + foreach (var keyframe in keyframes.OrderBy(k => k.Time)) + { + if (keyframe.Time > time) + { + break; + } + + sampledValue = keyframe.Value; + foundAny = true; + } + + return foundAny ? sampledValue : defaultValue; + } + + private static float GetUniformScale(Matrix4x4 m) + { + Vector3 x = new Vector3(m.m00, m.m10, m.m20); + float scale = x.magnitude; + if (scale > 0) + { + return scale; + } + Vector3 y = new Vector3(m.m01, m.m11, m.m21); + scale = y.magnitude; + if (scale > 0) + { + return scale; + } + Vector3 z = new Vector3(m.m02, m.m12, m.m22); + return z.magnitude; + } + + private static float[] MatrixToArray(Matrix4x4 m) + { + return new float[] + { + m.m00, m.m01, m.m02, m.m03, + m.m10, m.m11, m.m12, m.m13, + m.m20, m.m21, m.m22, m.m23, + m.m30, m.m31, m.m32, m.m33 + }; + } + + public class QuillLoadStats + { + public string Path; + public string Kind; + public string TimestampUtc; + public int StrokeCount; + public int VertexCount; + public FloatStats VertexWidth; + public FloatStats StrokeMaxWidth; + public FloatStats StrokeBrushSize; + public FloatStats StrokeLayerScale; + public BoundingBoxStats StrokeBoundingBox; + public ColorChannelStats VertexColor; + public List Layers; + public Dictionary Brushes; + } + + public class LayerTransformStats + { + public string Name; + public float[] WorldNoFlip; + public float[] WorldWithFlip; + public float[] LocalNoFlip; + public float[] LocalWithFlip; + public float[] Pivot; + } + + public class BoundingBoxStats + { + public FloatStats SizeX; + public FloatStats SizeY; + public FloatStats SizeZ; + public FloatStats Diagonal; + } + + public class ColorChannelStats + { + public FloatStats R; + public FloatStats G; + public FloatStats B; + public FloatStats Opacity; + } + + public class BrushStats + { + public string BrushGuid; + public int BrushType; + public int StrokeCount; + public int VertexCount; + public FloatStats VertexWidth; + public FloatStats StrokeMaxWidth; + public FloatStats StrokeBrushSize; + } + + public struct FloatStats + { + public int Count; + public float Min; + public float P50; + public float P90; + public float Max; + public float Mean; + } + + public static class QuillDiagnostics + { + public static QuillLoadStats LastLoad; + } + + private sealed class QuillStatsRecorder + { + private const int MaxSamples = 200000; + + private readonly List _vertexWidths = new List(); + private readonly List _strokeMaxWidths = new List(); + private readonly List _strokeBrushSizes = new List(); + private readonly List _strokeLayerScales = new List(); + private readonly List _bboxSizeX = new List(); + private readonly List _bboxSizeY = new List(); + private readonly List _bboxSizeZ = new List(); + private readonly List _bboxDiagonal = new List(); + private readonly List _colorR = new List(); + private readonly List _colorG = new List(); + private readonly List _colorB = new List(); + private readonly List _opacity = new List(); + private readonly Dictionary _brushes = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly List _layers = new List(); + private int _vertexCount; + + public void RecordLayer(string name, Matrix4x4 worldNoFlip, Matrix4x4 worldWithFlip, Matrix4x4 localNoFlip, Matrix4x4 localWithFlip, Matrix4x4 pivot) + { + _layers.Add(new LayerTransformStats + { + Name = name, + WorldNoFlip = MatrixToArray(worldNoFlip), + WorldWithFlip = MatrixToArray(worldWithFlip), + LocalNoFlip = MatrixToArray(localNoFlip), + LocalWithFlip = MatrixToArray(localWithFlip), + Pivot = MatrixToArray(pivot) + }); + } + + public void RecordStroke(float strokeMaxWidth, float brushSize, float layerScale, SQ.Stroke stroke, string brushGuid) + { + AddSample(_strokeMaxWidths, strokeMaxWidth); + AddSample(_strokeBrushSizes, brushSize); + AddSample(_strokeLayerScales, layerScale); + + if (stroke != null) + { + SQ.BoundingBox bbox = stroke.BoundingBox; + float sizeX = Mathf.Abs(bbox.MaxX - bbox.MinX); + float sizeY = Mathf.Abs(bbox.MaxY - bbox.MinY); + float sizeZ = Mathf.Abs(bbox.MaxZ - bbox.MinZ); + float diag = Mathf.Sqrt(sizeX * sizeX + sizeY * sizeY + sizeZ * sizeZ); + AddSample(_bboxSizeX, sizeX); + AddSample(_bboxSizeY, sizeY); + AddSample(_bboxSizeZ, sizeZ); + AddSample(_bboxDiagonal, diag); + + if (stroke.Vertices != null) + { + _vertexCount += stroke.Vertices.Count; + foreach (var v in stroke.Vertices) + { + AddSample(_vertexWidths, v.Width); + AddSample(_colorR, v.Color.R); + AddSample(_colorG, v.Color.G); + AddSample(_colorB, v.Color.B); + AddSample(_opacity, v.Opacity); + } + } + + if (!string.IsNullOrEmpty(brushGuid)) + { + if (!_brushes.TryGetValue(brushGuid, out var acc)) + { + acc = new BrushAccumulator(brushGuid, stroke.BrushType); + _brushes[brushGuid] = acc; + } + acc.RecordStroke(stroke, strokeMaxWidth, brushSize); + } + } + } + + public QuillLoadStats ToStats(string path, string kind) + { + var stats = new QuillLoadStats(); + stats.Path = path; + stats.Kind = kind; + stats.TimestampUtc = DateTime.UtcNow.ToString("o"); + stats.StrokeCount = _strokeMaxWidths.Count; + stats.VertexCount = _vertexCount; + stats.VertexWidth = Summarize(_vertexWidths); + stats.StrokeMaxWidth = Summarize(_strokeMaxWidths); + stats.StrokeBrushSize = Summarize(_strokeBrushSizes); + stats.StrokeLayerScale = Summarize(_strokeLayerScales); + stats.StrokeBoundingBox = new BoundingBoxStats + { + SizeX = Summarize(_bboxSizeX), + SizeY = Summarize(_bboxSizeY), + SizeZ = Summarize(_bboxSizeZ), + Diagonal = Summarize(_bboxDiagonal) + }; + stats.VertexColor = new ColorChannelStats + { + R = Summarize(_colorR), + G = Summarize(_colorG), + B = Summarize(_colorB), + Opacity = Summarize(_opacity) + }; + stats.Layers = new List(_layers); + var brushStats = new Dictionary(_brushes.Count, StringComparer.OrdinalIgnoreCase); + foreach (var kvp in _brushes) + { + brushStats[kvp.Key] = kvp.Value.ToStats(); + } + stats.Brushes = brushStats; + return stats; + } + + private static void AddSample(List values, float sample) + { + if (values.Count < MaxSamples) + { + values.Add(sample); + } + } + + private static FloatStats Summarize(List values) + { + var s = new FloatStats(); + if (values == null || values.Count == 0) + { + s.Count = 0; + return s; + } + + values.Sort(); + s.Count = values.Count; + s.Min = values[0]; + s.Max = values[values.Count - 1]; + s.P50 = values[(int)(0.5f * (values.Count - 1))]; + s.P90 = values[(int)(0.9f * (values.Count - 1))]; + + double sum = 0.0; + for (int i = 0; i < values.Count; i++) + { + sum += values[i]; + } + s.Mean = (float)(sum / values.Count); + return s; + } + + private sealed class BrushAccumulator + { + private readonly List _vertexWidths = new List(); + private readonly List _strokeMaxWidths = new List(); + private readonly List _strokeBrushSizes = new List(); + public string BrushGuid { get; } + public SQ.BrushType BrushType { get; } + public int StrokeCount { get; private set; } + public int VertexCount { get; private set; } + + public BrushAccumulator(string guid, SQ.BrushType brushType) + { + BrushGuid = guid; + BrushType = brushType; + } + + public void RecordStroke(SQ.Stroke stroke, float strokeMaxWidth, float brushSize) + { + StrokeCount++; + AddSample(_strokeMaxWidths, strokeMaxWidth); + AddSample(_strokeBrushSizes, brushSize); + + if (stroke?.Vertices != null) + { + VertexCount += stroke.Vertices.Count; + foreach (var v in stroke.Vertices) + { + AddSample(_vertexWidths, v.Width); + } + } + } + + public BrushStats ToStats() + { + return new BrushStats + { + BrushGuid = BrushGuid, + BrushType = (int)BrushType, + StrokeCount = StrokeCount, + VertexCount = VertexCount, + VertexWidth = Summarize(_vertexWidths), + StrokeMaxWidth = Summarize(_strokeMaxWidths), + StrokeBrushSize = Summarize(_strokeBrushSizes) + }; + } + } + } + + private static QuillStatsRecorder s_QuillStatsRecorder; + } +} diff --git a/Assets/Scripts/Quill.cs.meta b/Assets/Scripts/Quill.cs.meta new file mode 100644 index 0000000000..8b2ee1d464 --- /dev/null +++ b/Assets/Scripts/Quill.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21f13a39ba5c48fd9538e7022e805a55 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/QuillChapterTest.cs b/Assets/Scripts/QuillChapterTest.cs new file mode 100644 index 0000000000..19eb5aeed3 --- /dev/null +++ b/Assets/Scripts/QuillChapterTest.cs @@ -0,0 +1,3 @@ +using UnityEngine; +using TiltBrush; +public class QuillChapterTest : MonoBehaviour { void Start() { string path = @"C:\Users\andyb\Documents\Quill\Chapters"; int count = Quill.GetQuillChapterCount(path); Debug.Log($"[TEST] Chapter count for {path}: {count}"); } } diff --git a/Assets/Scripts/QuillChapterTest.cs.meta b/Assets/Scripts/QuillChapterTest.cs.meta new file mode 100644 index 0000000000..9b17656340 --- /dev/null +++ b/Assets/Scripts/QuillChapterTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bbbd62d314c8c64ab0c7acb8cca19cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/QuillFileCatalog.cs b/Assets/Scripts/QuillFileCatalog.cs new file mode 100644 index 0000000000..8db871b54b --- /dev/null +++ b/Assets/Scripts/QuillFileCatalog.cs @@ -0,0 +1,288 @@ +// 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 System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace TiltBrush +{ + public class QuillFileCatalog : MonoBehaviour, IReferenceItemCatalog + { + public enum SourceDirectory + { + QuillProjects, + Imm, + } + + public static QuillFileCatalog Instance { get; private set; } + + private SourceDirectory m_SourceDirectory = SourceDirectory.QuillProjects; + + private FileWatcher m_FileWatcher; + private List m_Files = new List(); + private string m_CurrentDirectory; + private bool m_DirectoryScanRequired; + private bool m_IsScanningDirectory; + private string m_SearchText = ""; + + public int ItemCount => m_Files.Count; + public bool IsScanning => m_IsScanningDirectory; + public string HomeDirectory => GetDirectoryForSource(m_SourceDirectory); + public SourceDirectory CurrentSourceDirectory => m_SourceDirectory; + public string SearchText + { + get + { + return m_SearchText; + } + set + { + m_SearchText = value; + m_DirectoryScanRequired = true; + } + } + + public event Action CatalogChanged; + + private void Awake() + { + if (Instance != null && Instance != this) + { + Destroy(this); + return; + } + + Instance = this; + + App.InitMediaLibraryPath(); + App.InitQuillLibraryPath(); + App.InitQuillImmPath(); + SetSourceDirectory(m_SourceDirectory); + } + + private void OnDestroy() + { + if (Instance == this) + { + Instance = null; + } + + if (m_FileWatcher != null) + { + m_FileWatcher.EnableRaisingEvents = false; + m_FileWatcher.FileChanged -= OnDirectoryChanged; + m_FileWatcher.FileCreated -= OnDirectoryChanged; + m_FileWatcher.FileDeleted -= OnDirectoryChanged; + m_FileWatcher = null; + } + } + + private void Update() + { + if (m_DirectoryScanRequired) + { + ForceCatalogScan(); + } + } + + public QuillFileInfo GetFileAtIndex(int index) + { + if (index < 0 || index >= m_Files.Count) + { + throw new ArgumentException($"Quill catalog has {m_Files.Count} files. Requested index {index}."); + } + + return m_Files[index]; + } + + public void SetSourceDirectory(SourceDirectory sourceDirectory) + { + string targetDirectory = GetDirectoryForSource(sourceDirectory); + if (m_SourceDirectory == sourceDirectory && + string.Equals(m_CurrentDirectory, targetDirectory, StringComparison.OrdinalIgnoreCase)) + { + return; + } + + m_SourceDirectory = sourceDirectory; + ChangeDirectory(targetDirectory); + } + + public void ForceCatalogScan() + { + if (!m_IsScanningDirectory) + { + m_DirectoryScanRequired = false; + StartCoroutine(ScanDirectory()); + } + } + + public void ChangeDirectory(string path) + { + if (string.IsNullOrEmpty(path)) + { + path = HomeDirectory; + } + + m_CurrentDirectory = path; + m_Files.Clear(); + + if (!Directory.Exists(m_CurrentDirectory)) + { + App.InitDirectoryAtPath(m_CurrentDirectory); + } + + StartWatchingCurrentDirectory(); + ForceCatalogScan(); + } + + public bool IsHomeDirectory() + { + return string.Equals(m_CurrentDirectory, HomeDirectory, StringComparison.OrdinalIgnoreCase); + } + + public bool IsSubDirectoryOfHome() + { + if (string.IsNullOrEmpty(m_CurrentDirectory)) + { + return false; + } + + return m_CurrentDirectory.StartsWith(HomeDirectory, StringComparison.OrdinalIgnoreCase); + } + + public string GetCurrentDirectory() + { + return m_CurrentDirectory; + } + + private void StartWatchingCurrentDirectory() + { + if (m_FileWatcher != null) + { + m_FileWatcher.EnableRaisingEvents = false; + m_FileWatcher.FileChanged -= OnDirectoryChanged; + m_FileWatcher.FileCreated -= OnDirectoryChanged; + m_FileWatcher.FileDeleted -= OnDirectoryChanged; + m_FileWatcher = null; + } + + if (!Directory.Exists(m_CurrentDirectory)) + { + return; + } + + m_FileWatcher = new FileWatcher(m_CurrentDirectory); + m_FileWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | + NotifyFilters.LastWrite | NotifyFilters.CreationTime; + m_FileWatcher.FileChanged += OnDirectoryChanged; + m_FileWatcher.FileCreated += OnDirectoryChanged; + m_FileWatcher.FileDeleted += OnDirectoryChanged; + m_FileWatcher.EnableRaisingEvents = true; + } + + private void OnDirectoryChanged(object source, FileSystemEventArgs e) + { + m_DirectoryScanRequired = true; + } + + private IEnumerator ScanDirectory() + { + if (m_IsScanningDirectory) + { + yield break; + } + + m_IsScanningDirectory = true; + + var files = new List(); + if (Directory.Exists(m_CurrentDirectory)) + { + if (m_SourceDirectory == SourceDirectory.Imm) + { + foreach (string path in Directory.GetFiles(m_CurrentDirectory, "*.imm", SearchOption.TopDirectoryOnly)) + { + if (!string.IsNullOrEmpty(m_SearchText) && + Path.GetFileNameWithoutExtension(path).IndexOf(m_SearchText, StringComparison.OrdinalIgnoreCase) < 0) + continue; + try + { + files.Add(QuillFileInfo.FromImmFile(new FileInfo(path))); + } + catch (Exception ex) + { + Debug.LogWarning($"Skipping IMM file '{path}': {ex.Message}"); + } + } + } + + if (m_SourceDirectory == SourceDirectory.QuillProjects) + { + foreach (string path in Directory.GetDirectories(m_CurrentDirectory, "*", SearchOption.TopDirectoryOnly)) + { + if (!string.IsNullOrEmpty(m_SearchText) && + Path.GetFileName(path).IndexOf(m_SearchText, StringComparison.OrdinalIgnoreCase) < 0) + continue; + try + { + if (IsQuillProject(path)) + { + files.Add(QuillFileInfo.FromQuillDirectory(new DirectoryInfo(path))); + } + } + catch (Exception ex) + { + Debug.LogWarning($"Skipping Quill project '{path}': {ex.Message}"); + } + } + } + } + + m_Files = files + .OrderByDescending(x => x.LastWriteTimeUtc) + .ThenBy(x => x.DisplayName, StringComparer.OrdinalIgnoreCase) + .ToList(); + + m_IsScanningDirectory = false; + CatalogChanged?.Invoke(); + } + + private static bool IsQuillProject(string directoryPath) + { + string quillJson = Path.Combine(directoryPath, "Quill.json"); + return File.Exists(quillJson); + } + + private static string GetDirectoryForSource(SourceDirectory sourceDirectory) + { + return sourceDirectory == SourceDirectory.Imm + ? App.QuillImmPath() + : App.QuillLibraryPath(); + } + + public string GetRandomFile() + { + if (m_Files.Count == 0) + { + return null; + } + + var randomFile = m_Files[UnityEngine.Random.Range(0, m_Files.Count)]; + return randomFile.FullPath; + } + } +} diff --git a/Assets/Scripts/QuillFileCatalog.cs.meta b/Assets/Scripts/QuillFileCatalog.cs.meta new file mode 100644 index 0000000000..0bb848289d --- /dev/null +++ b/Assets/Scripts/QuillFileCatalog.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15156cc6acae14f44863628350e2508d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/QuillFileInfo.cs b/Assets/Scripts/QuillFileInfo.cs new file mode 100644 index 0000000000..334c8ad556 --- /dev/null +++ b/Assets/Scripts/QuillFileInfo.cs @@ -0,0 +1,179 @@ +// 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 System; +using System.IO; + +namespace TiltBrush +{ + public enum QuillSourceType + { + Imm, + Quill + } + + public class QuillFileInfo + { + public string FullPath { get; } + public string DisplayName { get; } + public long FileSizeBytes { get; } + public DateTime LastWriteTimeUtc { get; } + public QuillSourceType SourceType { get; } + + /// + /// Chapter index to use when loading this file. -1 = default (first/only chapter). + /// Set by the UI chapter picker for IMM files. + /// + public int SelectedChapterIndex { get; set; } = -1; + + // Cached chapter count: null = not yet queried, 0 = query failed / not IMM. + private int? m_ChapterCountCache; + private DateTime? m_ChapterCountCacheTime; + + public QuillFileInfo(string fullPath, string displayName, long fileSizeBytes, + DateTime lastWriteTimeUtc, QuillSourceType sourceType) + { + FullPath = fullPath; + DisplayName = displayName; + FileSizeBytes = Math.Max(0, fileSizeBytes); + LastWriteTimeUtc = lastWriteTimeUtc; + SourceType = sourceType; + } + + /// + /// Number of chapters in this file. Queried lazily on first access. + /// For IMM: loads/unloads the document via the native IMM reader. + /// For Quill: reads only Quill.json (fast — no qbin loading). + /// + public int ChapterCount + { + get + { + // Check if cache is still valid (file hasn't changed) + bool cacheValid = m_ChapterCountCache.HasValue && + m_ChapterCountCacheTime.HasValue && + m_ChapterCountCacheTime.Value >= LastWriteTimeUtc; + + if (!cacheValid) + { + if (SourceType == QuillSourceType.Imm) + { + m_ChapterCountCache = ImmStrokeReader.SharpQuillCompat.GetImmChapterCount(FullPath); + } + else + { + // Quill chapter detection is fast (just reads JSON) + m_ChapterCountCache = Quill.GetQuillChapterCount(FullPath); + } + + m_ChapterCountCacheTime = System.DateTime.UtcNow; + } + + return m_ChapterCountCache.Value; + } + } + + /// + /// Clears the cached chapter count, forcing re-detection on next access. + /// Used when file system changes are detected. + /// + public void ClearChapterCountCache() + { + m_ChapterCountCache = null; + m_ChapterCountCacheTime = null; + UnityEngine.Debug.Log($"[QUILL-CHAPTER] Cleared chapter count cache for '{DisplayName}'"); + } + + public bool HasMultipleChapters => ChapterCount > 1; + + /// + /// Quick optimistic check for multiple chapters without expensive detection. + /// For IMM files, assumes 1 chapter until proven otherwise. + /// For Quill files, does full detection (since it's fast). + /// + public bool HasMultipleChaptersOptimistic + { + get + { + if (SourceType == QuillSourceType.Quill) + { + // Quill detection is fast, so do it immediately + return ChapterCount > 1; + } + else + { + // For IMM, be optimistic - assume single chapter if not cached + if (m_ChapterCountCache.HasValue) + { + return m_ChapterCountCache.Value > 1; + } + else + { + // Optimistically assume single chapter for IMM files + UnityEngine.Debug.Log($"[QUILL-CHAPTER] Optimistically assuming '{DisplayName}' (IMM) has 1 chapter"); + return false; + } + } + } + } + + public string SourceLabel => SourceType == QuillSourceType.Imm ? "IMM" : "Quill"; + + public string DescriptionLabel => $"{SourceLabel} {FormatFileSize(FileSizeBytes)}"; + + private static string FormatFileSize(long bytes) + { + if (bytes < 1024) + { + return $"{bytes} B"; + } + + string[] units = { "KB", "MB", "GB", "TB" }; + double size = bytes; + int unitIndex = -1; + while (size >= 1024 && unitIndex < units.Length - 1) + { + size /= 1024; + unitIndex++; + } + + return $"{size:0.#} {units[unitIndex]}"; + } + + public static QuillFileInfo FromImmFile(FileInfo file) + { + return new QuillFileInfo(file.FullName, Path.GetFileNameWithoutExtension(file.Name), + file.Length, file.LastWriteTimeUtc, QuillSourceType.Imm); + } + + public static QuillFileInfo FromQuillDirectory(DirectoryInfo directory) + { + long estimatedBytes = 0; + try + { + foreach (var file in directory.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) + { + estimatedBytes += file.Length; + } + } + catch + { + estimatedBytes = 0; + } + + return new QuillFileInfo(directory.FullName, directory.Name, estimatedBytes, + directory.LastWriteTimeUtc, QuillSourceType.Quill); + } + } +} diff --git a/Assets/Scripts/QuillFileInfo.cs.meta b/Assets/Scripts/QuillFileInfo.cs.meta new file mode 100644 index 0000000000..a40f621fde --- /dev/null +++ b/Assets/Scripts/QuillFileInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57071e2562de523459e942a4e2bec97a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ReferencePanelSoundClipTab.cs b/Assets/Scripts/ReferencePanelSoundClipTab.cs new file mode 100644 index 0000000000..a3c5dadac8 --- /dev/null +++ b/Assets/Scripts/ReferencePanelSoundClipTab.cs @@ -0,0 +1,308 @@ +// Copyright 2020 The Tilt 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 System; +using UnityEngine; +using UnityEngine.Serialization; + +namespace TiltBrush +{ + public class ReferencePanelSoundClipTab : ReferencePanelTab + { + + // Subclass used to display a SoundClip button within the reference tab. + public class AudioIcon : ReferenceIcon + { + public ReferencePanel Parent { get; set; } + public bool TextureAssigned { get; set; } + + public SoundClipButton SoundClipButton + { + get { return Button as SoundClipButton; } + } + + public override void Refresh(int catalogIndex) + { + Button.SetButtonTexture(Parent.UnknownImageTexture, 1); + + var soundClip = SoundClipCatalog.Instance.GetSoundClipAtIndex(catalogIndex); + SoundClipButton.SoundClip = soundClip; + SoundClipButton.RefreshDescription(); + + // init the icon according to availability of sound clip + if (soundClip != null) + { + Button.gameObject.SetActive(true); + TextureAssigned = false; + } + else + { + Button.gameObject.SetActive(false); + TextureAssigned = true; + } + } + } + + [SerializeField] private GameObject m_SoundClipControls; + [SerializeField] private BoxCollider m_SoundClipControlsCollider; + [SerializeField] private GameObject m_Preview; + [SerializeField] private SoundClipPositionSlider m_Scrubber; + [SerializeField] private ActionToggleButton m_LoopToggle; + [SerializeField] private ActionToggleButton m_SpatialBlendToggle; + [SerializeField] private float m_SoundClipSkipTime = 10f; + [SerializeField] private Texture2D m_ErrorTexture; + [SerializeField] private Texture2D m_LoadingTexture; + + private bool m_AllIconTexturesAssigned; + private SoundClipWidget m_SelectedSoundClipWidget; + private Material m_PreviewMaterial; + private bool m_TabActive; + + [System.Reflection.Obfuscation(Exclude = true)] + public bool SelectedSoundClipIsPlaying + { + get => (SelectedSoundClip != null) + ? SelectedSoundClip.Playing + : false; + set + { + if (SelectedSoundClip != null) + { + SelectedSoundClip.Playing = !SelectedSoundClip.Playing; + } + } + } + + [System.Reflection.Obfuscation(Exclude = true)] + public float SelectedSoundClipVolume + { + get => SelectedSoundClip?.Volume ?? 0f; + set + { + if (SelectedSoundClip != null) + { + SelectedSoundClip.Volume = value; + } + } + } + + public void HandleLoopToggle(ActionToggleButton btn) + { + SelectedSoundClip.Loop = btn.ToggleState; + } + + public void HandleSpatialBlendToggle(ActionToggleButton btn) + { + SelectedSoundClip.SpatialBlend = btn.ToggleState ? 1f : 0f; + } + + public float SelectedSoundClipMinDistance + { + get => SelectedSoundClip?.MinDistance ?? 1f; + set + { + if (SelectedSoundClip != null) + { + SelectedSoundClip.MinDistance = value; + } + } + } + + public float SelectedSoundClipMaxDistance + { + get => SelectedSoundClip?.MaxDistance ?? 500f; + set + { + if (SelectedSoundClip != null) + { + SelectedSoundClip.MaxDistance = value; + } + } + } + + public override IReferenceItemCatalog Catalog => SoundClipCatalog.Instance; + public override ReferenceButton.Type ReferenceButtonType => ReferenceButton.Type.SoundClips; + protected override Type ButtonType => typeof(SoundClipButton); + protected override Type IconType => typeof(AudioIcon); + protected SoundClip.SoundClipController SelectedSoundClip => m_SelectedSoundClipWidget != null ? m_SelectedSoundClipWidget.SoundClipController : null; + + void RefreshSoundClipControlsVisibility() + { + if (m_SoundClipControls != null) + { + bool widgetActive = WidgetManager.m_Instance != null && + WidgetManager.m_Instance.AnySoundClipWidgetActive; + m_SoundClipControls.SetActive(m_TabActive && widgetActive); + } + } + + public override void OnTabEnable() + { + m_TabActive = true; + RefreshSoundClipControlsVisibility(); + } + + public override void OnTabDisable() + { + m_TabActive = false; + RefreshSoundClipControlsVisibility(); + } + + public override void RefreshTab(bool selected) + { + base.RefreshTab(selected); + if (selected) + { + m_AllIconTexturesAssigned = false; + } + m_TabActive = selected; + RefreshSoundClipControlsVisibility(); + } + + public override void InitTab() + { + base.InitTab(); + foreach (var icon in m_Icons) + { + ((AudioIcon)icon).Parent = GetComponentInParent(); + } + OnTabDisable(); + App.Switchboard.SoundClipWidgetActivated += OnSoundClipWidgetActivated; + m_PreviewMaterial = m_Preview.GetComponent().material; + m_PreviewMaterial.mainTexture = Texture2D.blackTexture; + } + + public void OnSoundClipWidgetActivated(SoundClipWidget widget) + { + m_SelectedSoundClipWidget = widget; + if (widget.SoundClipController != null) + { + float previewAspect = m_Preview.transform.localScale.x / m_Preview.transform.localScale.y; + var previewTex = widget.SoundClip.GetWaveform(0.8f, Color.white, aspect: previewAspect); + m_PreviewMaterial.mainTexture = previewTex != null ? previewTex : widget.SoundClip.Thumbnail; + } + m_Scrubber.SoundClipWidget = widget; + m_LoopToggle.ToggleState = widget.SoundClipController is { Loop: true }; + m_SpatialBlendToggle.ToggleState = widget.SoundClipController is { SpatialBlend: > 0f }; + + RefreshSoundClipControlsVisibility(); + } + + public override void UpdateTab() + { + base.UpdateTab(); + if (!m_AllIconTexturesAssigned) + { + m_AllIconTexturesAssigned = true; + + // Poll catalog until icons have loaded + for (int i = 0; i < m_Icons.Length; ++i) + { + var audioIcon = m_Icons[i] as AudioIcon; + if (audioIcon is { TextureAssigned: false } && audioIcon.Button.gameObject.activeSelf) + { + int catalogIndex = m_IndexOffset + i; + + var soundClip = SoundClipCatalog.Instance.GetSoundClipAtIndex(catalogIndex); + if (soundClip != null) + { + if (!string.IsNullOrEmpty(soundClip.Error)) + { + audioIcon.Button.SetButtonTexture(m_ErrorTexture, + m_ErrorTexture.width / m_ErrorTexture.height); + audioIcon.TextureAssigned = true; + audioIcon.SoundClipButton.SetDescriptionText(soundClip.HumanName, "Could not load sound clip."); + audioIcon.SoundClipButton.SetButtonAvailable(false); + } + else if (soundClip.IsInitialized) + { + audioIcon.Button.SetButtonTexture(soundClip.Thumbnail, soundClip.Aspect); + audioIcon.TextureAssigned = true; + } + else + { + audioIcon.Button.SetButtonTexture(m_LoadingTexture, + m_LoadingTexture.width / m_LoadingTexture.height); + audioIcon.TextureAssigned = true; + } + } + else + { + m_AllIconTexturesAssigned = false; + } + } + } + } + } + + public override void OnUpdateGazeBehavior(Color panelColor, bool gazeActive, bool available) + { + base.OnUpdateGazeBehavior(panelColor, gazeActive, available); + bool? buttonsGrayscale = null; + if (!gazeActive) + { + buttonsGrayscale = true; + } + else if (available) + { + buttonsGrayscale = false; + } + else + { + // Don't mess with grayscale-ness + } + + if (buttonsGrayscale != null) + { + foreach (var icon in m_Icons) + { + icon.Button.SetButtonGrayscale(buttonsGrayscale.Value); + } + } + } + + public override bool RaycastAgainstMeshCollider(Ray ray, out RaycastHit hitInfo, float dist) + { + if (base.RaycastAgainstMeshCollider(ray, out hitInfo, dist)) + { + return true; + } + if (m_SoundClipControlsCollider == null) + { + return false; + } + return m_SoundClipControlsCollider.Raycast(ray, out hitInfo, dist); + } + + [System.Reflection.Obfuscation(Exclude = true)] + public void SkipBack() + { + if (SelectedSoundClip == null) + { + return; + } + SelectedSoundClip.Time = Mathf.Clamp(SelectedSoundClip.Time - m_SoundClipSkipTime, 0, SelectedSoundClip.Length); + } + + [System.Reflection.Obfuscation(Exclude = true)] + public void SkipForward() + { + if (SelectedSoundClip == null) + { + return; + } + SelectedSoundClip.Time = Mathf.Clamp(SelectedSoundClip.Time + m_SoundClipSkipTime, 0, SelectedSoundClip.Length); + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/ReferencePanelSoundClipTab.cs.meta b/Assets/Scripts/ReferencePanelSoundClipTab.cs.meta new file mode 100644 index 0000000000..646970bbc2 --- /dev/null +++ b/Assets/Scripts/ReferencePanelSoundClipTab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dcee1b430b77a424cb40c11cdf48c840 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ReferencePanelTab.cs b/Assets/Scripts/ReferencePanelTab.cs index a3b61c3c04..d200c42805 100644 --- a/Assets/Scripts/ReferencePanelTab.cs +++ b/Assets/Scripts/ReferencePanelTab.cs @@ -76,6 +76,7 @@ public virtual void UpdateButtonTransitionScale(float scale) public virtual void RefreshTab(bool selected) { m_IndexOffset = PageIndex * m_Icons.Length; + for (int i = 0; i < m_Icons.Length; ++i) { int index = m_IndexOffset + i; diff --git a/Assets/Scripts/Save/MetadataUtils.cs b/Assets/Scripts/Save/MetadataUtils.cs index ed7ca32498..616d077f6c 100644 --- a/Assets/Scripts/Save/MetadataUtils.cs +++ b/Assets/Scripts/Save/MetadataUtils.cs @@ -175,6 +175,32 @@ TiltText ConvertTextWidgetToTiltText(TextWidget widget) } } + public static TiltSoundClip[] GetTiltSoundClip(GroupIdMapping groupIdMapping) + { + return WidgetManager.m_Instance.SoundClipWidgets.Where(x => x.gameObject.activeSelf).Select(x => ConvertSoundClipWidgetToTiltSoundClip(x)).ToArray(); + + TiltSoundClip ConvertSoundClipWidgetToTiltSoundClip(SoundClipWidget widget) + { + TiltSoundClip soundClip = new TiltSoundClip + { + FilePath = widget.SoundClip.PersistentPath, + AspectRatio = widget.SoundClip.Aspect, + Pinned = widget.Pinned, + Transform = widget.LocalTransform, + GroupId = groupIdMapping.GetId(widget.Group), + LayerId = App.Scene.GetIndexOfCanvas(widget.Canvas), + Paused = !widget.SoundClipController.Playing, + Time = widget.SoundClipController.Time, + Volume = widget.SoundClipController.Volume, + Loop = widget.SoundClipController.Loop, + SpatialBlend = widget.SoundClipController.SpatialBlend, + MinDistance = widget.SoundClipController.MinDistance, + MaxDistance = widget.SoundClipController.MaxDistance + }; + return soundClip; + } + } + public static TiltVideo[] GetTiltVideos(GroupIdMapping groupIdMapping) { return WidgetManager.m_Instance.VideoWidgets.Where(x => x.gameObject.activeSelf).Select(x => ConvertVideoToTiltVideo(x)).ToArray(); diff --git a/Assets/Scripts/Save/SaveLoadScript.cs b/Assets/Scripts/Save/SaveLoadScript.cs index 90e86b2dd2..c73ac4d91d 100644 --- a/Assets/Scripts/Save/SaveLoadScript.cs +++ b/Assets/Scripts/Save/SaveLoadScript.cs @@ -117,6 +117,7 @@ static SaveLoadScript() private string m_SaveDir; private string m_SaveSelectedDir; private SceneFileInfo m_LastSceneFile; + private string m_PreferredNewSketchFilenameBase; private bool m_LastSceneIsLegacy; private int m_LastNonexistentFileIndex = 0; @@ -267,6 +268,22 @@ protected void OnDestroy() public void ResetLastFilename() { m_LastSceneFile = new DiskSceneFileInfo(); + m_PreferredNewSketchFilenameBase = null; + } + + public void SetPreferredNewSketchFilenameFromPath(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + m_PreferredNewSketchFilenameBase = null; + return; + } + + string trimmedPath = path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + string leafName = Path.GetFileName(trimmedPath); + string baseName = Path.GetFileNameWithoutExtension(leafName); + string validName = FileUtils.GetValidFilename(baseName); + m_PreferredNewSketchFilenameBase = string.IsNullOrWhiteSpace(validName) ? null : validName; } // Create a name that is guaranteed not to exist. @@ -362,7 +379,9 @@ public DiskSceneFileInfo GetNewNameSceneFileInfo(bool tiltasaurusMode = false, s { uniquePath = tiltasaurusMode ? GenerateNewTiltasaurusFilename(m_SaveDir, TILT_SUFFIX) - : GenerateNewUntitledFilename(m_SaveDir, TILT_SUFFIX); + : (!string.IsNullOrEmpty(m_PreferredNewSketchFilenameBase) + ? GenerateNewFilename(m_PreferredNewSketchFilenameBase, m_SaveDir, TILT_SUFFIX) + : GenerateNewUntitledFilename(m_SaveDir, TILT_SUFFIX)); } else { @@ -834,6 +853,10 @@ public bool Load(SceneFileInfo fileInfo, bool bAdditive, int targetLayer, out Li { WidgetManager.m_Instance.SetTextDataFromTilt(jsonData.TextWidgets); } + if (SoundClipCatalog.Instance != null && jsonData.SoundClips != null) + { + WidgetManager.m_Instance.SetSoundDataFromTilt(jsonData.SoundClips); + } } if (jsonData.Mirror != null) { diff --git a/Assets/Scripts/Save/SketchMetadata.cs b/Assets/Scripts/Save/SketchMetadata.cs index 49d5f6d11c..2e8530faf4 100644 --- a/Assets/Scripts/Save/SketchMetadata.cs +++ b/Assets/Scripts/Save/SketchMetadata.cs @@ -720,6 +720,25 @@ public class TiltVideo public bool TwoSided { get; set; } } + [Serializable] + public class TiltSoundClip + { + public string FilePath { get; set; } // relative to Media Library folder + public float AspectRatio { get; set; } + public bool Pinned; + public TrTransform Transform; + public bool Paused { get; set; } + public float Time { get; set; } + public float Volume { get; set; } + public bool Loop { get; set; } = true; + public float SpatialBlend { get; set; } + public float MinDistance { get; set; } = 1f; + public float MaxDistance { get; set; } = 500f; + // Group ID for widget. 0 for ungrouped items. + public uint GroupId { get; set; } + public int LayerId { get; set; } + } + [Serializable] // Serializable protects data members obfuscator, but we need to also protect // method names like ShouldSerializeXxx(...) that are used by Json.NET @@ -838,5 +857,8 @@ public TiltImages75b[] Images [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public TiltText[] TextWidgets { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public TiltSoundClip[] SoundClips { get; set; } } } // namespace TiltBrush diff --git a/Assets/Scripts/Save/SketchSnapshot.cs b/Assets/Scripts/Save/SketchSnapshot.cs index 17fbb85c0a..e5ac0adeae 100644 --- a/Assets/Scripts/Save/SketchSnapshot.cs +++ b/Assets/Scripts/Save/SketchSnapshot.cs @@ -151,6 +151,7 @@ public SketchMetadata GetSketchMetadata() ImageIndex = MetadataUtils.GetTiltImages(m_GroupIdMapping), Videos = MetadataUtils.GetTiltVideos(m_GroupIdMapping), TextWidgets = MetadataUtils.GetTiltText(m_GroupIdMapping), + SoundClips = MetadataUtils.GetTiltSoundClip(m_GroupIdMapping), Mirror = PointerManager.m_Instance.SymmetryWidgetToMirror(), GuideIndex = MetadataUtils.GetGuideIndex(m_GroupIdMapping), Palette = CustomColorPaletteStorage.m_Instance.GetPaletteForSaving(), diff --git a/Assets/Scripts/Save/SketchWriter.cs b/Assets/Scripts/Save/SketchWriter.cs index b4b1165a89..f7c1f82749 100644 --- a/Assets/Scripts/Save/SketchWriter.cs +++ b/Assets/Scripts/Save/SketchWriter.cs @@ -75,6 +75,7 @@ public enum StrokeExtension : uint // we don't save out the group. Seed = 1 << 3, // int32; if not found then you get a random int. Layer = 1 << 4, // uint32; + ControlPointColors = 1 << 16, // Variable-length: Color32[] + ColorControlMode; per-point colors } [Flags] @@ -231,6 +232,7 @@ public static void WriteMemory(Stream stream, IList s if (stroke.m_BrushScale != 1) { strokeExtensionMask |= StrokeExtension.Scale; } if (stroke.Group != SketchGroupTag.None) { strokeExtensionMask |= StrokeExtension.Group; } strokeExtensionMask |= StrokeExtension.Layer; + if (stroke.m_OverrideColors != null) { strokeExtensionMask |= StrokeExtension.ControlPointColors; } writer.UInt32((uint)strokeExtensionMask); uint controlPointExtensionMask = @@ -255,6 +257,51 @@ public static void WriteMemory(Stream stream, IList s { writer.UInt32(copy.layerIndex); } + if ((uint)(strokeExtensionMask & StrokeExtension.ControlPointColors) != 0) + { + // Write length prefix for variable-length extension, then data + // Data: ColorControlMode (UInt32) + array length (Int32) + bitmask (bytes) + non-null Color32 array (UInt32 each) + + int count = stroke.m_OverrideColors.Count; + int bitmaskBytes = (count + 7) / 8; // Round up to nearest byte + + // Count non-null entries + int nonNullCount = 0; + for (int i = 0; i < count; i++) + { + if (stroke.m_OverrideColors[i].HasValue) nonNullCount++; + } + + uint dataSize = (uint)(4 + 4 + bitmaskBytes + (nonNullCount * 4)); + writer.UInt32(dataSize); + + writer.UInt32((uint)stroke.m_ColorOverrideMode); + writer.Int32(count); + + // Write bitmask (1 bit per entry, 1=non-null, 0=null) + byte[] bitmask = new byte[bitmaskBytes]; + for (int i = 0; i < count; i++) + { + if (stroke.m_OverrideColors[i].HasValue) + { + int byteIndex = i / 8; + int bitIndex = i % 8; + bitmask[byteIndex] |= (byte)(1 << bitIndex); + } + } + writer.BaseStream.Write(bitmask, 0, bitmaskBytes); + + // Write only non-null colors + for (int i = 0; i < count; i++) + { + if (stroke.m_OverrideColors[i].HasValue) + { + Color32 c = stroke.m_OverrideColors[i].Value; + uint packed = (uint)(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)); + writer.UInt32(packed); + } + } + } // Control points writer.Int32(stroke.m_ControlPoints.Length); @@ -315,6 +362,7 @@ public static void WriteMemory(Stream stream, IList s if (stroke.m_BrushScale != 1) { strokeExtensionMask |= StrokeExtension.Scale; } if (stroke.Group != SketchGroupTag.None) { strokeExtensionMask |= StrokeExtension.Group; } strokeExtensionMask |= StrokeExtension.Layer; + if (stroke.m_OverrideColors != null) { strokeExtensionMask |= StrokeExtension.ControlPointColors; } writer.UInt32((uint)strokeExtensionMask); uint controlPointExtensionMask = @@ -339,6 +387,51 @@ public static void WriteMemory(Stream stream, IList s { writer.UInt32(copy.layerIndex); } + if ((uint)(strokeExtensionMask & StrokeExtension.ControlPointColors) != 0) + { + // Write length prefix for variable-length extension, then data + // Data: ColorControlMode (UInt32) + array length (Int32) + bitmask (bytes) + non-null Color32 array (UInt32 each) + + int count = stroke.m_OverrideColors.Count; + int bitmaskBytes = (count + 7) / 8; // Round up to nearest byte + + // Count non-null entries + int nonNullCount = 0; + for (int i = 0; i < count; i++) + { + if (stroke.m_OverrideColors[i].HasValue) nonNullCount++; + } + + uint dataSize = (uint)(4 + 4 + bitmaskBytes + (nonNullCount * 4)); + writer.UInt32(dataSize); + + writer.UInt32((uint)stroke.m_ColorOverrideMode); + writer.Int32(count); + + // Write bitmask (1 bit per entry, 1=non-null, 0=null) + byte[] bitmask = new byte[bitmaskBytes]; + for (int i = 0; i < count; i++) + { + if (stroke.m_OverrideColors[i].HasValue) + { + int byteIndex = i / 8; + int bitIndex = i % 8; + bitmask[byteIndex] |= (byte)(1 << bitIndex); + } + } + writer.BaseStream.Write(bitmask, 0, bitmaskBytes); + + // Write only non-null colors + for (int i = 0; i < count; i++) + { + if (stroke.m_OverrideColors[i].HasValue) + { + Color32 c = stroke.m_OverrideColors[i].Value; + uint packed = (uint)(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)); + writer.UInt32(packed); + } + } + } // Control points writer.Int32(stroke.m_ControlPoints.Length); @@ -544,6 +637,42 @@ public static List GetStrokes( var canvas = App.Scene.GetOrCreateLayer((int)layerIndex); stroke.m_IntendedCanvas = canvas; break; + case StrokeExtension.ControlPointColors: + { + uint dataSize = reader.UInt32(); // Read length prefix for variable-length extension + stroke.m_ColorOverrideMode = (ColorOverrideMode)reader.UInt32(); + int colorCount = reader.Int32(); + + // Read bitmask + int bitmaskBytes = (colorCount + 7) / 8; + byte[] bitmask = new byte[bitmaskBytes]; + int bytesRead = reader.BaseStream.Read(bitmask, 0, bitmaskBytes); + if (bytesRead != bitmaskBytes) { return null; } + + // Create list with nulls + stroke.m_OverrideColors = new List(new Color32?[colorCount]); + + // Read non-null colors and place them according to bitmask + for (int cpIdx = 0; cpIdx < colorCount; cpIdx++) + { + int byteIndex = cpIdx / 8; + int bitIndex = cpIdx % 8; + bool isNonNull = (bitmask[byteIndex] & (1 << bitIndex)) != 0; + + if (isNonNull) + { + // Unpack UInt32 into RGBA bytes + uint packed = reader.UInt32(); + stroke.m_OverrideColors[cpIdx] = new Color32( + (byte)(packed & 0xFF), + (byte)((packed >> 8) & 0xFF), + (byte)((packed >> 16) & 0xFF), + (byte)((packed >> 24) & 0xFF) + ); + } + } + break; + } case StrokeExtension.Seed: stroke.m_Seed = reader.Int32(); break; @@ -566,10 +695,10 @@ public static List GetStrokes( // control points int nControlPoints = reader.Int32(); - stroke.m_ControlPoints = new PointerManager.ControlPoint[nControlPoints]; + stroke.m_ControlPoints = new ControlPoint[nControlPoints]; stroke.m_ControlPointsToDrop = new bool[nControlPoints]; - if (allowFastPath && controlPointExtensionMask == PointerManager.ControlPoint.EXTENSIONS) + if (allowFastPath && controlPointExtensionMask == ControlPoint.EXTENSIONS) { // Fast path: read (semi-)directly into the ControlPoint[] unsafe @@ -717,6 +846,42 @@ public static List GetStrokes( var canvas = App.Scene.GetOrCreateLayer((int)layerIndex); stroke.m_IntendedCanvas = canvas; break; + case StrokeExtension.ControlPointColors: + { + uint dataSize = reader.UInt32(); // Read length prefix for variable-length extension + stroke.m_ColorOverrideMode = (ColorOverrideMode)reader.UInt32(); + int colorCount = reader.Int32(); + + // Read bitmask + int bitmaskBytes = (colorCount + 7) / 8; + byte[] bitmask = new byte[bitmaskBytes]; + int bytesRead = reader.BaseStream.Read(bitmask, 0, bitmaskBytes); + if (bytesRead != bitmaskBytes) { return null; } + + // Create list with nulls + stroke.m_OverrideColors = new List(new Color32?[colorCount]); + + // Read non-null colors and place them according to bitmask + for (int cpIdx = 0; cpIdx < colorCount; cpIdx++) + { + int byteIndex = cpIdx / 8; + int bitIndex = cpIdx % 8; + bool isNonNull = (bitmask[byteIndex] & (1 << bitIndex)) != 0; + + if (isNonNull) + { + // Unpack UInt32 into RGBA bytes + uint packed = reader.UInt32(); + stroke.m_OverrideColors[cpIdx] = new Color32( + (byte)(packed & 0xFF), + (byte)((packed >> 8) & 0xFF), + (byte)((packed >> 16) & 0xFF), + (byte)((packed >> 24) & 0xFF) + ); + } + } + break; + } case StrokeExtension.Seed: stroke.m_Seed = reader.Int32(); break; @@ -739,15 +904,15 @@ public static List GetStrokes( // Process control points... int nControlPoints = reader.Int32(); - stroke.m_ControlPoints = new PointerManager.ControlPoint[nControlPoints]; + stroke.m_ControlPoints = new ControlPoint[nControlPoints]; stroke.m_ControlPointsToDrop = new bool[nControlPoints]; - if (allowFastPath && controlPointExtensionMask == PointerManager.ControlPoint.EXTENSIONS) + if (allowFastPath && controlPointExtensionMask == ControlPoint.EXTENSIONS) { unsafe { - int size = sizeof(PointerManager.ControlPoint) * stroke.m_ControlPoints.Length; - fixed (PointerManager.ControlPoint* aPoints = stroke.m_ControlPoints) + int size = sizeof(ControlPoint) * stroke.m_ControlPoints.Length; + fixed (ControlPoint* aPoints = stroke.m_ControlPoints) { if (!reader.ReadInto((IntPtr)aPoints, size)) { diff --git a/Assets/Scripts/SelectionManager.cs b/Assets/Scripts/SelectionManager.cs index c6d7cbc532..377efa566c 100644 --- a/Assets/Scripts/SelectionManager.cs +++ b/Assets/Scripts/SelectionManager.cs @@ -1099,7 +1099,12 @@ private void AddToGroupToSelectedWidgets(SketchGroupTag group, GrabWidget widget private void OnSelectionTransformed(TrTransform xf_SS) { - SelectionTransform = xf_SS; + // The widget's SelectionTransform is in scene space, but + // SelectionManager.SelectionTransform applies the delta relative + // to the ActiveCanvas. Conjugate by the canvas's scene-space pose + // to convert between the two frames. + TrTransform canvasPose_SS = App.Scene.AsScene[App.ActiveCanvas.transform]; + SelectionTransform = canvasPose_SS.inverse * xf_SS * canvasPose_SS; } Bounds GetBoundsOfSelectedWidgets_SelectionCanvasSpace() diff --git a/Assets/Scripts/SketchControlsScript.cs b/Assets/Scripts/SketchControlsScript.cs index 5cc89969bd..87216efa59 100644 --- a/Assets/Scripts/SketchControlsScript.cs +++ b/Assets/Scripts/SketchControlsScript.cs @@ -200,7 +200,10 @@ public enum GlobalCommands OpenTexturePicker = 9001, MergeBrushStrokes = 10000, RepaintOptions = 11500, - OpenNumericInputPopup = 12000 + OpenNumericInputPopup = 12000, + LoadQuillConfirmUnsaved = 13000, + LoadQuillFile = 13001, + OpenQuillPanelSearchPopup = 13002, } public enum ControlsType @@ -4039,6 +4042,41 @@ IEnumerator ExportCoroutine() }, 0.25f, false, true); } + IEnumerator LoadQuillCoroutine(string path, int chapterIndex = -1) + { + var blackEnv = EnvironmentCatalog.m_Instance.AllEnvironments + .FirstOrDefault(x => x.name.Equals("Black", StringComparison.OrdinalIgnoreCase)); + if (blackEnv != null) + { + SceneSettings.m_Instance.SetDesiredPreset(blackEnv, keepSceneTransform: true, + forceTransition: false, hasCustomLights: false, skipFade: true); + } + + using (var coroutine = OverlayManager.m_Instance.RunInCompositor( + OverlayType.LoadSketch, () => + { + Quill.Load(path, chapterIndex: chapterIndex); + }, 0.25f, false, false)) + { + while (coroutine.MoveNext()) + { + yield return coroutine.Current; + } + } + + if (Quill.LastLoadedBackgroundColor.HasValue) + { + var bgColor = Quill.LastLoadedBackgroundColor.Value; + SceneSettings.m_Instance.SkyColorA = bgColor; + SceneSettings.m_Instance.SkyColorB = bgColor; + } + + if (Quill.LastLoaded360SkyboxName != null) + { + SceneSettings.m_Instance.LoadCustomSkybox(Quill.LastLoaded360SkyboxName); + } + } + private void SaveModel() { #if USD_SUPPORTED @@ -4994,6 +5032,35 @@ public void IssueGlobalCommand(GlobalCommands rEnum, int iParam1 = -1, } } break; + case GlobalCommands.LoadQuillConfirmUnsaved: + { + if (SketchMemoryScript.m_Instance.IsMemoryDirty()) + { + var quillPanel = m_PanelManager.GetActivePanelByType( + BasePanel.PanelType.QuillLibrary) as QuillLibraryPanel; + if (quillPanel != null) + { + quillPanel.ShowConfirmLoadPopUp(); + } + } + else + { + IssueGlobalCommand(GlobalCommands.LoadQuillFile, 0, 0); + } + } + break; + case GlobalCommands.LoadQuillFile: + { + var options = Quill.PendingLoadOptions; + Quill.PendingLoadOptions = null; + if (options != null && !string.IsNullOrEmpty(options.Path)) + { + NewSketch(fade: false); + SaveLoadScript.m_Instance.SetPreferredNewSketchFilenameFromPath(options.Path); + StartCoroutine(LoadQuillCoroutine(options.Path, options.ChapterIndex)); + } + } + break; case GlobalCommands.LoadWaitOnDownload: { var download = false; @@ -5108,6 +5175,12 @@ public void IssueGlobalCommand(GlobalCommands rEnum, int iParam1 = -1, DismissPopupOnCurrentGazeObject(false); break; } + case GlobalCommands.OpenQuillPanelSearchPopup: + { + QuillFileCatalog.Instance.SearchText = KeyboardPopUpWindow.m_LastInput; + DismissPopupOnCurrentGazeObject(false); + break; + } case GlobalCommands.RepaintOptions: case GlobalCommands.MultiplayerPanelOptions: case GlobalCommands.MultiplayerJoinRoom: diff --git a/Assets/Scripts/SketchMemoryScript.cs b/Assets/Scripts/SketchMemoryScript.cs index f5b48a1667..2a7e5a4ea0 100644 --- a/Assets/Scripts/SketchMemoryScript.cs +++ b/Assets/Scripts/SketchMemoryScript.cs @@ -558,7 +558,9 @@ public void MemorizeBatchedBrushStroke( float fBrushSize, float brushScale, List rControlPoints, StrokeFlags strokeFlags, StencilWidget stencil, float lineLength, int seed, - bool isFinalStroke) + bool isFinalStroke, + List controlPointColors = null, + ColorOverrideMode colorMode = ColorOverrideMode.None) { // NOTE: PointerScript calls ClearRedo() in batch case @@ -573,6 +575,8 @@ public void MemorizeBatchedBrushStroke( rNewStroke.m_BrushScale = brushScale; rNewStroke.m_Flags = strokeFlags; rNewStroke.m_Seed = seed; + rNewStroke.m_OverrideColors = controlPointColors; + rNewStroke.m_ColorOverrideMode = colorMode; subset.m_Stroke = rNewStroke; PerformAndRecordCommand( @@ -600,7 +604,9 @@ public void MemorizeBrushStroke( float fBrushSize, float brushScale, List rControlPoints, StrokeFlags strokeFlags, - StencilWidget stencil, float lineLength) + StencilWidget stencil, float lineLength, + List controlPointColors = null, + ColorOverrideMode colorMode = ColorOverrideMode.None) { ClearRedo(); @@ -614,6 +620,8 @@ public void MemorizeBrushStroke( rNewStroke.m_BrushSize = fBrushSize; rNewStroke.m_BrushScale = brushScale; rNewStroke.m_Flags = strokeFlags; + rNewStroke.m_OverrideColors = controlPointColors; + rNewStroke.m_ColorOverrideMode = colorMode; brushScript.Stroke = rNewStroke; SketchMemoryScript.m_Instance.RecordCommand( @@ -1568,7 +1576,8 @@ public void RenderStrokesDirectly(List strokes) { if (!stroke.m_ControlPointsToDrop[i]) { - pointer.UpdateLineFromControlPoint(stroke.m_ControlPoints[i]); + Color32 color = stroke.GetColor(i); + pointer.UpdateLineFromControlPoint(stroke.m_ControlPoints[i], color); } } diff --git a/Assets/Scripts/SoundClip.cs b/Assets/Scripts/SoundClip.cs new file mode 100644 index 0000000000..190fd37f54 --- /dev/null +++ b/Assets/Scripts/SoundClip.cs @@ -0,0 +1,454 @@ +// Copyright 2020 The Tilt 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 System; +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.Networking; + +namespace TiltBrush +{ + [System.Serializable] + public class SoundClip + { + /// The controller is used as a handle for controlling the clip - clips stay instantiated as + /// long as there are controllers in existence that reference them. For this reason it is + /// important to Dispose() of controllers once they are no longer needed. + /// + /// Properties of sound clips that can change (playing state, volume, scrub position) are all accessed + /// through the Controller - properties of clips that are unchanging are accessed through the + /// SoundClip. + public class SoundClipController : IDisposable + { + private Action m_OnSoundClipInitialized; + private SoundClip m_SoundClip; + private bool m_SoundClipInitialized; + private float m_MinDistance = 1f; + private float m_MaxDistance = 500f; + private float m_DistanceScale = 1f; + + public AudioSource m_SoundClipAudioSource; + + public bool Initialized => m_SoundClipInitialized; + + /// Clips do not start playing immediately; this event is triggered when the clip is ready. + /// However, as several controllers may point at the same clip, if a controller is made to + /// point at an already playing clip, when a user adds a value to OnSoundClipInitialized, the event + /// will be made to trigger immediately. The event is always cleared after triggering so this + /// will not cause OnSoundClipInitialized functions to be called more than once. + public event Action OnSoundClipInitialized + { + add + { + m_OnSoundClipInitialized += value; + if (m_SoundClipInitialized) + { + OnInitialization(); + } + } + remove { m_OnSoundClipInitialized -= value; } + } + + public bool Playing + { + get => m_SoundClipInitialized ? m_SoundClipAudioSource.isPlaying : false; + set + { + if (m_SoundClipInitialized) + { + if (m_SoundClipAudioSource.isPlaying) + { + m_SoundClipAudioSource.Pause(); + } + else + { + m_SoundClipAudioSource.Play(); + } + } + } + } + + public float Volume + { + get => (!m_SoundClipInitialized || m_SoundClipAudioSource.mute) + ? 0f : m_SoundClipAudioSource.volume; + set + { + if (m_SoundClipInitialized) + { + if (value <= 0.005f) + { + m_SoundClipAudioSource.volume = 0; + m_SoundClipAudioSource.mute = true; + } + else + { + m_SoundClipAudioSource.mute = false; + m_SoundClipAudioSource.volume = value; + } + } + } + } + + public float Position + { + get => (m_SoundClipInitialized && m_SoundClipAudioSource.clip != null) ? (float)(m_SoundClipAudioSource.time / m_SoundClipAudioSource.clip.length) : 0f; + set + { + if (m_SoundClipInitialized) + { + m_SoundClipAudioSource.time = m_SoundClipAudioSource.clip.length * Mathf.Clamp01(value); + } + } + } + + public float Time + { + get => m_SoundClipInitialized ? (float)m_SoundClipAudioSource.time : 0f; + set + { + if (m_SoundClipInitialized) + { + m_SoundClipAudioSource.time = Mathf.Clamp(value, 0, (float)m_SoundClipAudioSource.clip.length); + } + } + } + + public float Length => m_SoundClipInitialized ? (float)m_SoundClipAudioSource.clip.length : 0f; + + public bool Loop + { + get => m_SoundClipInitialized && m_SoundClipAudioSource.loop; + set { if (m_SoundClipInitialized) m_SoundClipAudioSource.loop = value; } + } + + /// 0 = 2D (flat), 1 = fully 3D spatial + public float SpatialBlend + { + get => m_SoundClipInitialized ? m_SoundClipAudioSource.spatialBlend : 0f; + set { if (m_SoundClipInitialized) m_SoundClipAudioSource.spatialBlend = value; } + } + + /// Authored min distance in scene/canvas space. + public float MinDistance + { + get => m_MinDistance; + set + { + m_MinDistance = value; + ApplyDistanceScale(m_DistanceScale); + } + } + + /// Authored max distance in scene/canvas space. + public float MaxDistance + { + get => m_MaxDistance; + set + { + m_MaxDistance = value; + ApplyDistanceScale(m_DistanceScale); + } + } + + /// Update the scene/canvas scale factor used to convert authored distances + /// to world-space AudioSource distances. + public void ApplyDistanceScale(float scale) + { + m_DistanceScale = scale; + if (m_SoundClipInitialized) + { + m_SoundClipAudioSource.minDistance = m_MinDistance * scale; + m_SoundClipAudioSource.maxDistance = m_MaxDistance * scale; + } + } + + public SoundClipController(SoundClip soundClip, SoundClipWidget widget) + { + m_SoundClip = soundClip; + m_SoundClipAudioSource = widget.gameObject.GetComponent(); + if (m_SoundClipAudioSource != null) + { + m_SoundClipInitialized = m_SoundClipAudioSource.clip != null; + } + } + + public SoundClipController(SoundClipController other) + { + m_SoundClip = other.m_SoundClip; + m_SoundClipAudioSource = other.m_SoundClipAudioSource; + m_SoundClipInitialized = other.m_SoundClipInitialized; + m_SoundClip.m_Controller = this; + } + + public void Dispose() + { + if (m_SoundClip != null) + { + m_SoundClip.OnControllerDisposed(this); + m_SoundClip = null; + } + } + + public void OnInitialization() + { + m_SoundClipInitialized = true; + m_OnSoundClipInitialized?.Invoke(); + m_OnSoundClipInitialized = null; + } + } + + public static SoundClip CreateDummySoundClip() + { + return new SoundClip(); + } + + private SoundClipController m_Controller; + + /// Persistent path is relative to the Tilt Brush/Media Library/SoundClips directory, if it is a + /// filename. + public string PersistentPath { get; } + public string AbsolutePath { get; } + public string HumanName { get; } + + public Texture2D Thumbnail { get; private set; } + + public uint Width { get; private set; } + + public uint Height { get; private set; } + + public float Aspect { get; private set; } + + public bool IsInitialized { get; private set; } + + public string Error { get; private set; } + + public SoundClip(string filePath) + { + PersistentPath = filePath.Substring(App.SoundClipLibraryPath().Length + 1); + HumanName = System.IO.Path.GetFileName(PersistentPath); + AbsolutePath = filePath; + } + + // Dummy SoundClip - this is used when a clip referenced in a sketch cannot be found. + private SoundClip() + { + IsInitialized = false; + Width = 160; + Height = 90; + Aspect = 16 / 9f; + PersistentPath = ""; + AbsolutePath = ""; + HumanName = ""; + } + + /// Creates a controller for this sound clip. Controllers are Disposable and it is important + /// to Dispose a controller after it is finished with. If disposal does not happen, then the + /// clip decoder will keep decoding, using up memory and bandwidth. If the audio is turned on + /// then the audio will continue. DISPOSE OF YOUR CONTROLLERS. + public SoundClipController CreateController(SoundClipWidget widget) + { + SoundClipController soundClipController = new SoundClipController(this, widget); + m_Controller = soundClipController; + SoundClipCatalog.Instance.StartCoroutine(PrepareAudioPlayer(InitializeControllers)); + return soundClipController; + } + + private void InitializeControllers() + { + m_Controller.OnInitialization(); + } + + private void OnControllerDisposed(SoundClipController soundClipController) + { + if (m_Controller != null && m_Controller.m_SoundClipAudioSource != null) + { + m_Controller.m_SoundClipAudioSource.Stop(); + UnityEngine.Object.Destroy(m_Controller.m_SoundClipAudioSource.gameObject); + m_Controller.m_SoundClipAudioSource = null; + } + } + + async Task LoadClip(string path) + { + AudioClip clip = null; + AudioType audioType = path.ToLower() switch + { + var a when a.EndsWith(".wav") => AudioType.WAV, + var a when a.EndsWith(".mp3") => AudioType.MPEG, + var a when a.EndsWith(".ogg") => AudioType.OGGVORBIS, + var a when a.EndsWith(".aiff") || a.EndsWith(".aif") => AudioType.AIFF, + var a when a.EndsWith(".mod") => AudioType.MOD, + var a when a.EndsWith(".it") => AudioType.IT, + var a when a.EndsWith(".s3m") => AudioType.S3M, + var a when a.EndsWith(".xm") => AudioType.XM, + _ => throw new ArgumentOutOfRangeException(nameof(path), $"Unsupported audio type: {path}.") + }; + + using (UnityWebRequest uwr = UnityWebRequestMultimedia.GetAudioClip(path, audioType)) + { + uwr.SendWebRequest(); + + try + { + while (!uwr.isDone) await Task.Delay(5); + + if (uwr.isNetworkError || uwr.isHttpError) Debug.Log($"{uwr.error}"); + else + { + clip = DownloadHandlerAudioClip.GetContent(uwr); + } + } + catch (Exception err) + { + Debug.Log($"{err.Message}, {err.StackTrace}"); + } + } + return clip; + } + + + private IEnumerator PrepareAudioPlayer(Action onCompletion) + { + Error = null; + m_Controller.m_SoundClipAudioSource.playOnAwake = false; + var audioClipTask = LoadClip(AbsolutePath); + while (!audioClipTask.IsCompleted) + { + yield return null; + } + m_Controller.m_SoundClipAudioSource.clip = audioClipTask.Result; + m_Controller.m_SoundClipAudioSource.loop = true; + + Width = 128; + Height = 128; + Aspect = 1; + + m_Controller.m_SoundClipAudioSource.mute = false; + m_Controller.m_SoundClipAudioSource.Play(); + + if (onCompletion != null) + { + onCompletion(); + } + } + + private void OnError(GvrAudioSource player, string error) + { + Error = error; + } + + public IEnumerator Initialize() + { + Width = 128; + Height = 128; + Aspect = 1; + + var audioClipTask = LoadClip(AbsolutePath); + while (!audioClipTask.IsCompleted) + { + yield return null; + } + + var clip = audioClipTask.Result; + if (clip != null) + { + Thumbnail = GetWaveform(0.8f, Color.white, clip); + UnityEngine.Object.Destroy(clip); + } + IsInitialized = true; + } + + public void Dispose() + { + if (m_Controller?.m_SoundClipAudioSource != null) + { + Debug.Assert(m_Controller != null, + "There should be a controller if the SoundClipAudioSource is not null."); + m_Controller.Dispose(); + } + if (Thumbnail != null) + { + UnityEngine.Object.Destroy(Thumbnail); + } + } + + public override string ToString() + { + return $"{HumanName}: {Width}x{Height} {Aspect}"; + } + + public Texture2D GetWaveform(float saturation, Color col, AudioClip audio = null, float aspect = 0) + { + int height = (int)Height; + int width = aspect > 0 ? Mathf.RoundToInt(height * aspect) : (int)Width; + audio ??= m_Controller?.m_SoundClipAudioSource?.clip; + if (audio == null) return null; + Texture2D tex = new Texture2D(width, height, TextureFormat.RGBA32, false); + float[] samples = new float[audio.samples * audio.channels]; + audio.GetData(samples, 0); + + // Find peak amplitude per column using max abs value in each range + float[] waveform = new float[width]; + int packSize = Mathf.Max(samples.Length / width, 1); + for (int x = 0; x < width; x++) + { + float peak = 0f; + int start = x * packSize; + int end = Mathf.Min(start + packSize, samples.Length); + for (int i = start; i < end; i++) + { + float abs = Mathf.Abs(samples[i]); + if (abs > peak) peak = abs; + } + waveform[x] = peak; + } + + // Normalize so the loudest peak fills the available height + float maxPeak = 0f; + for (int x = 0; x < width; x++) + { + if (waveform[x] > maxPeak) maxPeak = waveform[x]; + } + if (maxPeak > 0f) + { + for (int x = 0; x < width; x++) + { + waveform[x] /= maxPeak; + } + } + + // Clear to transparent + Color[] clear = new Color[width * height]; + tex.SetPixels(clear); + + // Draw centered waveform bars + int halfHeight = height / 2; + float scale = halfHeight * saturation; + for (int x = 0; x < width; x++) + { + int barHeight = Mathf.Clamp(Mathf.RoundToInt(waveform[x] * scale), 0, halfHeight - 1); + for (int y = 0; y <= barHeight; y++) + { + tex.SetPixel(x, halfHeight + y, col); + tex.SetPixel(x, halfHeight - y, col); + } + } + tex.Apply(); + + return tex; + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/SoundClip.cs.meta b/Assets/Scripts/SoundClip.cs.meta new file mode 100644 index 0000000000..e938e2c0f2 --- /dev/null +++ b/Assets/Scripts/SoundClip.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8a655622d4ae46039e24d7bef2a5ad6c +timeCreated: 1693146118 \ No newline at end of file diff --git a/Assets/Scripts/SoundClipButton.cs b/Assets/Scripts/SoundClipButton.cs new file mode 100644 index 0000000000..24d75319a0 --- /dev/null +++ b/Assets/Scripts/SoundClipButton.cs @@ -0,0 +1,57 @@ +// Copyright 2020 The Tilt 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. +namespace TiltBrush +{ + public class SoundClipButton : BaseButton + { + private SoundClip m_SoundClip; + + override protected void OnButtonPressed() + { + base.OnButtonPressed(); + CreateWidgetCommand createCommand = new CreateWidgetCommand( + WidgetManager.m_Instance.SoundClipWidgetPrefab, TrTransform.FromTransform(transform), null, + false, SelectionManager.m_Instance.SnappingGridSize, SelectionManager.m_Instance.SnappingAngle + ); + SketchMemoryScript.m_Instance.PerformAndRecordCommand(createCommand); + + SoundClipWidget soundClipWidget = createCommand.Widget as SoundClipWidget; + soundClipWidget.SetSoundClip(m_SoundClip); + soundClipWidget.Show(true); + createCommand.SetWidgetCost(soundClipWidget.GetTiltMeterCost()); + + WidgetManager.m_Instance.WidgetsDormant = false; + SketchControlsScript.m_Instance.EatGazeObjectInput(); + SelectionManager.m_Instance.RemoveFromSelection(false); + } + + public void RefreshDescription() + { + if (m_SoundClip != null) + { + SetDescriptionText(m_SoundClip.HumanName); + } + } + + public SoundClip SoundClip + { + get { return m_SoundClip; } + set + { + m_SoundClip = value; + SetButtonTexture(m_SoundClip.Thumbnail); + } + } + } +} diff --git a/Assets/Scripts/SoundClipButton.cs.meta b/Assets/Scripts/SoundClipButton.cs.meta new file mode 100644 index 0000000000..3d69eaac63 --- /dev/null +++ b/Assets/Scripts/SoundClipButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 24551363d68fa9848b0d5e8aa9e245ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SoundClipCatalog.cs b/Assets/Scripts/SoundClipCatalog.cs new file mode 100644 index 0000000000..56c6004b4c --- /dev/null +++ b/Assets/Scripts/SoundClipCatalog.cs @@ -0,0 +1,212 @@ +// Copyright 2023 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 System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace TiltBrush +{ + public class SoundClipCatalog : MonoBehaviour, IReferenceItemCatalog + { + static public SoundClipCatalog Instance { get; private set; } + [SerializeField] private string[] m_DefaultSoundClips; + [SerializeField] private bool m_DebugOutput; + [SerializeField] private string[] m_supportedSoundClipExtensions; + + private FileWatcher m_FileWatcher; + private bool m_ScanningDirectory; + private bool m_DirectoryScanRequired; + private HashSet m_ChangedFiles; + + private List m_SoundClips; + private string m_CurrentSoundClipDirectory; + public string CurrentSoundClipDirectory => m_CurrentSoundClipDirectory; + private List m_SoundClip; + + public bool IsScanning => m_ScanningDirectory; + + private void Awake() + { + Instance = this; + Init(); + } + + private void Init() + { + App.InitMediaLibraryPath(); + App.InitSoundClipLibraryPath(m_DefaultSoundClips); + ChangeDirectory(HomeDirectory); + } + + public event Action CatalogChanged; + public int ItemCount + { + get { return m_SoundClips.Count; } + } + + private void OnDestroy() + { + foreach (var clip in m_SoundClips) + { + clip.Dispose(); + } + m_FileWatcher.EnableRaisingEvents = false; + } + + public SoundClip GetSoundClipAtIndex(int index) + { + if (index < m_SoundClips.Count && index >= 0) + { + return m_SoundClips[index]; + } + throw new ArgumentException( + $"Sound Clip Catalog has {m_SoundClips.Count} soundclips. Clip {index} requested."); + } + + // Directory scanning works in the following manner: + // Scanning is triggered when the directory scan required flag is set, and no scanning is + // currently in progress. A Filewatcher watches the directory for changes and will set the scan + // required flag if it sees a change. If a file has changed, then it adds it to a list of changed + // files, so that it will force a rescan of that file, rather than ignoring it as a file it + // has already scanned. + private void Update() + { + if (m_DirectoryScanRequired) + { + ForceCatalogScan(); + } + } + + public void ForceCatalogScan() + { + if (!m_ScanningDirectory) + { + m_DirectoryScanRequired = false; + StartCoroutine(ScanReferenceDirectory()); + } + } + + private void OnDirectoryChanged(object source, FileSystemEventArgs e) + { + m_DirectoryScanRequired = true; + if (e.ChangeType == WatcherChangeTypes.Changed) + { + lock (m_ChangedFiles) + { + m_ChangedFiles.Add(e.FullPath); + } + } + } + + private IEnumerator ScanReferenceDirectory() + { + m_ScanningDirectory = true; + HashSet changedSet = null; + // We do a switcheroo on the changed list here so that there isn't a conflict with it + // if a filewatch callback happens. + lock (m_ChangedFiles) + { + changedSet = m_ChangedFiles; + m_ChangedFiles = new HashSet(); + } + + var existing = new HashSet(m_SoundClips.Select(x => x.AbsolutePath)); + var detected = new HashSet( + Directory.GetFiles(m_CurrentSoundClipDirectory, "*.*", SearchOption.TopDirectoryOnly).Where(x => m_supportedSoundClipExtensions.Contains(Path.GetExtension(x)))); + var toDelete = existing.Except(detected).Concat(changedSet).ToArray(); + var toScan = detected.Except(existing).Concat(changedSet).ToArray(); + + // Remove deleted sound clips from the list. Currently playing clips may continue to play, but will + // not appear in the reference panel. + m_SoundClips.RemoveAll(x => toDelete.Contains(x.AbsolutePath)); + + var newSoundClips = new List(); + foreach (var filePath in toScan) + { + SoundClip clipRef = new SoundClip(filePath); + newSoundClips.Add(clipRef); + m_SoundClips.Add(clipRef); + } + + // If we have a lot of clips, they may take a while to create thumbnails. Make sure we refresh + // every few seconds so the user sees progress if they go straight to the reference panel. + TimeSpan interval = TimeSpan.FromSeconds(4); + DateTime nextRefresh = DateTime.Now + interval; + foreach (var clipRef in newSoundClips) + { + if (DateTime.Now > nextRefresh) + { + CatalogChanged?.Invoke(); + nextRefresh = DateTime.Now + interval; + } + yield return clipRef.Initialize(); + } + + m_ScanningDirectory = false; + CatalogChanged?.Invoke(); + if (m_DebugOutput) + { + DebugListSoundClips(); + } + } + + /// Gets a clip form the catalog, given its filename. Returns null if no such clip is found. + public SoundClip GetSoundClipByPersistentPath(string path) + { + return m_SoundClips.FirstOrDefault(x => x.PersistentPath == path); + } + + public void DebugListSoundClips() + { + foreach (var clip in m_SoundClips) + { + Debug.Log(clip); + } + } + + public void ChangeDirectory(string newPath) + { + m_CurrentSoundClipDirectory = newPath; + m_SoundClips = new List(); + m_ChangedFiles = new HashSet(); + + StartCoroutine(ScanReferenceDirectory()); + + if (Directory.Exists(m_CurrentSoundClipDirectory)) + { + m_FileWatcher = new FileWatcher(m_CurrentSoundClipDirectory); + m_FileWatcher.NotifyFilter = NotifyFilters.LastWrite; + m_FileWatcher.FileChanged += OnDirectoryChanged; + m_FileWatcher.FileCreated += OnDirectoryChanged; + m_FileWatcher.FileDeleted += OnDirectoryChanged; + m_FileWatcher.EnableRaisingEvents = true; + } + } + + public string HomeDirectory => App.SoundClipLibraryPath(); + public bool IsHomeDirectory() => m_CurrentSoundClipDirectory == HomeDirectory; + + public bool IsSubDirectoryOfHome() + { + return m_CurrentSoundClipDirectory.StartsWith(HomeDirectory); + } + public string GetCurrentDirectory() + { + return m_CurrentSoundClipDirectory; + } + + } +} diff --git a/Assets/Scripts/SoundClipCatalog.cs.meta b/Assets/Scripts/SoundClipCatalog.cs.meta new file mode 100644 index 0000000000..7abb7766c0 --- /dev/null +++ b/Assets/Scripts/SoundClipCatalog.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4dca52281a4840acb41e0cb27ab4671c +timeCreated: 1693145608 \ No newline at end of file diff --git a/Assets/Scripts/StrokeData.cs b/Assets/Scripts/StrokeData.cs index a45fa2d32b..a8b72a9d65 100644 --- a/Assets/Scripts/StrokeData.cs +++ b/Assets/Scripts/StrokeData.cs @@ -13,6 +13,8 @@ // limitations under the License. using System; +using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace TiltBrush @@ -20,6 +22,7 @@ namespace TiltBrush [System.Serializable] public class StrokeData { + public Color m_Color; public Guid m_BrushGuid; // The room-space size of the brush when the stroke was laid down @@ -37,6 +40,10 @@ public class StrokeData public SketchGroupTag Group => m_Group; public Guid m_Guid; + // Optional per-control-point color data (null by default for 0 memory overhead) + public List m_OverrideColors; + public ColorOverrideMode m_ColorOverrideMode = ColorOverrideMode.None; + // Reference the BrushStrokeCommand that created this stroke with a WeakReference. // This allows the garbage collector to collect the BrushStrokeCommand if it's no // longer in use elsewhere. @@ -67,7 +74,84 @@ public StrokeData(StrokeData existing = null) this.m_Group = existing.m_Group; this.m_ControlPoints = new PointerManager.ControlPoint[existing.m_ControlPoints.Length]; Array.Copy(existing.m_ControlPoints, this.m_ControlPoints, this.m_ControlPoints.Length); + + // Copy per-point color data if present + this.m_ColorOverrideMode = existing.m_ColorOverrideMode; + if (existing.m_OverrideColors != null) + { + m_OverrideColors = existing.m_OverrideColors.ToList(); + } } } + + /// Get the color for a specific control point index. + /// Returns m_Color if per-point colors are not used, or blends according to m_ColorMode. + public Color32 GetColor(int index) + { + // If no per-point colors or mode is None, use base color + if (m_OverrideColors == null || m_ColorOverrideMode == ColorOverrideMode.None) + { + return m_Color; + } + + // Bounds check + if (index < 0 || index >= m_OverrideColors.Count) + { + return m_Color; + } + + Color32? controlpointColor = m_OverrideColors[index]; + if (controlpointColor == null) + { + return m_Color; + } + Color32 calculatedColor; + + // Preserve original alpha — some brushes (e.g. QuillFlatBrush) store + // per-vertex opacity in color.a. Override modes only affect RGB. + byte originalAlpha = (byte)(m_Color.a * 255); + + switch (m_ColorOverrideMode) + { + case ColorOverrideMode.Replace: + calculatedColor = controlpointColor.Value; + break; + + case ColorOverrideMode.Multiply: + Color baseColor = m_Color; + Color point = controlpointColor.Value; + calculatedColor = new Color( + baseColor.r * point.r, + baseColor.g * point.g, + baseColor.b * point.b, + baseColor.a + ); + break; + + case ColorOverrideMode.Add: + calculatedColor = new Color32( + (byte)Mathf.Min(255, m_Color.r + controlpointColor.Value.r), + (byte)Mathf.Min(255, m_Color.g + controlpointColor.Value.g), + (byte)Mathf.Min(255, m_Color.b + controlpointColor.Value.b), + originalAlpha + ); + break; + + default: + Debug.LogWarning($"Unexpected ColorOverrideMode: {m_ColorOverrideMode}"); + calculatedColor = m_Color; + break; + } + + return calculatedColor; + } + } + + public enum ColorOverrideMode + { + None, // Use m_Color for entire stroke + Replace, // Replace with per-point colors + Multiply, // Multiply m_Color with per-point colors + Add // Add per-point colors to m_Color } } // namespace TiltBrush diff --git a/Assets/Scripts/Switchboard.cs b/Assets/Scripts/Switchboard.cs index d91744c3e6..a3d098adad 100644 --- a/Assets/Scripts/Switchboard.cs +++ b/Assets/Scripts/Switchboard.cs @@ -36,6 +36,7 @@ public class Switchboard public event Action AllWidgetsDestroyed; public event Action SelectionChanged; public event Action VideoWidgetActivated; + public event Action SoundClipWidgetActivated; public event Action VideoRecordingStopped; public void TriggerAdvancedPanelsChanged() @@ -136,6 +137,11 @@ public void TriggerVideoWidgetActivated(VideoWidget widget) VideoWidgetActivated?.Invoke(widget); } + public void TriggerSoundClipWidgetActivated(SoundClipWidget widget) + { + SoundClipWidgetActivated?.Invoke(widget); + } + public void TriggerVideoRecordingStopped() { VideoRecordingStopped?.Invoke(); diff --git a/Assets/Scripts/SystemAudioMonitor.cs b/Assets/Scripts/SystemAudioMonitor.cs index 1a257d89cd..9d831b849e 100644 --- a/Assets/Scripts/SystemAudioMonitor.cs +++ b/Assets/Scripts/SystemAudioMonitor.cs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS using CSCore.CoreAudioAPI; using CSCore.SoundIn; using CSCore.Streams; @@ -107,7 +107,7 @@ public void Clear() private float[] m_LChannelTempBuffer; private float[] m_RChannelTempBuffer; -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS // Data that is only valid in State.Looking private Future> m_CapturesFuture; @@ -150,7 +150,7 @@ public int GetAudioDeviceSampleRate() void Awake() { m_State = State.Disabled; -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS int size = VisualizerManager.m_Instance.FFTSize; m_HotValues = new StereoBuffer(size); m_OperateValues = new StereoBuffer(size); @@ -179,7 +179,7 @@ public string GetCaptureStatusMessage() } } -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS public void Activate(float delaySeconds) { diff --git a/Assets/Scripts/Tools/BaseTool.cs b/Assets/Scripts/Tools/BaseTool.cs index 60e53984c8..235ddc0c64 100644 --- a/Assets/Scripts/Tools/BaseTool.cs +++ b/Assets/Scripts/Tools/BaseTool.cs @@ -48,6 +48,8 @@ public enum ToolType EmptyTool, CameraPathTool, FlyTool, + PushPullTool = 5100, + TintColorTool = 5101, ScriptedTool = 6001, SnipTool = 11000, JoinTool = 11001 diff --git a/Assets/Scripts/Tools/MultiCamTool.cs b/Assets/Scripts/Tools/MultiCamTool.cs index afce828de6..51865433f1 100644 --- a/Assets/Scripts/Tools/MultiCamTool.cs +++ b/Assets/Scripts/Tools/MultiCamTool.cs @@ -1618,7 +1618,11 @@ void UpdateAudioSearch() else { m_VideoRecordAudioHeader.text = m_AudioLookingText; +#if UNITY_ANDROID || UNITY_IOS + m_VideoRecordAudioDesc.text = "Play audio in the app"; +#else m_VideoRecordAudioDesc.text = "Play some sound or music on your computer"; +#endif } } else if (m_AudioFoundCountdown > 0.0f) diff --git a/Assets/Scripts/Tools/PushPullTool.cs b/Assets/Scripts/Tools/PushPullTool.cs new file mode 100644 index 0000000000..636193c5af --- /dev/null +++ b/Assets/Scripts/Tools/PushPullTool.cs @@ -0,0 +1,178 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace TiltBrush +{ + public class PushPullTool : ToggleStrokeModificationTool + { + /// Keeps track of the first sculpting change made while the trigger is held. + private bool m_AtLeastOneModificationMade = false; + private bool m_OwnsUndoGroup; + /// Determines whether the tool is in push mode or pull mode. + /// Corresponds to the On/Off state + private bool m_bIsPushing = true; + /// This holds a GameObject that represents the currently active sub-tool, inside + /// the existing sculpting sphere. These can be used for further finetuning + /// vertex interactions, and also just for visual representations for the + /// user. + [SerializeField] + public BaseSculptSubTool m_ActiveSubTool; + + public override void EnableTool(bool bEnable) + { + if (!bEnable) + { + EndOwnedUndoGroup(); + } + // Call this after setting up our tool's state. + base.EnableTool(bEnable); + // CTODO: change the material of all strokes to some wireframe shader. + HideTool(!bEnable); + } + + public override void HideTool(bool bHide) + { + if (bHide) + { + EndOwnedUndoGroup(); + } + m_ActiveSubTool.gameObject.SetActive(!bHide); + base.HideTool(bHide); + } + + protected override bool IsOn() + { + return m_bIsPushing; + } + + public void SetSubTool(BaseSculptSubTool subTool) + { + // Disable old subtool + m_ActiveSubTool.gameObject.SetActive(false); + m_ActiveSubTool = subTool; + } + + public void FinalizeSculptingBatch() + { + m_AtLeastOneModificationMade = false; + } + + public override void OnUpdateDetection() + { + if (!m_CurrentlyHot && m_ToolWasHot) + { + FinalizeSculptingBatch(); + ResetToolRotation(); + ClearGpuFutureLists(); + } + + if (InputManager.m_Instance.GetCommandDown(InputManager.SketchCommands.Activate)) + { + if (ApiManager.Instance.ActiveUndo == null) + { + ApiManager.Instance.StartUndo(); + m_OwnsUndoGroup = true; + } + } + else if (m_OwnsUndoGroup && !InputManager.m_Instance.GetCommand(InputManager.SketchCommands.Activate)) + { + ApiManager.Instance.EndUndo(); + m_OwnsUndoGroup = false; + } + + if (InputManager.m_Instance.GetCommandDown(InputManager.SketchCommands.TogglePushPull)) + { + if (m_ActiveSubTool.m_SubToolIdentifier != SculptSubToolManager.SubTool.Flatten) + { + m_bIsPushing = !m_bIsPushing; + StartToggleAnimation(); + } + // CTODO: custom feature for Flattening? + } + } + + protected override void OnAnimationSwitch() + { + // AudioManager.m_Instance.PlayToggleSelect(m_ToolTransform.position, true); + InputManager.m_Instance.TriggerHaptics(InputManager.ControllerName.Brush, m_HapticsToggleOn); + } + + protected override bool HandleIntersectionWithBatchedStroke(BatchSubset rGroup) + { + // Metadata of target stroke + var stroke = rGroup.m_Stroke; + var newControlPoints = stroke.m_ControlPoints.ToArray(); + + // Tool position adjusted by canvas transformations + bool strokeIsModified = false; + for (int i = 0; i < stroke.m_ControlPoints.Length; i++) + { + var newControlPoint = newControlPoints[i]; + float distance = Vector3.Distance(newControlPoint.m_Pos, m_CurrentCanvas.Pose.inverse * m_ToolTransform.position); + float strength = m_ActiveSubTool.CalculateStrength(newControlPoint.m_Pos, distance, m_CurrentCanvas.Pose, m_bIsPushing); + + if (distance <= GetSize() / m_CurrentCanvas.Pose.scale && strength != 0 && m_ActiveSubTool.IsInReach(newControlPoint.m_Pos, m_CurrentCanvas.Pose)) + { + Vector3 direction = m_ActiveSubTool.CalculateDirection(newControlPoint.m_Pos, m_ToolTransform, m_CurrentCanvas.Pose, m_bIsPushing, rGroup); + newControlPoint.m_Pos += direction * strength; + InputManager.m_Instance.TriggerHaptics(InputManager.ControllerName.Brush, m_HapticsToggleOn); + strokeIsModified = true; + newControlPoints[i] = newControlPoint; + } + } + + if (strokeIsModified) + { + PlayModifyStrokeSound(); + var undoParent = ApiManager.Instance.ActiveUndo; + var cmd = new ModifyStrokePointsCommand(stroke, newControlPoints, undoParent); + if (undoParent == null) + { + SketchMemoryScript.m_Instance.PerformAndRecordCommand(cmd); + } + else + { + // Apply immediately while keeping this command in the active undo group. + cmd.Redo(); + } + m_AtLeastOneModificationMade = true; + } + + return true; + } + + public override void AssignControllerMaterials(InputManager.ControllerName controller) + { + if (m_ActiveSubTool.m_SubToolIdentifier != SculptSubToolManager.SubTool.Flatten) + { + InputManager.Brush.Geometry.ShowSculptToggle(m_bIsPushing); + } + } + + private void EndOwnedUndoGroup() + { + if (!m_OwnsUndoGroup) + { + return; + } + ApiManager.Instance.EndUndo(); + m_OwnsUndoGroup = false; + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/PushPullTool.cs.meta b/Assets/Scripts/Tools/PushPullTool.cs.meta new file mode 100644 index 0000000000..7e8d670874 --- /dev/null +++ b/Assets/Scripts/Tools/PushPullTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b26b4ceb382647f39a512cffc4cad27e +timeCreated: 1669373115 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting.meta b/Assets/Scripts/Tools/Sculpting.meta new file mode 100644 index 0000000000..3b47a5549f --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 34664c6eda27420694a5df07ca91ea21 +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting/BaseSculptSubTool.cs b/Assets/Scripts/Tools/Sculpting/BaseSculptSubTool.cs new file mode 100644 index 0000000000..c89ffd753a --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/BaseSculptSubTool.cs @@ -0,0 +1,44 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 UnityEngine; + +namespace TiltBrush +{ + public abstract class BaseSculptSubTool : MonoBehaviour + { + + protected float m_DefaultStrength = 0.1f; + + public SculptSubToolManager.SubTool m_SubToolIdentifier; + + protected Collider m_Collider; + + + + /// For sculpting tools with an interactor that limits the sculpting tool's + /// sphere of influence. If the interactor doesn't exist or shouldn't limit things, this is ignored. + public virtual bool IsInReach(Vector3 vertex, TrTransform canvasPose) + { + return true; + } + + public virtual float CalculateStrength(Vector3 vertex, float distance, TrTransform canvasPose, bool bPushing) + { + return m_DefaultStrength; + } + + public abstract Vector3 CalculateDirection(Vector3 vertex, Transform toolTransform, TrTransform canvasPose, bool bPushing, BatchSubset rGroup); + } +} //namespace TiltBrush diff --git a/Assets/Scripts/Tools/Sculpting/BaseSculptSubTool.cs.meta b/Assets/Scripts/Tools/Sculpting/BaseSculptSubTool.cs.meta new file mode 100644 index 0000000000..509abb66a5 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/BaseSculptSubTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d20ecfad9c4f4590ad107ed29e9ab6c0 +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting/CreaseSubTool.cs b/Assets/Scripts/Tools/Sculpting/CreaseSubTool.cs new file mode 100644 index 0000000000..3c8bb6d453 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/CreaseSubTool.cs @@ -0,0 +1,38 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 UnityEngine; +namespace TiltBrush +{ + public class CreaseSubTool : BaseSculptSubTool + { + + private void Awake() + { + m_SubToolIdentifier = SculptSubToolManager.SubTool.Crease; + m_Collider = GetComponent(); + } + + public override bool IsInReach(Vector3 vertex, TrTransform canvasPose) + { + return m_Collider.bounds.Contains(canvasPose * vertex); + } + + public override Vector3 CalculateDirection(Vector3 vertex, Transform toolTransform, TrTransform canvasPose, bool bPushing, BatchSubset rGroup) + { + return (bPushing ? 1 : -1) * -(vertex - rGroup.m_Bounds.center).normalized; + } + } + +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/Sculpting/CreaseSubTool.cs.meta b/Assets/Scripts/Tools/Sculpting/CreaseSubTool.cs.meta new file mode 100644 index 0000000000..ea450a8a90 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/CreaseSubTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 61a4f4b9669647408a76a8f36e499491 +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting/FlattenSubTool.cs b/Assets/Scripts/Tools/Sculpting/FlattenSubTool.cs new file mode 100644 index 0000000000..6396af86af --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/FlattenSubTool.cs @@ -0,0 +1,41 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 UnityEngine; +namespace TiltBrush +{ + public class FlattenSubTool : BaseSculptSubTool + { + + private void Awake() + { + m_SubToolIdentifier = SculptSubToolManager.SubTool.Flatten; + m_Collider = GetComponent(); + } + + public override float CalculateStrength(Vector3 vertex, float distance, TrTransform canvasPose, bool bPushing) + { + var distanceToSubTool = (vertex - canvasPose.inverse * m_Collider.ClosestPoint(canvasPose * vertex)).magnitude; + if (distanceToSubTool < 0.1f) + return 0; + return distanceToSubTool - 0.1f; + } + + public override Vector3 CalculateDirection(Vector3 vertex, Transform toolTransform, TrTransform canvasPose, bool bPushing, BatchSubset rGroup) + { + return -(vertex - canvasPose.inverse * m_Collider.ClosestPoint(canvasPose * vertex)).normalized; + } + } + +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/Sculpting/FlattenSubTool.cs.meta b/Assets/Scripts/Tools/Sculpting/FlattenSubTool.cs.meta new file mode 100644 index 0000000000..3177d999e6 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/FlattenSubTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 401478a7696a46a8b35fc186c6cf40c9 +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting/PushSubTool.cs b/Assets/Scripts/Tools/Sculpting/PushSubTool.cs new file mode 100644 index 0000000000..b6f94dd3dd --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/PushSubTool.cs @@ -0,0 +1,41 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 UnityEngine; + +namespace TiltBrush +{ + public class PushSubTool : BaseSculptSubTool + { + + private void Awake() + { + m_SubToolIdentifier = SculptSubToolManager.SubTool.Push; + } + + public override float CalculateStrength(Vector3 vertex, float distance, TrTransform canvasPose, bool bPushing) + { + if (!bPushing) // special calculation to reduce spikyness + return m_DefaultStrength * Mathf.Pow(distance, 2); + else + return m_DefaultStrength; + } + + public override Vector3 CalculateDirection(Vector3 vertex, Transform toolTransform, TrTransform canvasPose, bool bPushing, BatchSubset rGroup) + { + return (bPushing ? 1 : -1) * (vertex - canvasPose.inverse * toolTransform.position).normalized; + } + } + +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/Sculpting/PushSubTool.cs.meta b/Assets/Scripts/Tools/Sculpting/PushSubTool.cs.meta new file mode 100644 index 0000000000..0fc689941f --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/PushSubTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 28362f04618f450192bbd51aa203f99e +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting/RotateSubTool.cs b/Assets/Scripts/Tools/Sculpting/RotateSubTool.cs new file mode 100644 index 0000000000..ba09973bd7 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/RotateSubTool.cs @@ -0,0 +1,53 @@ +// Copyright 2022 Chingiz Dadashov-Khandan +// +// 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 UnityEngine; + +namespace TiltBrush +{ + public class RotateSubTool : BaseSculptSubTool + { + + private void Awake() + { + m_SubToolIdentifier = SculptSubToolManager.SubTool.Rotate; + m_Collider = GetComponent(); + } + + public override float CalculateStrength(Vector3 vertex, float distance, TrTransform canvasPose, bool bPushing) + { + // this is wrong. should be distance to closest point, not center. That's why it's so scuffed. + return distance * 0.05f; + } + + // Adapted from https://answers.unity.com/questions/532297/rotate-a-vector-around-a-certain-point.html + // CTODO: very broken + public override Vector3 CalculateDirection(Vector3 vertex, Transform toolTransform, TrTransform canvasPose, bool bPushing, BatchSubset rGroup) + { + var toolPos = canvasPose.inverse * toolTransform.position; + var direction = vertex - canvasPose.inverse * m_Collider.ClosestPoint(canvasPose * vertex); + // the normal of the point to the toolthing would be the closest point. + // Debug.Log("tool rotation: " + " " + toolTransform.eulerAngles.x + " " + toolTransform.eulerAngles.y + " " + toolTransform.eulerAngles.z); + // direction = Quaternion.Euler(canvasPose.rotation.x + toolTransform.eulerAngles.x, canvasPose.rotation.y + toolTransform.eulerAngles.y, canvasPose.rotation.z + toolTransform.eulerAngles.z + (bPushing ? 1 : -1) * 90) * direction.normalized; + var oldRotation = toolTransform.rotation; + toolTransform.rotation *= Quaternion.Inverse(canvasPose.rotation); + //ugly way to ignore z component + // toolTransform.rotation = Quaternion.Euler(toolTransform.rotation.eulerAngles.x, toolTransform.rotation.eulerAngles.y, oldRotation.eulerAngles.z); + direction = Quaternion.AngleAxis((bPushing ? 1 : -1) * -90, toolTransform.forward) * direction.normalized; + toolTransform.rotation = oldRotation; + return direction; + } + } + +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/Sculpting/RotateSubTool.cs.meta b/Assets/Scripts/Tools/Sculpting/RotateSubTool.cs.meta new file mode 100644 index 0000000000..62ffcefbb7 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/RotateSubTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a118a908fdd143518b0eae01ed9516d4 +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/Sculpting/SculptSubToolManager.cs b/Assets/Scripts/Tools/Sculpting/SculptSubToolManager.cs new file mode 100644 index 0000000000..0b88e7bc4b --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/SculptSubToolManager.cs @@ -0,0 +1,41 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Serialization; + + +namespace TiltBrush +{ + public class SculptSubToolManager : MonoBehaviour + { + + public static SculptSubToolManager m_Instance; + + private List m_SubTools; + + [SerializeField] + private PushPullTool m_PushPullTool; + + /// Do not change the order of these items + public enum SubTool + { + Push, + Crease, + Flatten, + Rotate + } + + private void Awake() + { + m_Instance = this; + m_SubTools = new List(); + foreach (Transform child in transform) + m_SubTools.Add(child.gameObject.GetComponent()); + } + + public void SetSubTool(SubTool subTool) + { + m_PushPullTool.SetSubTool(m_SubTools[(int)subTool]); + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/Sculpting/SculptSubToolManager.cs.meta b/Assets/Scripts/Tools/Sculpting/SculptSubToolManager.cs.meta new file mode 100644 index 0000000000..49569472e2 --- /dev/null +++ b/Assets/Scripts/Tools/Sculpting/SculptSubToolManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8fcab0ed71e649cd95d1e668f220beda +timeCreated: 1669373161 \ No newline at end of file diff --git a/Assets/Scripts/Tools/TintColorTool.cs b/Assets/Scripts/Tools/TintColorTool.cs new file mode 100644 index 0000000000..1cc9d1c6ce --- /dev/null +++ b/Assets/Scripts/Tools/TintColorTool.cs @@ -0,0 +1,247 @@ +// 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 System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace TiltBrush +{ + /// Paints per-control-point color overrides inside the tool radius. + /// Thumbstick press cycles through modes: Replace → Multiply → Add → Clear. + public class TintColorTool : ToggleStrokeModificationTool + { + private enum TintMode + { + Replace, + Multiply, + Add, + Clear + } + + private static readonly TintMode[] k_ModeOrder = + { + TintMode.Replace, + // TintMode.Multiply, + // TintMode.Add, + TintMode.Clear + }; + + [SerializeField] private Texture2D m_IconReplace; + [SerializeField] private Texture2D m_IconMultiply; + [SerializeField] private Texture2D m_IconAdd; + [SerializeField] private Texture2D m_IconClear; + + private TintMode m_CurrentMode = TintMode.Replace; + private bool m_OwnsUndoGroup; + public float EffectAmount { get; set; } = 1f; + + protected override bool IsOn() + { + return m_CurrentMode != TintMode.Clear; + } + + public override void OnUpdateDetection() + { + if (!m_CurrentlyHot && m_ToolWasHot) + { + ResetToolRotation(); + ClearGpuFutureLists(); + } + + if (InputManager.m_Instance.GetCommandDown(InputManager.SketchCommands.Activate)) + { + if (ApiManager.Instance.ActiveUndo == null) + { + ApiManager.Instance.StartUndo(); + m_OwnsUndoGroup = true; + } + } + else if (m_OwnsUndoGroup && !InputManager.m_Instance.GetCommand(InputManager.SketchCommands.Activate)) + { + ApiManager.Instance.EndUndo(); + m_OwnsUndoGroup = false; + } + + if (InputManager.m_Instance.GetCommandDown(InputManager.SketchCommands.TogglePushPull)) + { + int idx = System.Array.IndexOf(k_ModeOrder, m_CurrentMode); + m_CurrentMode = k_ModeOrder[(idx + 1) % k_ModeOrder.Length]; + StartToggleAnimation(); + } + } + + public override void EnableTool(bool bEnable) + { + if (!bEnable) + { + EndOwnedUndoGroup(); + } + base.EnableTool(bEnable); + } + + public override void HideTool(bool bHide) + { + if (bHide) + { + EndOwnedUndoGroup(); + } + base.HideTool(bHide); + } + + protected override void OnAnimationSwitch() + { + InputManager.m_Instance.TriggerHaptics(InputManager.ControllerName.Brush, m_HapticsToggleOn); + } + + protected override bool HandleIntersectionWithBatchedStroke(BatchSubset rGroup) + { + var stroke = rGroup.m_Stroke; + int controlPointCount = stroke.m_ControlPoints.Length; + if (controlPointCount == 0) + { + return true; + } + + List newOverrideColors = stroke.m_OverrideColors != null && + stroke.m_OverrideColors.Count == controlPointCount + ? stroke.m_OverrideColors.ToList() + : new List(new Color32?[controlPointCount]); + bool applyingTint = m_CurrentMode != TintMode.Clear; + bool strokeIsModified = false; + Color tintColor = PointerManager.m_Instance.PointerColor; + Color baseColor = stroke.m_Color; + float pressure = InputManager.Brush.GetTriggerRatio(); + float amount = pressure * EffectAmount * 0.5f; + float maxDistance = GetSize() / m_CurrentCanvas.Pose.scale; + Vector3 toolPos = m_CurrentCanvas.Pose.inverse * m_ToolTransform.position; + + for (int i = 0; i < controlPointCount; i++) + { + float distance = Vector3.Distance(stroke.m_ControlPoints[i].m_Pos, toolPos); + if (distance > maxDistance) + { + continue; + } + + if (applyingTint) + { + // Identity depends on mode: Replace=baseColor, Multiply=white, Add=black + Color identity = m_CurrentMode == TintMode.Multiply ? Color.white + : m_CurrentMode == TintMode.Add ? Color.black + : baseColor; + Color existing = newOverrideColors[i].HasValue + ? (Color)newOverrideColors[i].Value + : identity; + // Lerp RGB only — preserve alpha (used by QuillFlatBrush for per-vertex opacity) + Color32 blended = Color.Lerp(existing, tintColor, amount); + blended.a = newOverrideColors[i].HasValue + ? newOverrideColors[i].Value.a + : (byte)255; + if (!newOverrideColors[i].HasValue || !newOverrideColors[i].Value.Equals(blended)) + { + newOverrideColors[i] = blended; + strokeIsModified = true; + } + } + else if (newOverrideColors[i].HasValue) + { + newOverrideColors[i] = null; + strokeIsModified = true; + } + } + + ColorOverrideMode targetMode = stroke.m_ColorOverrideMode; + if (applyingTint) + { + ColorOverrideMode desiredMode = ModeToColorOverrideMode(m_CurrentMode); + if (targetMode != desiredMode) + { + targetMode = desiredMode; + strokeIsModified = true; + } + } + else if (!newOverrideColors.Any(c => c.HasValue)) + { + if (stroke.m_OverrideColors != null || targetMode != ColorOverrideMode.None) + { + newOverrideColors = null; + targetMode = ColorOverrideMode.None; + strokeIsModified = true; + } + } + + if (strokeIsModified) + { + PlayModifyStrokeSound(); + var undoParent = ApiManager.Instance.ActiveUndo; + var cmd = new ModifyStrokePointColorsCommand(stroke, newOverrideColors, targetMode, undoParent); + if (undoParent == null) + { + SketchMemoryScript.m_Instance.PerformAndRecordCommand(cmd); + } + else + { + // Apply changes immediately while keeping this command inside the active undo group. + cmd.Redo(); + } + InputManager.m_Instance.TriggerHaptics(InputManager.ControllerName.Brush, m_HapticsToggleOn); + } + + return true; + } + + public override void AssignControllerMaterials(InputManager.ControllerName controller) + { + if (controller == InputManager.ControllerName.Brush) + { + InputManager.Brush.Geometry.ShowTintMode( + m_CurrentMode != TintMode.Clear, GetIconForMode(m_CurrentMode)); + } + } + + private Texture2D GetIconForMode(TintMode mode) + { + switch (mode) + { + case TintMode.Replace: return m_IconReplace; + case TintMode.Multiply: return m_IconMultiply; + case TintMode.Add: return m_IconAdd; + case TintMode.Clear: return m_IconClear; + default: return null; + } + } + + private static ColorOverrideMode ModeToColorOverrideMode(TintMode mode) + { + switch (mode) + { + case TintMode.Replace: return ColorOverrideMode.Replace; + case TintMode.Multiply: return ColorOverrideMode.Multiply; + case TintMode.Add: return ColorOverrideMode.Add; + default: return ColorOverrideMode.None; + } + } + + private void EndOwnedUndoGroup() + { + if (!m_OwnsUndoGroup) + { + return; + } + ApiManager.Instance.EndUndo(); + m_OwnsUndoGroup = false; + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/Tools/TintColorTool.cs.meta b/Assets/Scripts/Tools/TintColorTool.cs.meta new file mode 100644 index 0000000000..4b7585495e --- /dev/null +++ b/Assets/Scripts/Tools/TintColorTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afca3f873ff6046679a2d38d96801a0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UnityGLTF Plugins/OpenBrushAudioImport.cs b/Assets/Scripts/UnityGLTF Plugins/OpenBrushAudioImport.cs new file mode 100644 index 0000000000..80a73ec9a0 --- /dev/null +++ b/Assets/Scripts/UnityGLTF Plugins/OpenBrushAudioImport.cs @@ -0,0 +1,229 @@ +// Copyright 2024 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 System; +using System.Collections.Generic; +using System.IO; +using GLTF.Schema; +using TiltBrush; +using UnityEngine; + +namespace UnityGLTF.Plugins +{ + /// + /// Imports KHR_audio_emitter nodes from GLTF by adding GltfAudioSource components + /// to the relevant nodes in the model hierarchy. Audio plays when the model is active. + /// SoundClipWidgets are only created when the model is broken apart. + /// + public class OpenBrushAudioImport : GLTFImportPlugin + { + public override string DisplayName => "Open Brush Audio Import"; + public override string Description => "Adds GltfAudioSource components from KHR_audio_emitter nodes."; + + public override GLTFImportPluginContext CreateInstance(GLTFImportContext context) + { + return new OpenBrushAudioImportContext(context); + } + } + + public class OpenBrushAudioImportContext : GLTFImportPluginContext + { + private readonly GLTFImportContext _context; + private KHR_audio_emitter _audioExtension; + + private struct PendingAudioNode + { + public GameObject NodeObject; + public KHR_AudioEmitter Emitter; + } + + private readonly List _pendingNodes = new(); + + // audio array index → absolute file path of extracted audio + private readonly Dictionary _audioFilePaths = new(); + + /// Set by the import call site so sidecar URI audio can be resolved. + public string GltfDirectory { get; set; } + + public OpenBrushAudioImportContext(GLTFImportContext context) + { + _context = context; + } + + public override void OnAfterImportRoot(GLTFRoot gltfRoot) + { + if (gltfRoot.Extensions == null) return; + if (gltfRoot.Extensions.TryGetValue(KHR_audio_emitter.ExtensionName, out var ext)) + _audioExtension = ext as KHR_audio_emitter; + } + + public override void OnAfterImportNode(Node node, int nodeIndex, GameObject nodeObject) + { + if (_audioExtension == null) return; + if (node.Extensions == null) return; + if (!node.Extensions.TryGetValue(KHR_NodeAudioEmitterRef.ExtensionName, out var ext)) return; + + if (ext is KHR_NodeAudioEmitterRef nodeRef && nodeRef.emitter != null) + { + _pendingNodes.Add(new PendingAudioNode + { + NodeObject = nodeObject, + Emitter = nodeRef.emitter.Value, + }); + } + } + + public override void OnAfterImportScene(GLTFScene scene, int sceneIndex, GameObject sceneObject) + { + if (_audioExtension == null || _pendingNodes.Count == 0) return; + ExtractAudioFiles(); + SetupAudioComponents(); + } + + private void ExtractAudioFiles() + { + if (_audioExtension.audio == null) return; + + // Store outside the sound clip library so the catalog doesn't pick these up. + string importDir = Path.Combine(Application.persistentDataPath, "GltfAudio"); + Directory.CreateDirectory(importDir); + + for (int i = 0; i < _audioExtension.audio.Count; i++) + { + var audio = _audioExtension.audio[i]; + + if (audio.bufferView != null) + { + var bvId = audio.bufferView.Id; + var bvCount = audio.bufferView.Root?.BufferViews?.Count ?? 0; + if (bvId < 0 || bvId >= bvCount) + { + Debug.LogWarning($"[OBAudio] audio[{i}].bufferView.Id={bvId} is out of range (bufferViews.Count={bvCount}), skipping"); + continue; + } + + var buffer = _context.SceneImporter.GetBufferViewData(audio.bufferView.Value); + if (!buffer.IsCreated) continue; + + string ext = MimeTypeToExtension(audio.mimeType); + if (ext == null) + { + Debug.LogWarning($"[OBAudio] Unsupported mime type '{audio.mimeType}', skipping audio[{i}]"); + continue; + } + + string filePath = GetUniquePath(importDir, $"audio_{i:D3}{ext}"); + File.WriteAllBytes(filePath, buffer.ToArray()); + _audioFilePaths[i] = filePath; + } + else if (!string.IsNullOrEmpty(audio.uri)) + { + if (string.IsNullOrEmpty(GltfDirectory)) + { + Debug.LogWarning($"[OBAudio] Cannot resolve sidecar URI '{audio.uri}': GltfDirectory not set."); + continue; + } + + string srcPath = Path.GetFullPath(Path.Combine(GltfDirectory, audio.uri)); + if (!File.Exists(srcPath)) + { + Debug.LogWarning($"[OBAudio] Audio sidecar file not found: {srcPath}"); + continue; + } + + string ext = Path.GetExtension(srcPath); + string destPath = GetUniquePath(importDir, $"audio_{i:D3}{ext}"); + File.Copy(srcPath, destPath); + _audioFilePaths[i] = destPath; + } + } + } + + private void SetupAudioComponents() + { + foreach (var pending in _pendingNodes) + SetupAudioOnNode(pending); + } + + private void SetupAudioOnNode(PendingAudioNode pending) + { + var emitter = pending.Emitter; + if (emitter.sources == null || emitter.sources.Count == 0) + { + Debug.LogWarning($"[OBAudio] Emitter '{emitter.name}' has no sources, skipping"); + return; + } + + var source = emitter.sources[0].Value; + if (source.audio == null) + { + Debug.LogWarning($"[OBAudio] Source has no audio reference, skipping"); + return; + } + + int audioIndex = source.audio.Id; + if (!_audioFilePaths.TryGetValue(audioIndex, out var filePath)) + { + Debug.LogWarning($"[OBAudio] No extracted file for audio index {audioIndex}, skipping"); + return; + } + + bool isSpatial = emitter.type == "positional"; + float gain = (emitter.gain > 0 ? emitter.gain : 1f) * (source.gain ?? 1f); + bool loop = source.loop ?? true; + bool autoPlay = source.autoPlay ?? true; + + var audioSource = pending.NodeObject.AddComponent(); + audioSource.playOnAwake = false; // GltfAudioSource handles playback + audioSource.spatialBlend = isSpatial ? 1f : 0f; + audioSource.minDistance = emitter.positional?.refDistance ?? 1f; + audioSource.maxDistance = emitter.positional?.maxDistance ?? 500f; + + var gltfAudio = pending.NodeObject.AddComponent(); + gltfAudio.AbsoluteFilePath = filePath; + gltfAudio.Gain = gain; + gltfAudio.Loop = loop; + gltfAudio.SpatialBlend = isSpatial ? 1f : 0f; + gltfAudio.MinDistance = emitter.positional?.refDistance ?? 1f; + gltfAudio.MaxDistance = emitter.positional?.maxDistance ?? 500f; + gltfAudio.AutoPlay = autoPlay; + } + + private static string MimeTypeToExtension(string mimeType) + { + return mimeType switch + { + "audio/mpeg" => ".mp3", + "audio/wav" => ".wav", + "audio/ogg" => ".ogg", + _ => null, + }; + } + + private static string GetUniquePath(string directory, string filename) + { + string path = Path.Combine(directory, filename); + if (!File.Exists(path)) return path; + + string name = Path.GetFileNameWithoutExtension(filename); + string ext = Path.GetExtension(filename); + for (int i = 1; i < 1000; i++) + { + path = Path.Combine(directory, $"{name}_{i}{ext}"); + if (!File.Exists(path)) return path; + } + return Path.Combine(directory, $"{name}_{Guid.NewGuid()}{ext}"); + } + } +} diff --git a/Assets/Scripts/UnityGLTF Plugins/OpenBrushAudioImport.cs.meta b/Assets/Scripts/UnityGLTF Plugins/OpenBrushAudioImport.cs.meta new file mode 100644 index 0000000000..d275431960 --- /dev/null +++ b/Assets/Scripts/UnityGLTF Plugins/OpenBrushAudioImport.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26f6af0e137738040920f0910876a03c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UnityGLTF Plugins/OpenBrushExportPlugin.cs b/Assets/Scripts/UnityGLTF Plugins/OpenBrushExportPlugin.cs index dd6822ab0e..33cedd7c60 100644 --- a/Assets/Scripts/UnityGLTF Plugins/OpenBrushExportPlugin.cs +++ b/Assets/Scripts/UnityGLTF Plugins/OpenBrushExportPlugin.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using GLTF.Schema; using Newtonsoft.Json.Linq; @@ -31,6 +32,7 @@ public class OpenBrushExportPluginConfig : GLTFExportPluginContext private List m_CameraPathsCameras; private GameObject m_ThumbnailCamera; private bool m_WasUsingBatchedBrushes; + private List<(Node node, SoundClipWidget widget)> m_SoundClipNodes; public override void BeforeSceneExport(GLTFSceneExporter exporter, GLTFRoot gltfRoot) { @@ -42,6 +44,7 @@ public override void BeforeSceneExport(GLTFSceneExporter exporter, GLTFRoot gltf _meshesToBatches = new Dictionary(); m_OriginalBatchMeshes = new Dictionary(); m_TemporaryBatchMeshes = new List(); + m_SoundClipNodes = new List<(Node node, SoundClipWidget widget)>(); GenerateCameraPathsCameras(); m_ThumbnailCamera = App.Instance.InstantiateThumbnailCamera(); m_ThumbnailCamera.transform.SetParent(App.Scene.MainCanvas.transform, worldPositionStays: true); @@ -231,6 +234,15 @@ public override bool ShouldNodeExport(GLTFSceneExporter exporter, GLTFRoot gltfR }; bool hasExcludedComponent = excludedTypes.Any(t => transform.GetComponent(t) != null); bool excludedName = false; // TODO + + // Exclude children of SoundClipWidget (distance visualisation spheres etc.) + // but keep the widget node itself so we can attach the audio emitter to it. + if (transform.GetComponent() == null && + transform.GetComponentInParent() != null) + { + return false; + } + return !hasExcludedComponent && !excludedName; } @@ -315,6 +327,15 @@ public override void AfterNodeExport(GLTFSceneExporter exporter, GLTFRoot gltfRo } if (!Application.isPlaying) return; + + var soundClipWidget = transform.GetComponent(); + if (soundClipWidget != null && + soundClipWidget.SoundClip != null && + !string.IsNullOrEmpty(soundClipWidget.SoundClip.AbsolutePath)) + { + m_SoundClipNodes.Add((node, soundClipWidget)); + } + if (App.UserConfig.Export.KeepStrokes && App.UserConfig.Export.ExportStrokeMetadata) { var brush = transform.GetComponent(); @@ -412,8 +433,9 @@ public override void AfterMaterialExport(GLTFSceneExporter exporter, GLTFRoot gl if (shaderName.StartsWith("Brush/")) { - // TODO - This assumes that every brush has a unique material with a unique name - // Currently, this is true, but it may not always be the case + // TODO - This assumes that every brush material has a unique name + // (or at least if two brush materials have the same name then they are interchangeable) + // Currently, the former is true, but this may not always be the case var brushes = BrushCatalog.m_Instance.AllBrushes .Where(b => b.Material.name == material.name.Replace("(Instance)", "").TrimEnd()) .ToList(); @@ -474,10 +496,109 @@ public override void AfterMaterialExport(GLTFSceneExporter exporter, GLTFRoot gl } } + private static string AudioMimeType(string filePath) + { + return Path.GetExtension(filePath).ToLowerInvariant() switch + { + ".mp3" => "audio/mpeg", + ".wav" => "audio/wav", + ".ogg" => "audio/ogg", + _ => "audio/mpeg" + }; + } + + private void ExportSoundClips(GLTFSceneExporter exporter, GLTFRoot gltfRoot) + { + if (m_SoundClipNodes == null || m_SoundClipNodes.Count == 0) return; + + var rootExt = new GLTF.Schema.KHR_audio_emitter(); + + foreach (var (node, widget) in m_SoundClipNodes) + { + var soundClip = widget.SoundClip; + var (volume, loop, spatialBlend, minDistance, maxDistance) = widget.GetAudioExportSettings(); + + if (!File.Exists(soundClip.AbsolutePath)) + { + Debug.LogWarning($"KHR_audio_emitter: audio file not found, skipping: {soundClip.AbsolutePath}"); + continue; + } + + // Export the audio file — bufferView for GLB, sidecar file for GLTF + var fileStream = new FileStream(soundClip.AbsolutePath, FileMode.Open, FileAccess.Read); + var result = exporter.ExportFile( + Path.GetFileName(soundClip.AbsolutePath), + AudioMimeType(soundClip.AbsolutePath), + fileStream); + + int audioIndex = rootExt.audio.Count; + var audioData = new KHR_AudioData(); + if (string.IsNullOrEmpty(result.uri)) + { + audioData.mimeType = result.mimeType; + audioData.bufferView = result.bufferView; + } + else + { + audioData.uri = result.uri; + } + rootExt.audio.Add(audioData); + + int sourceIndex = rootExt.sources.Count; + rootExt.sources.Add(new KHR_AudioSource + { + audio = new AudioDataId { Id = audioIndex, Root = gltfRoot }, + gain = volume, + loop = loop, + autoPlay = true, + Name = soundClip.HumanName, + }); + + bool isSpatial = spatialBlend > 0.5f; + int emitterIndex = rootExt.emitters.Count; + rootExt.emitters.Add(new KHR_AudioEmitter + { + type = isSpatial ? "positional" : "global", + gain = 1.0f, + sources = new List + { + new AudioSourceId { Id = sourceIndex, Root = gltfRoot } + }, + positional = isSpatial ? new PositionalEmitterData + { + distanceModel = PositionalAudioDistanceModel.inverse, + refDistance = minDistance, + maxDistance = maxDistance, + rolloffFactor = 1.0f + } : null + }); + + node.AddExtension(GLTF.Schema.KHR_audio_emitter.ExtensionName, + new KHR_NodeAudioEmitterRef + { + emitter = new AudioEmitterId { Id = emitterIndex, Root = gltfRoot } + }); + } + + if (rootExt.audio.Count == 0) return; + + gltfRoot.AddExtension(GLTF.Schema.KHR_audio_emitter.ExtensionName, rootExt); + exporter.DeclareExtensionUsage(GLTF.Schema.KHR_audio_emitter.ExtensionName); + } + public override void AfterSceneExport(GLTFSceneExporter exporter, GLTFRoot gltfRoot) { if (!Application.isPlaying) return; + try + { + ExportSoundClips(exporter, gltfRoot); + } + catch (Exception e) + { + Debug.LogError($"Error exporting sound clips: {e.Message}"); + } + try { ExportCameraPaths(exporter); diff --git a/Assets/Scripts/VideoCatalog.cs b/Assets/Scripts/VideoCatalog.cs index 1a6d91d0ab..85cda2d73d 100644 --- a/Assets/Scripts/VideoCatalog.cs +++ b/Assets/Scripts/VideoCatalog.cs @@ -155,7 +155,7 @@ private IEnumerator ScanReferenceDirectory() var existing = new HashSet(m_Videos.Select(x => x.AbsolutePath)); var detected = new HashSet( - Directory.GetFiles(m_CurrentVideoDirectory, "*.*", SearchOption.AllDirectories).Where(x => m_supportedVideoExtensions.Contains(Path.GetExtension(x)))); + Directory.GetFiles(m_CurrentVideoDirectory, "*.*", SearchOption.TopDirectoryOnly).Where(x => m_supportedVideoExtensions.Contains(Path.GetExtension(x)))); var toDelete = existing.Except(detected).Concat(changedSet).ToArray(); var toScan = detected.Except(existing).Concat(changedSet).ToArray(); diff --git a/Assets/Scripts/VisualizerCSCoreFFT.cs b/Assets/Scripts/VisualizerCSCoreFFT.cs index ab334c1ade..7613c82646 100644 --- a/Assets/Scripts/VisualizerCSCoreFFT.cs +++ b/Assets/Scripts/VisualizerCSCoreFFT.cs @@ -11,7 +11,7 @@ // 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. -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS using CSCore.DSP; #endif @@ -20,7 +20,7 @@ namespace TiltBrush /// Wrapper for CSCore.DSP.FftProvider public class VisualizerCSCoreFft : VisualizerManager.Fft { -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS private FftProvider m_Fft; public VisualizerCSCoreFft(int channels, int fftSize) { diff --git a/Assets/Scripts/VisualizerCSCoreFilter.cs b/Assets/Scripts/VisualizerCSCoreFilter.cs index 5c1aa1c6a2..f3daa5e253 100644 --- a/Assets/Scripts/VisualizerCSCoreFilter.cs +++ b/Assets/Scripts/VisualizerCSCoreFilter.cs @@ -11,7 +11,7 @@ // 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. -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS using CSCore.DSP; #endif @@ -20,7 +20,7 @@ namespace TiltBrush /// Wrapper for CSCore.DSP.HighpassFilter and LowpassFilter public class VisualizerCSCoreFilter : VisualizerManager.Filter { -#if !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX +#if !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS public enum FilterType { Low, diff --git a/Assets/Scripts/VisualizerManagedAnalysis.cs b/Assets/Scripts/VisualizerManagedAnalysis.cs new file mode 100644 index 0000000000..b69e396ae4 --- /dev/null +++ b/Assets/Scripts/VisualizerManagedAnalysis.cs @@ -0,0 +1,223 @@ +// Copyright 2020 The Tilt 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 System; +using UnityEngine; + +namespace TiltBrush +{ + /// Managed FFT implementation suitable for IL2CPP/AOT platforms. + public class VisualizerManagedFft : VisualizerManager.Fft + { + private readonly int m_Size; + private readonly int m_Channels; + private readonly int[] m_BitReverse; + private readonly double[] m_Real; + private readonly double[] m_Imaginary; + private readonly float[] m_Samples; + + public VisualizerManagedFft(int channels, int fftSize) + { + Debug.Assert(channels > 0); + Debug.Assert(fftSize > 0 && (fftSize & (fftSize - 1)) == 0); + + m_Size = fftSize; + m_Channels = channels; + m_BitReverse = new int[m_Size]; + m_Real = new double[m_Size]; + m_Imaginary = new double[m_Size]; + m_Samples = new float[m_Size]; + + int bits = 0; + for (int n = m_Size; n > 1; n >>= 1) + { + ++bits; + } + + for (int i = 0; i < m_Size; ++i) + { + int reversed = 0; + int value = i; + for (int bit = 0; bit < bits; ++bit) + { + reversed = (reversed << 1) | (value & 1); + value >>= 1; + } + m_BitReverse[i] = reversed; + } + } + + public override void Add(float[] samples, int count) + { + int sampleCount = Mathf.Min(count / m_Channels, m_Size); + int input = 0; + for (int i = 0; i < sampleCount; ++i) + { + m_Samples[i] = samples[input]; + input += m_Channels; + } + for (int i = sampleCount; i < m_Size; ++i) + { + m_Samples[i] = 0.0f; + } + } + + public override void GetFftData(float[] resultBuffer) + { + Debug.Assert(resultBuffer.Length >= m_Size); + + for (int i = 0; i < m_Size; ++i) + { + int source = m_BitReverse[i]; + double window = 0.5 - 0.5 * Math.Cos(2.0 * Math.PI * source / (m_Size - 1)); + m_Real[i] = m_Samples[source] * window; + m_Imaginary[i] = 0.0; + } + + for (int length = 2; length <= m_Size; length <<= 1) + { + double angle = -2.0 * Math.PI / length; + double wLengthReal = Math.Cos(angle); + double wLengthImaginary = Math.Sin(angle); + int halfLength = length >> 1; + + for (int i = 0; i < m_Size; i += length) + { + double wReal = 1.0; + double wImaginary = 0.0; + + for (int j = 0; j < halfLength; ++j) + { + int even = i + j; + int odd = even + halfLength; + double oddReal = m_Real[odd] * wReal - m_Imaginary[odd] * wImaginary; + double oddImaginary = m_Real[odd] * wImaginary + m_Imaginary[odd] * wReal; + double evenReal = m_Real[even]; + double evenImaginary = m_Imaginary[even]; + + m_Real[even] = evenReal + oddReal; + m_Imaginary[even] = evenImaginary + oddImaginary; + m_Real[odd] = evenReal - oddReal; + m_Imaginary[odd] = evenImaginary - oddImaginary; + + double nextReal = wReal * wLengthReal - wImaginary * wLengthImaginary; + wImaginary = wReal * wLengthImaginary + wImaginary * wLengthReal; + wReal = nextReal; + } + } + } + + int usefulBins = m_Size / 2; + for (int i = 0; i < usefulBins; ++i) + { + double real = m_Real[i]; + double imaginary = m_Imaginary[i]; + resultBuffer[i] = (float)(Math.Sqrt(real * real + imaginary * imaginary) / usefulBins); + } + for (int i = usefulBins; i < m_Size; ++i) + { + resultBuffer[i] = 0.0f; + } + } + } + + /// Managed biquad low/high-pass filter for platforms without CSCore. + public class VisualizerManagedFilter : VisualizerManager.Filter + { + public enum FilterType + { + Low, + High, + } + + private readonly FilterType m_Type; + private readonly int m_SampleRate; + private const double kFrequencyChangeEpsilon = 1e-6; + private double m_Frequency; + private double m_B0; + private double m_B1; + private double m_B2; + private double m_A1; + private double m_A2; + private double m_X1; + private double m_X2; + private double m_Y1; + private double m_Y2; + + public VisualizerManagedFilter(FilterType type, int sampleRate, double frequency) + { + m_Type = type; + m_SampleRate = Mathf.Max(2, sampleRate); + Frequency = frequency; + } + + public override void Process(float[] samples) + { + for (int i = 0; i < samples.Length; ++i) + { + double input = samples[i]; + double output = m_B0 * input + m_B1 * m_X1 + m_B2 * m_X2 + - m_A1 * m_Y1 - m_A2 * m_Y2; + m_X2 = m_X1; + m_X1 = input; + m_Y2 = m_Y1; + m_Y1 = output; + samples[i] = (float)output; + } + } + + public override double Frequency + { + get { return m_Frequency; } + set + { + double nyquist = m_SampleRate * 0.5; + double clampedFrequency = Math.Max(1.0, Math.Min(value, Math.Max(1.0, nyquist - 1.0))); + if (Math.Abs(clampedFrequency - m_Frequency) <= kFrequencyChangeEpsilon) + { + return; + } + + m_Frequency = clampedFrequency; + UpdateCoefficients(); + } + } + + private void UpdateCoefficients() + { + const double q = 0.7071067811865476; + double omega = 2.0 * Math.PI * m_Frequency / m_SampleRate; + double sin = Math.Sin(omega); + double cos = Math.Cos(omega); + double alpha = sin / (2.0 * q); + double a0 = 1.0 + alpha; + + if (m_Type == FilterType.Low) + { + m_B0 = (1.0 - cos) * 0.5 / a0; + m_B1 = (1.0 - cos) / a0; + m_B2 = m_B0; + } + else + { + m_B0 = (1.0 + cos) * 0.5 / a0; + m_B1 = -(1.0 + cos) / a0; + m_B2 = m_B0; + } + + m_A1 = -2.0 * cos / a0; + m_A2 = (1.0 - alpha) / a0; + } + } +} diff --git a/Assets/Scripts/VisualizerManagedAnalysis.cs.meta b/Assets/Scripts/VisualizerManagedAnalysis.cs.meta new file mode 100644 index 0000000000..1b82577810 --- /dev/null +++ b/Assets/Scripts/VisualizerManagedAnalysis.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2f2c85eb93c74799aac25eb463095d71 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/VisualizerManager.cs b/Assets/Scripts/VisualizerManager.cs index b47854b689..2d4127f983 100644 --- a/Assets/Scripts/VisualizerManager.cs +++ b/Assets/Scripts/VisualizerManager.cs @@ -142,10 +142,12 @@ void Awake() m_VisualizerObjects = new List(); Shader.DisableKeyword("AUDIO_REACTIVE"); // Two channels, 512 values. -#if DISABLE_AUDIO_CAPTURE || UNITY_OSX || UNITY_EDITOR_OSX - m_FFT = new Fft(); -#else +#if DISABLE_AUDIO_ANALYSIS + m_FFT = new Fft(); +#elif !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS m_FFT = new VisualizerCSCoreFft(1, 512); +#else + m_FFT = new VisualizerManagedFft(1, 512); #endif m_FFTResult = new float[m_FFTSize]; m_PeakFFTResult = new float[m_FFTSize]; @@ -301,14 +303,19 @@ void ActivateVisuals(bool bEnable) public void SetSampleRate(int sampleRate) { m_SampleRate = sampleRate; -#if DISABLE_AUDIO_CAPTURE || UNITY_OSX || UNITY_EDITOR_OSX - m_LowPassFilter = new Filter(); - m_HighPassFilter = new Filter(); -#else +#if DISABLE_AUDIO_ANALYSIS + m_LowPassFilter = new Filter(); + m_HighPassFilter = new Filter(); +#elif !DISABLE_SYSTEM_AUDIO_CAPTURE && !DISABLE_AUDIO_CAPTURE && !UNITY_OSX && !UNITY_EDITOR_OSX && !UNITY_ANDROID && !UNITY_IOS m_LowPassFilter = new VisualizerCSCoreFilter(VisualizerCSCoreFilter.FilterType.Low, m_SampleRate, m_LowPassFreq); m_HighPassFilter = new VisualizerCSCoreFilter(VisualizerCSCoreFilter.FilterType.High, m_SampleRate, m_HighPassFreq); +#else + m_LowPassFilter = new VisualizerManagedFilter(VisualizerManagedFilter.FilterType.Low, + m_SampleRate, m_LowPassFreq); + m_HighPassFilter = new VisualizerManagedFilter(VisualizerManagedFilter.FilterType.High, + m_SampleRate, m_HighPassFreq); #endif } @@ -383,23 +390,13 @@ public void ProcessAudio(float[] AudioData, int SampleRate) } if (m_SystemAudioInjectorLowPass) { - m_SystemAudioInjectorLowPass.ProcessAudio(m_AudioSamples); + m_SystemAudioInjectorLowPass.ProcessAudio(m_LChannelLowPass); } if (m_SystemAudioInjectorHighPass) { - m_SystemAudioInjectorHighPass.ProcessAudio(m_AudioSamples); + m_SystemAudioInjectorHighPass.ProcessAudio(m_LChannelHighPass); } - // - // Update Shaders - // - Shader.SetGlobalTexture("_WaveFormTex", m_WaveFormTexture); - Shader.SetGlobalVector("_PeakBandLevels", m_BandPeakLevelsOutput); - Shader.SetGlobalTexture("_FFTTex", m_FFTTexture); - Shader.SetGlobalVector("_BeatOutput", m_BeatOutput); - Shader.SetGlobalVector("_BeatOutputAccum", m_BeatOutputAccum); - Shader.SetGlobalVector("_AudioVolume", m_AudioVolume); - m_BandPeakLevelsOutput = new Vector4(m_BandPeakLevels[0], m_BandPeakLevels[1], m_BandPeakLevels[2], m_BandPeakLevels[3]); m_WaveFormTexture.SetPixels(0, 0, m_FFTSize, 1, m_WaveFormRow); @@ -419,8 +416,18 @@ public void ProcessAudio(float[] AudioData, int SampleRate) float val3 = (60.0f + m_ReaktorLowPass.outputDb) / 60.0f; val3 = Mathf.Clamp(val3, 0.0f, 1.0f); float val4 = (60.0f + m_ReaktorHighPass.outputDb) / 60.0f; - val4 = Mathf.Clamp(val3, 0.0f, 1.0f); + val4 = Mathf.Clamp(val4, 0.0f, 1.0f); m_AudioVolume = new Vector4(val1, val2, val3, val4); + + // + // Update Shaders + // + Shader.SetGlobalTexture("_WaveFormTex", m_WaveFormTexture); + Shader.SetGlobalVector("_PeakBandLevels", m_BandPeakLevelsOutput); + Shader.SetGlobalTexture("_FFTTex", m_FFTTexture); + Shader.SetGlobalVector("_BeatOutput", m_BeatOutput); + Shader.SetGlobalVector("_BeatOutputAccum", m_BeatOutputAccum); + Shader.SetGlobalVector("_AudioVolume", m_AudioVolume); } int FrequencyToSpectrumIndex(float f) @@ -431,23 +438,23 @@ int FrequencyToSpectrumIndex(float f) private void ConvertRawSpectrumToBandLevels() { - for (var i = 0; i < m_Bands.Length; i++) + for (var bi = 0; bi < m_BandLevels.Length; bi++) { - for (var bi = 0; bi < m_BandLevels.Length; bi++) - { - int imin = FrequencyToSpectrumIndex(m_Bands[bi] / m_Bandwidth); - int imax = FrequencyToSpectrumIndex(m_Bands[bi] * m_Bandwidth); - - var bandMax = 0.0f; - for (var fi = imin; fi <= imax; fi++) - { - bandMax = Mathf.Max(bandMax, m_FFTResult[fi]); - } + int imin = FrequencyToSpectrumIndex(m_Bands[bi] / m_Bandwidth); + int imax = FrequencyToSpectrumIndex(m_Bands[bi] * m_Bandwidth); - m_BandLevels[bi] = bandMax; - m_BandPeakLevels[bi] = Mathf.Max(m_BandPeakLevels[bi] * m_BandPeakDecay, bandMax); - m_BandNormalizedLevels[bi] = Mathf.Lerp(m_BandLevels[bi] / m_BandPeakLevels[bi], m_BandNormalizedLevels[bi], m_NormalizedBandPeakLerp); + var bandMax = 0.0f; + for (var fi = imin; fi <= imax; fi++) + { + bandMax = Mathf.Max(bandMax, m_FFTResult[fi]); } + + m_BandLevels[bi] = bandMax; + m_BandPeakLevels[bi] = Mathf.Max(m_BandPeakLevels[bi] * m_BandPeakDecay, bandMax); + float normalizedLevel = m_BandPeakLevels[bi] > 0.00001f + ? m_BandLevels[bi] / m_BandPeakLevels[bi] + : 0.0f; + m_BandNormalizedLevels[bi] = Mathf.Lerp(normalizedLevel, m_BandNormalizedLevels[bi], m_NormalizedBandPeakLerp); } } diff --git a/Assets/Scripts/WidgetManager.cs b/Assets/Scripts/WidgetManager.cs index efdb4bc134..4e9d10a8ed 100644 --- a/Assets/Scripts/WidgetManager.cs +++ b/Assets/Scripts/WidgetManager.cs @@ -107,6 +107,7 @@ public class WidgetManager : MonoBehaviour [SerializeField] ImageWidget m_ImageWidgetPrefab; [SerializeField] VideoWidget m_VideoWidgetPrefab; [SerializeField] TextWidget m_TextWidgetPrefab; + [SerializeField] SoundClipWidget m_SoundClipWidgetPrefab; [SerializeField] LightWidget m_LightWidgetPrefab; [SerializeField] SceneLightGizmo m_SceneLightGizmoPrefab; [SerializeField] CameraPathWidget m_CameraPathWidgetPrefab; @@ -150,6 +151,7 @@ public class WidgetManager : MonoBehaviour private List> m_ImageWidgets; private List> m_TextWidgets; private List> m_VideoWidgets; + private List> m_SoundClipWidgets; private List> m_CameraPathWidgets; // These lists are used by the PinTool. They're kept in sync by the @@ -162,6 +164,7 @@ public class WidgetManager : MonoBehaviour private TiltLights[] m_loadingTiltLights; private TiltImages75[] m_loadingTiltImages75; private TiltVideo[] m_loadingTiltVideos; + private TiltSoundClip[] m_loadingTiltSoundClips; private List m_WidgetsNearBrush; private List m_WidgetsNearWand; @@ -271,6 +274,8 @@ public int WidgetsVertCount public bool AnyVideoWidgetActive => m_VideoWidgets.Any(x => x.m_WidgetObject.activeSelf); + public bool AnySoundClipWidgetActive => m_SoundClipWidgets.Any(x => x.m_WidgetObject.activeSelf); + public bool AnyCameraPathWidgetsActive => m_CameraPathWidgets.Any(x => x.m_WidgetObject.activeSelf); @@ -309,6 +314,7 @@ public void Init() m_ImageWidgets = new List>(); m_TextWidgets = new List>(); m_VideoWidgets = new List>(); + m_SoundClipWidgets = new List>(); m_CameraPathWidgets = new List>(); m_CanBePinnedWidgets = new List(); @@ -336,6 +342,7 @@ public void Init() public ImageWidget ImageWidgetPrefab { get { return m_ImageWidgetPrefab; } } public VideoWidget VideoWidgetPrefab { get { return m_VideoWidgetPrefab; } } public TextWidget TextWidgetPrefab { get { return m_TextWidgetPrefab; } } + public SoundClipWidget SoundClipWidgetPrefab { get { return m_SoundClipWidgetPrefab; } } public LightWidget LightWidgetPrefab { get { return m_LightWidgetPrefab; } } public SceneLightGizmo SceneLightGizmoPrefab { get { return m_SceneLightGizmoPrefab; } } public CameraPathWidget CameraPathWidgetPrefab { get { return m_CameraPathWidgetPrefab; } } @@ -414,6 +421,13 @@ private IEnumerable GetAllActiveGrabWidgets() yield return m_VideoWidgets[i]; } } + for (int i = 0; i < m_SoundClipWidgets.Count; ++i) + { + if (m_SoundClipWidgets[i].m_WidgetObject.activeSelf) + { + yield return m_SoundClipWidgets[i]; + } + } for (int i = 0; i < m_CameraPathWidgets.Count; ++i) { if (m_CameraPathWidgets[i].m_WidgetObject.activeInHierarchy) @@ -428,10 +442,10 @@ public IEnumerable MediaWidgets get { IEnumerable ret = m_ModelWidgets; - return ret - .Concat(m_ImageWidgets) + return ret.Concat(m_ImageWidgets) .Concat(m_VideoWidgets) .Concat(m_TextWidgets) + .Concat(m_SoundClipWidgets) .Concat(m_LightWidgets); } } @@ -619,6 +633,7 @@ public bool HasSelectableWidgets() m_ImageWidgets.Count > 0 || m_TextWidgets.Count > 0 || m_VideoWidgets.Count > 0 || + m_SoundClipWidgets.Count > 0 || (m_LightWidgets.Count > 0) || (!m_StencilsDisabled && m_StencilWidgets.Count > 0); } @@ -793,6 +808,14 @@ public void SetTextDataFromTilt(TiltText[] tiltText) } + public void SetSoundDataFromTilt(TiltSoundClip[] tiltSoundClip) + { + for (int i = 0; i < tiltSoundClip.Length; ++i) + { + SoundClipWidget.FromTiltSoundClip(tiltSoundClip[i]); + } + } + public void SetVideoDataFromTilt(TiltVideo[] value) { m_loadingTiltVideos = value; @@ -1071,6 +1094,16 @@ public IEnumerable TextWidgets } } + public IEnumerable SoundClipWidgets + { + get + { + return m_SoundClipWidgets + .Select(w => w == null ? null : w.WidgetScript) + .Where(w => w != null); + } + } + public IEnumerable NonExportableModelWidgets { get @@ -1133,6 +1166,7 @@ public List GetAllUnselectedActiveWidgets(CanvasScript canvas) GetUnselectedActiveWidgetsInList(m_ImageWidgets); GetUnselectedActiveWidgetsInList(m_TextWidgets); GetUnselectedActiveWidgetsInList(m_VideoWidgets); + GetUnselectedActiveWidgetsInList(m_SoundClipWidgets); if (!m_StencilsDisabled) { GetUnselectedActiveWidgetsInList(m_StencilWidgets); @@ -1165,6 +1199,7 @@ public void RefreshPinAndUnpinLists() RefreshPinUnpinWidgetList(m_ImageWidgets); RefreshPinUnpinWidgetList(m_TextWidgets); RefreshPinUnpinWidgetList(m_VideoWidgets); + RefreshPinUnpinWidgetList(m_SoundClipWidgets); RefreshPinUnpinWidgetList(m_StencilWidgets); RefreshPinAndUnpinAction(); @@ -1250,6 +1285,10 @@ public void RegisterGrabWidget(GameObject rWidget) { m_VideoWidgets.Add(new TypedWidgetData(video)); } + else if (generic is SoundClipWidget soundClip) + { + m_SoundClipWidgets.Add(new TypedWidgetData(soundClip)); + } else if (generic is CameraPathWidget cpw) { m_CameraPathWidgets.Add(new TypedWidgetData(cpw)); @@ -1302,6 +1341,7 @@ public void UnregisterGrabWidget(GameObject rWidget) if (RemoveFrom(m_ImageWidgets, rWidget)) { return; } if (RemoveFrom(m_TextWidgets, rWidget)) { return; } if (RemoveFrom(m_VideoWidgets, rWidget)) { return; } + if (RemoveFrom(m_SoundClipWidgets, rWidget)) { return; } if (RemoveFrom(m_CameraPathWidgets, rWidget)) { return; } RemoveFrom(m_GrabWidgets, rWidget); } @@ -1478,6 +1518,7 @@ public void DestroyAllWidgets() DestroyWidgetList(m_ImageWidgets); DestroyWidgetList(m_TextWidgets); DestroyWidgetList(m_VideoWidgets); + DestroyWidgetList(m_SoundClipWidgets); DestroyWidgetList(m_StencilWidgets); DestroyWidgetList(m_CameraPathWidgets, false); SetCurrentCameraPath_Internal(null); @@ -1667,6 +1708,8 @@ public void TossNearestWidget() m_ModelWidgets.Where(w => w.WidgetScript.gameObject.activeSelf).ToList(); public List> ActiveVideoWidgets => m_VideoWidgets.Where(w => w.WidgetScript.gameObject.activeSelf).ToList(); + public List> ActiveSoundClipWidgets => + m_SoundClipWidgets.Where(w => w.WidgetScript.gameObject.activeSelf).ToList(); public List> ActiveCameraPathWidgets => m_CameraPathWidgets.Where(w => w.WidgetScript.gameObject.activeSelf).ToList(); public List> ActiveStencilWidgets => diff --git a/Assets/Scripts/Widgets/ModelWidget.cs b/Assets/Scripts/Widgets/ModelWidget.cs index 251281a717..939615af89 100644 --- a/Assets/Scripts/Widgets/ModelWidget.cs +++ b/Assets/Scripts/Widgets/ModelWidget.cs @@ -289,8 +289,8 @@ void LoadModel() } m_ModelInstance = Instantiate(m_Model.m_ModelParent); - m_ModelInstance.gameObject.SetActive(true); m_ModelInstance.parent = this.transform; + m_ModelInstance.gameObject.SetActive(true); Coords.AsLocal[m_ModelInstance] = TrTransform.identity; float maxExtent = 2 * Mathf.Max(m_Model.m_MeshBounds.extents.x, diff --git a/Assets/Scripts/Widgets/QuillSoundLayerParams.md b/Assets/Scripts/Widgets/QuillSoundLayerParams.md new file mode 100644 index 0000000000..d2d8fad849 --- /dev/null +++ b/Assets/Scripts/Widgets/QuillSoundLayerParams.md @@ -0,0 +1,36 @@ +# Quill Sound Layer Parameters + +Parameters available on `SharpQuill.LayerSound` and their mapping status in Open Brush. + +## Mapped + +| Parameter | Type | Maps To | Notes | +|---|---|---|---| +| Gain | float | `SoundClipController.Volume` | Applied in `CreateSoundWidgetFromQuillLayer` | +| ImportFilePath | string | Audio file load path | External file reference | +| Data.AudioBytes | byte[] | Extracted to disk, then loaded | Embedded audio from qbin | + +## Not Yet Mapped + +| Parameter | Type | Unity Equivalent | Notes | +|---|---|---|---| +| Loop | bool | `AudioSource.loop` | Currently hardcoded `true` in `PrepareAudioPlayer`. Comment in Quill.cs acknowledges this. | +| SoundType | enum (Flat) | `AudioSource.spatialBlend` | Flat = 0 (2D), spatial = 1 (3D). Only "Flat" exists in Quill currently. | +| Attenuation.Mode | enum (None) | `AudioSource.rolloffMode` | Only "None" exists in Quill currently. | +| Attenuation.Minimum | float | `AudioSource.minDistance` | Inner radius, full volume. | +| Attenuation.Maximum | float | `AudioSource.maxDistance` | Outer radius, silence. | +| Modifiers | List\ | — | Only "None" type exists, nothing actionable yet. | + +## Implementation Priority + +1. **Loop** — straightforward, directly maps to `AudioSource.loop` +2. **SoundType / spatialBlend** — Flat vs 3D. Flat is the only Quill value today but supporting spatial audio unlocks positional sound in VR scenes. +3. **Attenuation (min/max distance)** — only meaningful when spatial audio is enabled. Maps directly to `AudioSource.minDistance` / `maxDistance`. +4. **Modifiers** — skip until Quill defines modifier types beyond "None". + +## Relevant Files + +- `Assets/Scripts/Quill.cs` — `CreateSoundWidgetFromQuillLayer()` (line ~718) +- `Assets/Scripts/SoundClip.cs` — `PrepareAudioPlayer()`, `SoundClipController` +- `Assets/Scripts/Widgets/SoundClipWidget.cs` — widget lifecycle +- `Assets/Scripts/Save/SketchMetadata.cs` — `TiltSoundClip` (save/load, line ~723) diff --git a/Assets/Scripts/Widgets/QuillSoundLayerParams.md.meta b/Assets/Scripts/Widgets/QuillSoundLayerParams.md.meta new file mode 100644 index 0000000000..cf68942a67 --- /dev/null +++ b/Assets/Scripts/Widgets/QuillSoundLayerParams.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e3d417cbd5cc513499fcbe210d259fb6 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Widgets/SelectionWidget.cs b/Assets/Scripts/Widgets/SelectionWidget.cs index 909f28a95a..1b8f93561e 100644 --- a/Assets/Scripts/Widgets/SelectionWidget.cs +++ b/Assets/Scripts/Widgets/SelectionWidget.cs @@ -262,14 +262,28 @@ private void UpdateBoxCollider() Vector3 inflatedExtents_CS = m_SelectionBounds_CS.Value.extents; inflatedExtents_CS += Vector3.one * (m_CollisionRadius / m_SelectionCanvas.Pose.scale); - // Position our widget within global space as if it's in canvas space - // so that we can correctly set non-uniform scale. Even though we - // override the non-uniform scale at the very end, we also do it here - // because, even though TrTransform only considers uniform scale, it - // gets its uniform scale from the longest extent on any non-uniform scale. - transform.localPosition = m_SelectionBounds_CS.Value.center; + // Compute the bounds center in scene space using the same TrTransform + // math that AsScene uses, avoiding any mismatch between Unity's global + // transform path and TrTransform's local-chain path. + TrTransform canvasPose_SS = App.Scene.AsScene[m_SelectionCanvas.transform]; + Vector3 boundsCenter_SS = + (canvasPose_SS * TrTransform.T(m_SelectionBounds_CS.Value.center)).translation; + + // Use the AsScene setter to position the widget at the bounds center. + // This guarantees the read path (AsScene getter) will return exactly + // what we set, unlike mixing InverseTransformPoint with AsScene. + App.Scene.AsScene[transform] = TrTransform.TRS( + boundsCenter_SS, Quaternion.identity, inflatedExtents_CS.x); + + // Override localScale with the non-uniform extents. The .x component + // stays the same as what the setter wrote, preserving consistency. transform.localScale = inflatedExtents_CS; - transform.localRotation = Quaternion.identity; + + // Scale the box collider to compensate for the canvas-to-parent scale + // difference so the collider covers the actual world-space bounds. + float canvasToParentScale = m_SelectionCanvas.transform.GetUniformScale() + / transform.parent.GetUniformScale(); + m_BoxCollider.size = Vector3.one * canvasToParentScale; // Capture the scene-space transformation for the selected bounds // without considering how the user transformed the selection since @@ -284,6 +298,10 @@ private void UpdateBoxCollider() // Since TrTransform doesn't account for non-uniform scale, correct the // scale for the non-uniform bounds. transform.localScale = inflatedExtents_CS * UserTransformations_SS.scale; + + // DIAG v2: verify SelectionTransform is identity after UpdateBoxCollider + var readback = App.Scene.AsScene[transform]; + var selXf = SelectionTransform; } public void PreventSelectionFromMoving(bool preventMoving) @@ -294,6 +312,8 @@ public void PreventSelectionFromMoving(bool preventMoving) override protected void OnUserBeginInteracting() { + var readback = App.Scene.AsScene[transform]; + var selXf = SelectionTransform; base.OnUserBeginInteracting(); // Use pin visuals for preventing movement. diff --git a/Assets/Scripts/Widgets/SoundClipWidget.cs b/Assets/Scripts/Widgets/SoundClipWidget.cs new file mode 100644 index 0000000000..1f650161b9 --- /dev/null +++ b/Assets/Scripts/Widgets/SoundClipWidget.cs @@ -0,0 +1,450 @@ +// Copyright 2020 The Tilt 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 System.Collections.Generic; +using System.IO; +using UnityEngine; + +namespace TiltBrush +{ + public class SoundClipWidget : Media2dWidget + { + // AudioState is used to restore the state of a sound clip when loading, or when a SoundClipWidget is + // restored from being tossed with an undo. + private class SoundClipState + { + public bool Paused; + public float Volume; + public float? Time; + public bool Loop = true; + public float SpatialBlend; + public float MinDistance = 1f; + public float MaxDistance = 500f; + } + + [SerializeField] private float m_ConstantWorldSize = 0.5f; + [SerializeField] private Color m_MinDistanceColor = new Color(0f, 1f, 0.8f, 0.08f); + [SerializeField] private Color m_MaxDistanceColor = new Color(1f, 0.6f, 0f, 0.05f); + + private SoundClip m_SoundClip; + private SoundClipState m_InitialState; + private GameObject m_MinDistanceSphere; + private GameObject m_MaxDistanceSphere; + + public SoundClip SoundClip + { + get { return m_SoundClip; } + } + + public override float? AspectRatio => 1.0f; + + public TrTransform SaveTransform + { + get + { + TrTransform xf = TrTransform.FromLocalTransform(transform); + xf.scale = GetSignedWidgetSize(); + return xf; + } + } + + public SoundClip.SoundClipController SoundClipController { get; private set; } + + /// Set audio properties that will be applied once the controller is initialized. + /// Call after SetSoundClip. + public void SetAudioProperties(float volume, bool loop = true, + float spatialBlend = 0f, float minDistance = 1f, float maxDistance = 500f) + { + m_InitialState = new SoundClipState + { + Volume = volume, + Loop = loop, + SpatialBlend = spatialBlend, + MinDistance = minDistance, + MaxDistance = maxDistance, + }; + } + + public void SetSoundClip(SoundClip soundClip) + { + m_SoundClip = soundClip; + m_Size = m_ConstantWorldSize; + + // Create in the main canvas. + HierarchyUtils.RecursivelySetLayer(transform, App.Scene.MainCanvas.gameObject.layer); + HierarchyUtils.RecursivelySetMaterialBatchID(transform, m_BatchId); + + Play(); + } + + protected override void OnShow() + { + base.OnShow(); + Play(); + } + + public override void RestoreFromToss() + { + base.RestoreFromToss(); + Play(); + } + + protected override void OnHide() + { + base.OnHide(); + // store off the sound clip state so that if the widget gets shown again it will reset to that. + if (SoundClipController != null) + { + m_InitialState = new SoundClipState + { + Paused = !SoundClipController.Playing, + Time = SoundClipController.Time, + Volume = SoundClipController.Volume, + Loop = SoundClipController.Loop, + SpatialBlend = SoundClipController.SpatialBlend, + MinDistance = SoundClipController.MinDistance, + MaxDistance = SoundClipController.MaxDistance, + }; + SoundClipController.Dispose(); + SoundClipController = null; + } + } + + protected override void OnDestroy() + { + base.OnDestroy(); + SoundClipController?.Dispose(); + SoundClipController = null; + if (m_MinDistanceSphere != null) Destroy(m_MinDistanceSphere); + if (m_MaxDistanceSphere != null) Destroy(m_MaxDistanceSphere); + } + + private void Play() + { + if (m_SoundClip == null || SoundClipController != null) + { + return; + } + if (SoundClipController == null) + { + SoundClipController = m_SoundClip.CreateController(this); + + //SoundClipController.m_SoundClipAudioSource.Play(); + SoundClipController.OnSoundClipInitialized += OnSoundClipInitialized; + } + else + { + // If instances of the sound clip already exist, don't override with new state. + m_InitialState = null; + } + } + + private void OnSoundClipInitialized() + { + UpdateScale(); + if (m_InitialState != null) + { + SoundClipController.Volume = m_InitialState.Volume; + SoundClipController.Loop = m_InitialState.Loop; + SoundClipController.SpatialBlend = m_InitialState.SpatialBlend; + SoundClipController.MinDistance = m_InitialState.MinDistance; + SoundClipController.MaxDistance = m_InitialState.MaxDistance; + if (m_InitialState.Time.HasValue) + { + SoundClipController.Time = m_InitialState.Time.Value; + } + if (m_InitialState.Paused) + { + SoundClipController.Playing = false; + } + m_InitialState = null; + } + UpdateDistanceVisualization(); + } + + public static List FromModelWidget(ModelWidget modelWidget) + { + var go = modelWidget.gameObject; + string baseName = go.name.Replace("ModelWidget", "SoundClipWidget"); + var soundClipWidgets = new List(); + var layer = go.layer; + + foreach (var gltfAudio in go.GetComponentsInChildren()) + { + var soundClip = new SoundClip(gltfAudio.AbsoluteFilePath); + var widget = Object.Instantiate(WidgetManager.m_Instance.SoundClipWidgetPrefab); + widget.LoadingFromSketch = true; + widget.transform.parent = App.Instance.m_CanvasTransform; + widget.transform.localScale = Vector3.one; + widget.SetAudioProperties(gltfAudio.Gain, gltfAudio.Loop, gltfAudio.SpatialBlend, + gltfAudio.MinDistance, gltfAudio.MaxDistance); + widget.SetSoundClip(soundClip); + widget.Show(bShow: true, bPlayAudio: false); + widget.transform.position = gltfAudio.transform.position; + widget.transform.rotation = gltfAudio.transform.rotation; + widget.SetCanvas(App.Scene.MainCanvas); + TiltMeterScript.m_Instance.AdjustMeterWithWidget(widget.GetTiltMeterCost(), up: true); + HierarchyUtils.RecursivelySetLayer(widget.transform, layer); + widget.name = baseName; + WidgetManager.m_Instance.RegisterGrabWidget(widget.gameObject); + soundClipWidgets.Add(widget); + } + + modelWidget.Hide(); + WidgetManager.m_Instance.UnregisterGrabWidget(modelWidget.gameObject); + Destroy(modelWidget.gameObject); + return soundClipWidgets; + } + + public static void FromTiltSoundClip(TiltSoundClip tiltSoundClip) + { + SoundClipWidget soundClipWidget = Instantiate(WidgetManager.m_Instance.SoundClipWidgetPrefab); + soundClipWidget.m_LoadingFromSketch = true; + soundClipWidget.transform.parent = App.Instance.m_CanvasTransform; + soundClipWidget.transform.localScale = Vector3.one; + + var soundClip = SoundClipCatalog.Instance.GetSoundClipByPersistentPath(tiltSoundClip.FilePath); + if (soundClip == null) + { + soundClip = SoundClip.CreateDummySoundClip(); + ControllerConsoleScript.m_Instance.AddNewLine( + $"Could not find sound clip {App.SoundClipLibraryPath()}\\{tiltSoundClip.FilePath}."); + } + soundClipWidget.SetSoundClip(soundClip); + soundClipWidget.m_InitialState = new SoundClipState + { + Volume = tiltSoundClip.Volume, + Paused = tiltSoundClip.Paused, + Loop = tiltSoundClip.Loop, + SpatialBlend = tiltSoundClip.SpatialBlend, + MinDistance = tiltSoundClip.MinDistance, + MaxDistance = tiltSoundClip.MaxDistance, + }; + if (tiltSoundClip.Paused) + { + soundClipWidget.m_InitialState.Time = tiltSoundClip.Time; + } + soundClipWidget.SetSignedWidgetSize(tiltSoundClip.Transform.scale); + soundClipWidget.Show(bShow: true, bPlayAudio: false); + soundClipWidget.transform.localPosition = tiltSoundClip.Transform.translation; + soundClipWidget.transform.localRotation = tiltSoundClip.Transform.rotation; + if (tiltSoundClip.Pinned) + { + soundClipWidget.PinFromSave(); + } + soundClipWidget.Group = App.GroupManager.GetGroupFromId(tiltSoundClip.GroupId); + soundClipWidget.SetCanvas(App.Scene.GetOrCreateLayer(tiltSoundClip.LayerId)); + TiltMeterScript.m_Instance.AdjustMeterWithWidget(soundClipWidget.GetTiltMeterCost(), up: true); + soundClipWidget.UpdateScale(); + } + + override public GrabWidget Clone() + { + return Clone(transform.position, transform.rotation, m_Size); + } + + public override GrabWidget Clone(Vector3 position, Quaternion rotation, float size) + { + SoundClipWidget clone = Instantiate(WidgetManager.m_Instance.SoundClipWidgetPrefab) as SoundClipWidget; + clone.m_PreviousCanvas = m_PreviousCanvas; + clone.m_LoadingFromSketch = true; // prevents intro animation + clone.transform.parent = transform.parent; + clone.SetSoundClip(m_SoundClip); + clone.SetSignedWidgetSize(size); + clone.Show(bShow: true, bPlayAudio: false); + clone.transform.position = position; + clone.transform.rotation = rotation; + HierarchyUtils.RecursivelySetLayer(clone.transform, gameObject.layer); + TiltMeterScript.m_Instance.AdjustMeterWithWidget(clone.GetTiltMeterCost(), up: true); + clone.CloneInitialMaterials(this); + clone.TrySetCanvasKeywordsFromObject(transform); + return clone; + } + + public override void Activate(bool bActive) + { + base.Activate(bActive); + if (bActive) + { + App.Switchboard.TriggerSoundClipWidgetActivated(this); + UpdateDistanceVisualization(); + } + else + { + SetDistanceSpheresVisible(false); + } + } + + private GameObject CreateDistanceSphere(Color color, string name) + { + var go = GameObject.CreatePrimitive(PrimitiveType.Sphere); + go.name = name; + go.transform.SetParent(transform, false); + go.transform.localPosition = Vector3.zero; + + // Remove the collider — this is visualization only + var col = go.GetComponent(); + if (col != null) Object.Destroy(col); + + var renderer = go.GetComponent(); + var mat = new Material(Shader.Find("Unlit/Color")); + mat.color = color; + + // Set up transparency + mat.SetFloat("_Mode", 3); // transparent + mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); + mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + mat.SetInt("_ZWrite", 0); + mat.renderQueue = 3000; + mat.EnableKeyword("_ALPHABLEND_ON"); + renderer.material = mat; + renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; + renderer.receiveShadows = false; + + go.SetActive(false); + return go; + } + + private void EnsureDistanceSpheres() + { + if (m_MinDistanceSphere == null) + { + m_MinDistanceSphere = CreateDistanceSphere(m_MinDistanceColor, "MinDistanceSphere"); + } + if (m_MaxDistanceSphere == null) + { + m_MaxDistanceSphere = CreateDistanceSphere(m_MaxDistanceColor, "MaxDistanceSphere"); + } + } + + private void SetDistanceSpheresVisible(bool visible) + { + if (m_MinDistanceSphere != null) m_MinDistanceSphere.SetActive(visible); + if (m_MaxDistanceSphere != null) m_MaxDistanceSphere.SetActive(visible); + } + + public void UpdateDistanceVisualization() + { + if (SoundClipController == null || SoundClipController.SpatialBlend <= 0f) + { + SetDistanceSpheresVisible(false); + return; + } + + EnsureDistanceSpheres(); + + // Distances are authored in scene/canvas space. + // The sphere primitive has diameter 1, so local scale = 2 * distance. + // Divide by the widget's local scale so that the parent (canvas) transform + // provides the scene-space-to-world-space conversion naturally. + float widgetLocalScale = Mathf.Max(transform.localScale.x, 0.001f); + float minDiameter = 2f * SoundClipController.MinDistance / widgetLocalScale; + float maxDiameter = 2f * SoundClipController.MaxDistance / widgetLocalScale; + + m_MinDistanceSphere.transform.localScale = Vector3.one * minDiameter; + m_MaxDistanceSphere.transform.localScale = Vector3.one * maxDiameter; + + m_MinDistanceSphere.SetActive(true); + m_MaxDistanceSphere.SetActive(true); + } + + protected override void UpdateScale() + { + // Maintain constant world-space size regardless of canvas/scene scale. + float parentScale = transform.parent != null ? transform.parent.lossyScale.x : 1f; + transform.localScale = Vector3.one * m_ConstantWorldSize / Mathf.Max(parentScale, 0.001f); + + // Update AudioSource distances: authored values * scene scale = world distances + if (SoundClipController != null) + { + SoundClipController.ApplyDistanceScale(parentScale); + } + } + + public override Vector2 GetWidgetSizeRange() + { + // Return identical min/max to prevent manual scaling. + float absSize = Mathf.Max(Mathf.Abs(m_Size), 0.001f); + return new Vector2(absSize, absSize); + } + + protected override void SetWidgetSizeInternal(float fScale) + { + // Skip Media2dWidget's version which resets transform.localScale to Vector3.one. + // Only store m_Size for save/load; visual size is controlled by m_ConstantWorldSize. + var sizeRange = GetWidgetSizeRange(); + m_Size = Mathf.Sign(fScale) * Mathf.Clamp(Mathf.Abs(fScale), sizeRange.x, sizeRange.y); + UpdateScale(); + } + + public override float GetActivationScore( + Vector3 vControllerPos, InputManager.ControllerName name) + { + // Media2dWidget's version applies a size-based penalty that always returns 0 + // for fixed-size widgets (size == max). Replicate GrabWidget's distance-based + // scoring directly, plus the ungrabbable-from-inside check. + if (m_BoxCollider == null) return -1f; + + if (m_UngrabbableFromInside) + { + if (PointInCollider(ViewpointScript.Head.position) && + PointInCollider(InputManager.m_Instance.GetBrushControllerAttachPoint().position) && + PointInCollider(InputManager.m_Instance.GetWandControllerAttachPoint().position)) + { + return -1f; + } + } + + Vector3 vInvTransformedPos = transform.InverseTransformPoint(vControllerPos); + Vector3 vSize = m_BoxCollider.size * 0.5f; + vSize.x *= m_BoxCollider.transform.localScale.x; + vSize.y *= m_BoxCollider.transform.localScale.y; + vSize.z *= m_BoxCollider.transform.localScale.z; + float xDiff = vSize.x - Mathf.Abs(vInvTransformedPos.x); + float yDiff = vSize.y - Mathf.Abs(vInvTransformedPos.y); + float zDiff = vSize.z - Mathf.Abs(vInvTransformedPos.z); + if (xDiff > 0.0f && yDiff > 0.0f && zDiff > 0.0f) + { + return ((xDiff / vSize.x) * 0.333f) + + ((yDiff / vSize.y) * 0.333f) + + ((zDiff / vSize.z) * 0.333f); + } + return -1.0f; + } + + public override string GetExportName() + { + return Path.GetFileNameWithoutExtension(m_SoundClip.AbsolutePath); + } + + /// Returns audio settings for GLTF export, reading from the controller when initialized + /// and falling back to m_InitialState or defaults otherwise. + public (float volume, bool loop, float spatialBlend, float minDistance, float maxDistance) GetAudioExportSettings() + { + if (SoundClipController != null && SoundClipController.Initialized) + { + return (SoundClipController.Volume, SoundClipController.Loop, + SoundClipController.SpatialBlend, SoundClipController.MinDistance, + SoundClipController.MaxDistance); + } + if (m_InitialState != null) + { + return (m_InitialState.Volume, m_InitialState.Loop, + m_InitialState.SpatialBlend, m_InitialState.MinDistance, + m_InitialState.MaxDistance); + } + return (1f, true, 0f, 1f, 500f); + } + } +} // namespace TiltBrush diff --git a/Assets/Scripts/Widgets/SoundClipWidget.cs.meta b/Assets/Scripts/Widgets/SoundClipWidget.cs.meta new file mode 100644 index 0000000000..7900fd7021 --- /dev/null +++ b/Assets/Scripts/Widgets/SoundClipWidget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83702bf1a42755143b9cd9cfe4e1c7c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Settings/Localization/Strings/Strings Shared Data.asset b/Assets/Settings/Localization/Strings/Strings Shared Data.asset index b22e1fdc7b..aa4ca58581 100644 --- a/Assets/Settings/Localization/Strings/Strings Shared Data.asset +++ b/Assets/Settings/Localization/Strings/Strings Shared Data.asset @@ -3255,6 +3255,14 @@ MonoBehaviour: m_Key: MULTICAM_TOOL_DEPTH_TEXT m_Metadata: m_Items: [] + - m_Id: 144201565051027456 + m_Key: PANEL_AUDIO_CLIP_DESCRIPTION + m_Metadata: + m_Items: [] + - m_Id: 144204798700027904 + m_Key: PANEL_REFERENCE_AUDIO_DESCRIPTION + m_Metadata: + m_Items: [] - m_Id: 137988464450723840 m_Key: LAYERS_PANEL_MOVELAYER_BUTTON_DESCRIPTION m_Metadata: @@ -3629,24 +3637,42 @@ MonoBehaviour: m_Items: [] - m_Id: 439543840074457088 m_Key: SNAP_SETTINGS_PANEL_TOGGLE_Z_ROTATION_SNAP - m_Metadata: - m_Items: [] - - m_Id: 423748078849216512 - m_Key: POPUP_ACCOUNTS_VIVEINFO_TITLE m_Metadata: m_Items: [] - - m_Id: 423748375394897920 - m_Key: POPUP_ACCOUNTS_VIVEINFO_DESCRIPTION + - m_Id: 455073616801390592 + m_Key: BRUSH_QUILLCUBE + m_Metadata: + m_Items: [] + - m_Id: 455073689002139648 + m_Key: BRUSH_QUILLCYLINDER + m_Metadata: + m_Items: [] + - m_Id: 455073748024385536 + m_Key: BRUSH_QUILLELLIPSE + m_Metadata: + m_Items: [] + - m_Id: 455073795705233408 + m_Key: BRUSH_QUILLRIBBON + m_Metadata: + m_Items: [] + - m_Id: 467449183412510720 + m_Key: LABS_PANEL_QUILL_BUTTON_DESCRIPTION m_Metadata: m_Items: [] - - m_Id: 430213467397410816 - m_Key: POPUP_UPLOAD_VIVERSE_TITLE + - m_Id: 467452096813817856 + m_Key: QUILL_PANEL_DESCRIPTION m_Metadata: m_Items: [] - - m_Id: 430213857824198656 - m_Key: POPUP_UPLOAD_VIVERSE_DESCRIPTION + - m_Id: 467464424217206784 + m_Key: QUILL_PANEL_NO_QUILL_FILES m_Metadata: m_Items: [] + - m_Id: 467464562255945728 + m_Key: QUILL_PANEL_NO_IMM_FILES + m_Metadata: + m_Items: [] + m_Metadata: + m_Items: [] m_KeyGenerator: rid: 6394126504544960513 references: diff --git a/Assets/Settings/Localization/Strings/Strings_en.asset b/Assets/Settings/Localization/Strings/Strings_en.asset index bb19aca898..1dbd850ec4 100644 --- a/Assets/Settings/Localization/Strings/Strings_en.asset +++ b/Assets/Settings/Localization/Strings/Strings_en.asset @@ -3429,6 +3429,14 @@ MonoBehaviour: m_Localized: Depth m_Metadata: m_Items: [] + - m_Id: 144201565051027456 + m_Localized: Audio Clip + m_Metadata: + m_Items: [] + - m_Id: 144204798700027904 + m_Localized: Audio Clips + m_Metadata: + m_Items: [] - m_Id: 137988464450723840 m_Localized: Move Selection to Current Layer m_Metadata: @@ -3800,6 +3808,38 @@ MonoBehaviour: Worlds.' m_Metadata: m_Items: [] + - m_Id: 455073616801390592 + m_Localized: Quill Cube + m_Metadata: + m_Items: [] + - m_Id: 455073689002139648 + m_Localized: Quill Cylinder + m_Metadata: + m_Items: [] + - m_Id: 455073748024385536 + m_Localized: Quill Ellipse + m_Metadata: + m_Items: [] + - m_Id: 455073795705233408 + m_Localized: Quill Ribbon + m_Metadata: + m_Items: [] + - m_Id: 467449183412510720 + m_Localized: Quill Sketch Library + m_Metadata: + m_Items: [] + - m_Id: 467452096813817856 + m_Localized: Quill Library + m_Metadata: + m_Items: [] + - m_Id: 467464424217206784 + m_Localized: No Quill Sketches found in your Quill folder + m_Metadata: + m_Items: [] + - m_Id: 467464562255945728 + m_Localized: No .imm files found in your Media Library + m_Metadata: + m_Items: [] references: version: 2 RefIds: [] diff --git a/Assets/Shaders/SoundClipWidget.shader b/Assets/Shaders/SoundClipWidget.shader new file mode 100644 index 0000000000..a3b511d2cf --- /dev/null +++ b/Assets/Shaders/SoundClipWidget.shader @@ -0,0 +1,101 @@ +// Copyright 2020 The Tilt 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. + +Shader "Custom/SoundClipWidget" { + Properties { + _Color("Main Color", Color) = (1,1,1,1) + _MainTex("Main Texture", 2D) = "white" {} + _Aspect("Aspect Ratio", Float) = 1 + _Cutoff("Alpha cutoff", Range(0,1)) = 0.5 + _Grayscale("Grayscale", Float) = 0 + [Enum(UnityEngine.Rendering.CullMode)] _CullMode ("CullMode", Int) = 2 + } + SubShader { + Tags{ "Queue" = "AlphaTest+20" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" } + Pass { + Lighting Off + Cull [_CullMode] + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile __ SELECTION_ON HIGHLIGHT_ON + #include "UnityCG.cginc" + #include "Assets/Shaders/Include/Hdr.cginc" + #include "Assets/Shaders/Include/MobileSelection.cginc" + + fixed4 _Color; + sampler2D _MainTex; + float4 _MainTex_ST; + uniform float _Activated; + uniform float _Aspect; + uniform float _Cutoff; + uniform float _Grayscale; + uniform float _LegacyReferenceImageTint; + + struct appdata { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + v2f vert (appdata v) { + + v.uv -= 0.5; + + // Landscape format images + if (_Aspect > 1.0) { + v.uv.x /= _Aspect; + } + + // Portrait format images + else { + v.uv.y *= _Aspect; + } + + v.uv += 0.5; + + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag (v2f i) : SV_Target { + fixed4 c = tex2D(_MainTex, i.uv) * _Color; + + if (c.g < _Cutoff) discard; + + // Config flag for reproducing old, broken behavior. + if (_LegacyReferenceImageTint > 0) { + c.rgb *= .75; + } + + if (_Grayscale == 1) { + float grayscale = dot(c.rgb, float3(0.3, 0.59, 0.11)); + return encodeHdr(grayscale); + } + + FRAG_MOBILESELECT(c) + + return encodeHdr(c); + } + ENDCG + } + } +} diff --git a/Assets/Shaders/SoundClipWidget.shader.meta b/Assets/Shaders/SoundClipWidget.shader.meta new file mode 100644 index 0000000000..e5a5abbb16 --- /dev/null +++ b/Assets/Shaders/SoundClipWidget.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7316425f699fd1d459c40d7e089fa760 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Shaders/ToolGhost.shader b/Assets/Shaders/ToolGhost.shader new file mode 100644 index 0000000000..e2c4186fbe --- /dev/null +++ b/Assets/Shaders/ToolGhost.shader @@ -0,0 +1,113 @@ +// Copyright 2020 The Tilt 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. + +Shader "Custom/ToolGhost" +{ + Properties + { + _Color ("Color", Color) = (1, 1, 1, 1) + _MainTex ("Texture", 2D) = "white" {} + _VectorX ("X Vector", Float) = 1 + _VectorY ("Y Vector", Float) = 0.5 + _VectorZ ("Z Vector", Float) = 0 + _TilingX ("X Tiling", Float) = 1 + _TilingY ("Y Tiling", Float) = 1 + } + + Category + { + SubShader + { + + Tags + { + "Queue" = "Overlay" "IgnoreProjector" = "True" "RenderType" = "Transparent" + } + + Pass + { + Blend One One + Lighting Off Cull Off ZTest Always ZWrite Off Fog + { + Mode Off + } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + + #include + + #include "UnityCG.cginc" + #include "Assets/Shaders/Include/Brush.cginc" + #include "Assets/Shaders/Include/ColorSpace.cginc" + + float _VectorX; + float _VectorY; + float _VectorZ; + float _TilingX; + float _TilingY; + + struct appdata_t + { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : POSITION; + float3 viewDir : TEXCOORD0; + float3 normal : NORMAL; + float2 uv : TEXCOORD1; + }; + + + v2f vert(appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.viewDir = normalize(ObjSpaceViewDir(v.vertex)); + o.normal = normalize(v.normal); + + float3 direction = float3(_VectorX, _VectorY, _VectorZ); // The direction to project onto + float2 tiling = float2(_TilingX, _TilingY); + float3 N = normalize(direction); // Normalize the projection direction to use as the plane's normal + float3 U = normalize(cross(float3(0, 1, 0), N)); // U is perpendicular to 'up' and 'N' + float3 V = cross(N, U); // V is perpendicular to both 'N' and 'U', lies on the plane + + // Project position onto the plane defined by N, U, V + float3 proj = v.vertex - dot(v.vertex, N) * N; // Project 'position' onto the plane + o.uv = float2(dot(proj, U) * tiling.x, dot(proj, V) * tiling.y); + return o; + } + + fixed4 frag(v2f i) : COLOR + { + float facingRatio = saturate(dot(i.viewDir, i.normal)); + facingRatio = 1 - facingRatio; + float4 texColor = tex2D(_MainTex, i.uv); + float4 outColor = _Color * (texColor + 0.5) * facingRatio; + outColor.a = 0.5; + return outColor; + } + ENDCG + } + } +} +Fallback "Unlit/Diffuse" +} diff --git a/Assets/Shaders/ToolGhost.shader.meta b/Assets/Shaders/ToolGhost.shader.meta new file mode 100644 index 0000000000..ad7fa91fed --- /dev/null +++ b/Assets/Shaders/ToolGhost.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4ec22985cf4da3a489262499812ec6c7 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Textures/Trademarked/QuillLogo.png b/Assets/Textures/Trademarked/QuillLogo.png new file mode 100644 index 0000000000..4a39e3cae0 Binary files /dev/null and b/Assets/Textures/Trademarked/QuillLogo.png differ diff --git a/Assets/Textures/Trademarked/QuillLogo.png.meta b/Assets/Textures/Trademarked/QuillLogo.png.meta new file mode 100644 index 0000000000..a9f813c4a6 --- /dev/null +++ b/Assets/Textures/Trademarked/QuillLogo.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 22ca44880b645734b993dcfa04f5ea48 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json index b325b69f24..c821185d86 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,5 +1,6 @@ { "dependencies": { + "com.immersive-foundation.imm-stroke-reader": "https://github.com/icosa-mirror/IMM.git?path=/Packages/com.immersive-foundation.imm-stroke-reader#upm", "com.coplaydev.unity-mcp": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#beta", "com.ixxy.unitysymmetry": "https://github.com/IxxyXR/unity-symmetry.git?nocache=7#upm", "com.meta.xr.sdk.core": "https://github.com/icosa-mirror/com.meta.xr.sdk.core.git#68.0.2-openbrush-hotfix", @@ -29,6 +30,7 @@ "com.unity.xr.management": "4.4.1", "com.unity.xr.oculus": "4.2.0", "com.unity.xr.openxr": "1.10.0", + "com.valvesoftware.steamaudio": "https://github.com/icosa-mirror/com.valvesoftware.steamaudio.git", "com.watertrans.glyphloader": "https://github.com/icosa-mirror/GlyphLoader-Unity.git#upm", "com.zappar.xr.zapbox": "https://github.com/zappar-xr/zapbox-xr-sdk.git#91b52bde3c0a67aa08909bdd2657f8a6672decf6", "moonsharp": "https://github.com/icosa-mirror/moonsharp-unity-upm.git", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 222ef678c3..904e9dc81e 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -16,6 +16,15 @@ }, "hash": "a2a5edf8d8e3f715881c0db4589c18feff7c379f" }, + "com.immersive-foundation.imm-stroke-reader": { + "version": "https://github.com/icosa-mirror/IMM.git?path=/Packages/com.immersive-foundation.imm-stroke-reader#upm", + "depth": 0, + "source": "git", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "3.2.1" + }, + "hash": "5e6ee762c5e3f7c81b0e73b512228307d79be5da" + }, "com.ixxy.unitysymmetry": { "version": "https://github.com/IxxyXR/unity-symmetry.git?nocache=7#upm", "depth": 0, @@ -375,6 +384,13 @@ }, "url": "https://packages.unity.com" }, + "com.valvesoftware.steamaudio": { + "version": "https://github.com/icosa-mirror/com.valvesoftware.steamaudio.git", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "7ae596f571e5a3141f7e6d0be0e7dcb7312722c0" + }, "com.watertrans.glyphloader": { "version": "https://github.com/icosa-mirror/GlyphLoader-Unity.git#upm", "depth": 0, diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset index df1e8090a2..0966476a49 100644 --- a/ProjectSettings/AudioManager.asset +++ b/ProjectSettings/AudioManager.asset @@ -13,8 +13,8 @@ AudioManager: m_VirtualVoiceCount: 512 m_RealVoiceCount: 32 m_EnableOutputSuspension: 1 - m_SpatializerPlugin: - m_AmbisonicDecoderPlugin: + m_SpatializerPlugin: Steam Audio Spatializer + m_AmbisonicDecoderPlugin: Steam Audio Ambisonic Decoder m_DisableAudio: 0 m_VirtualizeEffects: 1 m_RequestedDSPBufferSize: 0 diff --git a/Quill-IMM-chapter-import-plan.md b/Quill-IMM-chapter-import-plan.md new file mode 100644 index 0000000000..1af24a677b --- /dev/null +++ b/Quill-IMM-chapter-import-plan.md @@ -0,0 +1,131 @@ +# Quill/IMM Chapter Import Support Plan + +## Objective +Add chapter-aware importing for files loaded through the Quill library flow, with clear behavior for both: +- `.imm` files (native chapter support exists in `ImmStrokeReader`) +- Quill project folders (`Quill.json` + `Quill.qbin`) where chapter representation is not currently explicit in Open Brush code + +## Current State (Codebase Findings) +- Import entry point is `Quill.Load(...)` in `Assets/Scripts/Quill.cs`. +- Source detection is path-based: + - Directory => `SQ.QuillSequenceReader.Read(path)` (Quill project) + - File => `ImmStrokeReader.SharpQuillCompat.ReadImmAsSequence(path)` (IMM adapter) +- There is no chapter parameter in: + - `Quill.Load(...)` + - `ApiMethods.LoadQuill(...)` (`Assets/Scripts/API/ApiMethods.SharpQuill.cs`) + - UI command state (`Quill.PendingLoadPath` is only a string) +- IMM package already exposes chapter APIs: + - `StrokeReader_GetChapterCount` + - `StrokeReader_GetCurrentChapter` + - `StrokeReader_SetChapter` + - Wrapper: `StrokeReaderDocument.Load(..., chapterIndex = -1)` and `SetChapter(...)` +- `SharpQuillCompat.ReadImmAsSequence(...)` currently does not accept/select chapter index. + +## Scope Decisions +1. Phase 1: ship chapter selection for IMM imports. +2. Phase 2: define and implement Quill chapter semantics after validating real Quill files that contain chapters. + +Reason: IMM chapter control is concrete and available now; Quill chapter representation is ambiguous in current parser/importer usage. + +## Phase 1: IMM Chapter Selection End-to-End + +### 1) Import options plumbing +- Replace single-path pending load state with a small settings object: + - Path + - Source type (optional/derived) + - Chapter mode (`Default`, `SpecificIndex`, optionally `AllChapters`) + - Chapter index (if specific) +- Update command handoff in: + - `Assets/Scripts/GUI/QuillFileButton.cs` + - `Assets/Scripts/SketchControlsScript.cs` (`LoadQuillConfirmUnsaved`, `LoadQuillFile`, coroutine path) + +### 2) Quill API surface +- Extend signatures with optional chapter index: + - `Quill.Load(..., int? chapterIndex = null, ...)` in `Assets/Scripts/Quill.cs` + - `ApiMethods.LoadQuill(..., int chapterIndex = -1, ...)` in `Assets/Scripts/API/ApiMethods.SharpQuill.cs` +- Preserve backward compatibility: + - Omitted chapter index keeps current behavior. + +### 3) IMM adapter changes +- Extend `ReadImmAsSequence` to accept optional chapter index: + - `Library/PackageCache/com.immersive-foundation.imm-stroke-reader@.../Runtime/SharpQuillCompat.cs` +- In adapter load path: + - Query chapter count. + - Clamp/validate requested chapter. + - Call `StrokeReader_SetChapter` before layer/drawing extraction. +- Add explicit logging for invalid index fallback behavior. + +### 4) UI behavior (IMM source) +- In Quill Library IMM tab: + - Add chapter picker control (at minimum index-based). + - Show chapter count (lazy load metadata when selecting a file). +- Keep Quill-project UI unchanged initially. +- Files: + - `Assets/Scripts/GUI/QuillLibraryPanel.cs` + - `Assets/Scripts/QuillFileInfo.cs` + - `Assets/Scripts/QuillFileCatalog.cs` + - prefab updates likely needed in `Assets/Prefabs/Panels/QuillLibraryPanel.prefab` + +### 5) Metadata strategy for chapter count +- Avoid parsing every IMM during directory scan. +- Recommended: + - Keep catalog scan cheap. + - Resolve chapter count on demand when file is focused/selected. + - Cache `{path, lastWriteTimeUtc, chapterCount}` to avoid repeated native loads. + +### 6) Tests and validation for IMM +- Add/edit tests to cover: + - Default import unchanged when no chapter specified. + - Specified valid chapter index routes through adapter and changes imported output. + - Invalid chapter index fallback behavior. +- Manual QA checklist: + - Merge import with chapter N. + - Load (clear scene) with chapter N. + - Undo/redo integrity via `LoadQuillCommand`. + +## Phase 2: Quill Chapter Support (Discovery then Implementation) + +### 1) Discovery spike (required) +- Collect representative Quill project samples containing chapters. +- Inspect `Quill.json` structures and map chapter concept to parser output: + - Layer hierarchy + - animation timeline/keyframes + - any chapter-like markers/metadata +- Confirm whether chapter is: + - explicit metadata, or + - emergent via animated groups/visibility over time. + +### 2) Define chapter semantics for Open Brush +- Decide one behavior and document it: + - Import chapter as “state at chapter time/index” + - Import chapter as dedicated top-level layer group + - Import all chapters as separate layer groups +- Ensure behavior is consistent between Quill and IMM where possible. + +### 3) Implement Quill path +- Add chapter-aware evaluation in `Assets/Scripts/Quill.cs`: + - likely requires animation-key evaluation (visibility/opacity/offset/transform) at selected chapter time/index + - current importer mostly ignores animation (`loadAnimations=false` path), so this is non-trivial. +- If needed, extend SharpQuill parser usage (or package) for easier chapter extraction. + +### 4) UI/API convergence +- Reuse same chapter picker for Quill projects once semantics are finalized. +- Keep same API shape (`chapterIndex`) across IMM and Quill to avoid fragmented integrations. + +## Risks and Unknowns +- Quill chapter semantics are not currently explicit in the Open Brush importer path. +- IMM chapter index likely numeric only (no chapter names exposed by current managed API). +- Loading IMM repeatedly for metadata could cause UI hitching without async/caching. +- Prefab/UI changes increase merge risk; isolate to minimal controls in first pass. + +## Recommended Delivery Order +1. IMM-only chapter plumbing + adapter + API + minimal UI picker. +2. IMM QA with known multi-chapter files. +3. Quill chapter discovery spike with sample assets and documented semantics. +4. Quill chapter implementation using same UI/API contract. + +## Definition of Done +- User can select a chapter when importing IMM from Quill Library. +- Selected chapter is actually reflected in imported layers/strokes. +- Existing import flow remains unchanged when chapter is not selected. +- Quill chapter support has a documented, tested behavior (after discovery phase), not an inferred heuristic. diff --git a/Quill-background-summary.md b/Quill-background-summary.md new file mode 100644 index 0000000000..62525d2352 --- /dev/null +++ b/Quill-background-summary.md @@ -0,0 +1,19 @@ +# Quill background color → Open Brush + +Summary +- Quill files (SharpQuill sequences) include background/clear color metadata in the sequence object produced by SQ.QuillSequenceReader or the IMM compatibility reader (ImmStrokeReader.SharpQuillCompat). +- Open Brush stores scene clear/ambient colors in Environment.RenderSettingsLite (Environment.cs) — notably m_ClearColor — and applies them via SceneSettings: RegisterCamera assigns rCamera.backgroundColor = m_DesiredEnvironment.m_RenderSettings.m_ClearColor and the SceneSettings update/transition logic writes m_InterimValues.m_ClearColor to all registered cameras' backgroundColor. + +Current behavior +- Quill.Load (Assets/Scripts/Quill.cs) parses the SharpQuill sequence and imports strokes, picture layers, and audio, and writes picture layers into the media library, but it does NOT map the sequence background/clear color into Environment.RenderSettingsLite or call SceneSettings to apply it. + +How to apply Quill background color in Open Brush +- The importer would need to read the background/clear color from the parsed Sequence (from SQ.QuillSequenceReader.Read or the IMM adapter) and then call SceneSettings (e.g., create/update an Environment.RenderSettingsLite and call SceneSettings.SetDesiredPreset or directly set RenderSettings/camera.backgroundColor) to make the color visible in the scene. + +Relevant files +- Assets/Scripts/Quill.cs — reads SharpQuill sequence and imports layers/strokes/images (does not set clear color). +- Assets/Scripts/Environment.cs — Environment.RenderSettingsLite (m_ClearColor, ambient, skybox cubemap, etc.). +- Assets/Scripts/SceneSettings.cs — applies environment values to RenderSettings and per-camera backgroundColor, and handles skybox/gradient/custom skybox loading. + +Notes +- Background color is distinct from background images/skyboxes: Quill picture layers are imported as images (media library) and can be used as skyboxes via SceneSettings.LoadCustomSkybox, but the scalar clear color must be explicitly transferred from the Quill sequence to Open Brushs environment settings if desired.