diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..3130955b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,71 @@ +name: Bug Report +description: Report a bug or unexpected behavior +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + ## Bug Report + Please provide as much detail as possible to help us identify and fix the issue. + - type: input + id: summary + attributes: + label: Summary + description: A brief summary of the bug + placeholder: "Scene transition freezes..." + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to Reproduce + description: Steps to reproduce the issue + placeholder: | + 1. Load scene A + 2. Transition to scene B + 3. Observe the freeze + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: What did you expect to happen? + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual Behavior + description: What actually happened? + validations: + required: true + - type: input + id: version + attributes: + label: Package Version + description: The version of the package you are using + placeholder: "e.g., 3.1.0" + validations: + required: true + - type: input + id: editorversion + attributes: + label: Unity Editor Version + description: The version of the Unity Editor you are using + placeholder: "e.g., 6000.0.40f1" + validations: + required: true + - type: textarea + id: logs + attributes: + label: Logs + description: Please attach any relevant logs or errors + render: shell + - type: checkboxes + id: terms + attributes: + label: Acknowledgement + options: + - label: I have searched the existing issues to avoid duplicates + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..2bd94c51 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,38 @@ +name: Feature Request +description: Suggest an idea or enhancement +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + ## Feature Request + Have a feature idea? Let us know what you'd like to see in My Scene Manager! + - type: input + id: summary + attributes: + label: Summary + description: A brief summary of the feature + placeholder: "Add support for async scene loading with progress callbacks" + validations: + required: true + - type: textarea + id: problem + attributes: + label: Problem or Use Case + description: What problem would this feature solve? How would it be useful? + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed Solution + description: Describe how you'd like the feature to work + validations: + required: true + - type: checkboxes + id: terms + attributes: + label: Acknowledgement + options: + - label: I have searched the existing issues to ensure this feature hasn't been requested already + required: true diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 00000000..52d0e2f8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,39 @@ +name: Question +description: Ask a question or request help +labels: ["question"] +body: + - type: markdown + attributes: + value: | + ## Question or Support Request + Need help or have a question about using My Scene Manager? Let us know! + - type: textarea + id: question + attributes: + label: Your Question + description: Clearly describe your question or the help you need + validations: + required: true + - type: input + id: version + attributes: + label: Package Version + description: The version of the package you are using + placeholder: "e.g., 3.1.0" + validations: + required: true + - type: input + id: editorversion + attributes: + label: Unity Editor Version + description: The version of the Unity Editor you are using + placeholder: "e.g., 6000.0.40f1" + validations: + required: true + - type: checkboxes + id: terms + attributes: + label: Acknowledgement + options: + - label: I have searched the documentation and existing issues + required: true diff --git a/.github/workflows/release-pre.yml b/.github/workflows/release-pre.yml index 69f7f30c..3bc8cc48 100644 --- a/.github/workflows/release-pre.yml +++ b/.github/workflows/release-pre.yml @@ -14,6 +14,5 @@ jobs: with: blockPullRequestRelease: false blockReleaseCommit: true - secrets: - githubToken: ${{ secrets.GH_TOKEN }} + secrets: inherit diff --git a/.github/workflows/release-template.yml b/.github/workflows/release-template.yml index 332f08e0..312729bf 100644 --- a/.github/workflows/release-template.yml +++ b/.github/workflows/release-template.yml @@ -13,7 +13,13 @@ on: required: false type: boolean secrets: - githubToken: + GH_TOKEN: + required: true + UNITY_LICENSE: + required: true + UNITY_EMAIL: + required: true + UNITY_PASSWORD: required: true jobs: @@ -28,11 +34,13 @@ jobs: with: fetch-depth: 0 persist-credentials: false + # Removes the git plugin from semantic release so it doesn't generate a new commit - name: ✂️ Disable semantic release commit if: ${{ inputs.blockReleaseCommit == true }} run: | cat .releaserc.json | jq 'del(.plugins[] | select(type == "array" and .[0] == "@semantic-release/git"))' .releaserc.json > .releaserc.json.tmp && mv .releaserc.json.tmp .releaserc.json + - name: 🚀 Semantic Release id: release uses: cycjimmy/semantic-release-action@v4 @@ -40,7 +48,8 @@ jobs: dry_run: ${{ inputs.dryRun }} ci: ${{ inputs.blockPullRequestRelease }} env: - GH_TOKEN: ${{ secrets.githubToken }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: 📄 Summary run: | if [ '${{ steps.release.outputs.new_release_published }}' == 'true' ] && [ '${{ inputs.dryRun }}' == 'false' ]; then @@ -60,32 +69,90 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + - name: 📤 Extract Path id: extract-path run: | PACKAGE_PATH=$(jq -r '.plugins[] | select(type == "array" and .[0] == "@semantic-release/npm") | .[1].pkgRoot' .releaserc.json) echo "PACKAGE_PATH=$PACKAGE_PATH" >> $GITHUB_ENV + - name: ✏️ Update package.json run: | jq '.version = "${{ env.releaseVersion }}"' $PACKAGE_PATH/package.json > package.json.tmp && mv package.json.tmp $PACKAGE_PATH/package.json + - name: 📦 Package UPM Branch id: package_upm run: | git config --global user.name 'semantic-release-bot' git config --global user.email 'semantic-release-bot@martynus.net' - git commit -am "update package.json" + git commit --amend -a --no-edit git branch -d upm &> /dev/null || echo upm branch not found git subtree split -P "$PACKAGE_PATH" -b upm git checkout upm if [[ -d "Samples" ]]; then git mv Samples Samples~ rm -f Samples.meta - git commit -am "fix: Samples => Samples~" + git commit --amend -a --no-edit fi git push -f -u origin upm + - name: 🏷️ Create UPM Tag run: | git tag $TAG upm git push origin --tags env: - TAG: upm/${{ env.releaseVersion }} \ No newline at end of file + TAG: upm/${{ env.releaseVersion }} + + export-unity-package: + runs-on: ubuntu-latest + needs: 'semantic-release' + if: ${{ needs.semantic-release.outputs.new_release_published == 'true' && inputs.dryRun == false }} + env: + releaseVersion: ${{ needs.semantic-release.outputs.new_release_version }} + steps: + - name: 📂 Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: 📤 Extract Path + id: extract-path + run: | + PACKAGE_PATH=$(jq -r '.plugins[] | select(type == "array" and .[0] == "@semantic-release/npm") | .[1].pkgRoot' .releaserc.json) + echo "PACKAGE_PATH=$PACKAGE_PATH" >> $GITHUB_ENV + + - name: ✏️ Update package.json + run: | + jq '.version = "${{ env.releaseVersion }}"' $PACKAGE_PATH/package.json > package.json.tmp && mv package.json.tmp $PACKAGE_PATH/package.json + + - name: 🔄 Rename Samples Folder + run: | + if [[ -d "$PACKAGE_PATH/Samples" ]]; then + mv "$PACKAGE_PATH/Samples" "$PACKAGE_PATH/Samples~" + rm -f "$PACKAGE_PATH/Samples.meta" + fi + + - name: 🗃️ Cache Library + uses: actions/cache@v4 + with: + path: Library + key: Library-StandaloneLinux64 + restore-keys: Library- + + - name: 📦 Export Unity Package + uses: game-ci/unity-builder@v4 + with: + targetPlatform: StandaloneLinux64 + buildMethod: PackageExporter.ExportPackage + projectPath: "." + allowDirtyBuild: true + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + + - name: 🗂️ Upload Unity Package Artifact + uses: actions/upload-artifact@v4 + with: + name: com.mygamedevtools.scene-loader-${{ env.releaseVersion }} + path: "./*.unitypackage" \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 03263536..713bdd97 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,5 +10,4 @@ jobs: create-release: name: Release uses: ./.github/workflows/release-template.yml - secrets: - githubToken: ${{ secrets.GH_TOKEN }} + secrets: inherit diff --git a/.gitignore b/.gitignore index ed7cf513..401a9d35 100644 --- a/.gitignore +++ b/.gitignore @@ -78,4 +78,8 @@ crashlytics-build.properties # Temporary auto-generated Android Assets [Aa]ssets/[Ss]treamingAssets/aa.meta -[Aa]ssets/[Ss]treamingAssets/aa/* \ No newline at end of file +[Aa]ssets/[Ss]treamingAssets/aa/* + +# Website +.docusaurus +node_modules/ \ No newline at end of file diff --git a/Assets/ScriptTemplates.meta b/Assets/Rendering.meta similarity index 77% rename from Assets/ScriptTemplates.meta rename to Assets/Rendering.meta index 827bdc12..74d6bdb2 100644 --- a/Assets/ScriptTemplates.meta +++ b/Assets/Rendering.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cf4f05422679365499a3e8ef6ae42042 +guid: 1acbd88bd08fad84f821c442035f9cb4 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Rendering/DefaultVolumeProfile.asset b/Assets/Rendering/DefaultVolumeProfile.asset new file mode 100644 index 00000000..77077da5 --- /dev/null +++ b/Assets/Rendering/DefaultVolumeProfile.asset @@ -0,0 +1,795 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-8370080110211795471 +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: 0b2db86121404754db890f4c8dfe81b2, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + skipIterations: + m_OverrideState: 1 + m_Value: 1 + threshold: + m_OverrideState: 1 + m_Value: 0.9 + intensity: + m_OverrideState: 1 + m_Value: 0 + scatter: + m_OverrideState: 1 + m_Value: 0.7 + clamp: + m_OverrideState: 1 + m_Value: 65472 + tint: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + highQualityFiltering: + m_OverrideState: 1 + m_Value: 0 + downscale: + m_OverrideState: 1 + m_Value: 0 + maxIterations: + m_OverrideState: 1 + m_Value: 6 + dirtTexture: + m_OverrideState: 1 + m_Value: {fileID: 0} + dimension: 1 + dirtIntensity: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-8346100507460703878 +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: 221518ef91623a7438a71fef23660601, type: 3} + m_Name: WhiteBalance + m_EditorClassIdentifier: + active: 1 + temperature: + m_OverrideState: 1 + m_Value: 0 + tint: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-5574348742128233764 +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: 66f335fb1ffd8684294ad653bf1c7564, type: 3} + m_Name: ColorAdjustments + m_EditorClassIdentifier: + active: 1 + postExposure: + m_OverrideState: 1 + m_Value: 0 + contrast: + m_OverrideState: 1 + m_Value: 0 + colorFilter: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + hueShift: + m_OverrideState: 1 + m_Value: 0 + saturation: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-5345359279556101022 +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: fb60a22f311433c4c962b888d1393f88, type: 3} + m_Name: PaniniProjection + m_EditorClassIdentifier: + active: 1 + distance: + m_OverrideState: 1 + m_Value: 0 + cropToFit: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &-3894561815744533259 +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: 06437c1ff663d574d9447842ba0a72e4, type: 3} + m_Name: ScreenSpaceLensFlare + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 + tintColor: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + bloomMip: + m_OverrideState: 1 + m_Value: 1 + firstFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + secondaryFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + warpedFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + warpedFlareScale: + m_OverrideState: 1 + m_Value: {x: 1, y: 1} + samples: + m_OverrideState: 1 + m_Value: 1 + sampleDimmer: + m_OverrideState: 1 + m_Value: 0.5 + vignetteEffect: + m_OverrideState: 1 + m_Value: 1 + startingPosition: + m_OverrideState: 1 + m_Value: 1.25 + scale: + m_OverrideState: 1 + m_Value: 1.5 + streaksIntensity: + m_OverrideState: 1 + m_Value: 0 + streaksLength: + m_OverrideState: 1 + m_Value: 0.5 + streaksOrientation: + m_OverrideState: 1 + m_Value: 0 + streaksThreshold: + m_OverrideState: 1 + m_Value: 0.25 + resolution: + m_OverrideState: 1 + m_Value: 4 + chromaticAbberationIntensity: + m_OverrideState: 1 + m_Value: 0.5 +--- !u!114 &-3681988503604989566 +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: 899c54efeace73346a0a16faa3afe726, type: 3} + m_Name: Vignette + m_EditorClassIdentifier: + active: 1 + color: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} + center: + m_OverrideState: 1 + m_Value: {x: 0.5, y: 0.5} + intensity: + m_OverrideState: 1 + m_Value: 0 + smoothness: + m_OverrideState: 1 + m_Value: 0.2 + rounded: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-942384438019783254 +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: e021b4c809a781e468c2988c016ebbea, type: 3} + m_Name: ColorLookup + m_EditorClassIdentifier: + active: 1 + texture: + m_OverrideState: 1 + m_Value: {fileID: 0} + dimension: 1 + contribution: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-833292944778066288 +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: 70afe9e12c7a7ed47911bb608a23a8ff, type: 3} + m_Name: SplitToning + m_EditorClassIdentifier: + active: 1 + shadows: + m_OverrideState: 1 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + highlights: + m_OverrideState: 1 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + balance: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-712942181991938360 +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: 558a8e2b6826cf840aae193990ba9f2e, type: 3} + m_Name: ShadowsMidtonesHighlights + m_EditorClassIdentifier: + active: 1 + shadows: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + midtones: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + highlights: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + shadowsStart: + m_OverrideState: 1 + m_Value: 0 + shadowsEnd: + m_OverrideState: 1 + m_Value: 0.3 + highlightsStart: + m_OverrideState: 1 + m_Value: 0.55 + highlightsEnd: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &-527798231832664840 +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: 29fa0085f50d5e54f8144f766051a691, type: 3} + m_Name: FilmGrain + m_EditorClassIdentifier: + active: 1 + type: + m_OverrideState: 1 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0 + response: + m_OverrideState: 1 + m_Value: 0.8 + texture: + m_OverrideState: 1 + m_Value: {fileID: 0} +--- !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: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: DefaultVolumeProfile + m_EditorClassIdentifier: + components: + - {fileID: 7033987986701943802} + - {fileID: 8644333173934411570} + - {fileID: -3681988503604989566} + - {fileID: -527798231832664840} + - {fileID: 8846041007000823114} + - {fileID: 5713285358670820303} + - {fileID: 5474851606841886039} + - {fileID: 519842901086012108} + - {fileID: -3894561815744533259} + - {fileID: -8346100507460703878} + - {fileID: -8370080110211795471} + - {fileID: 8769794060634833573} + - {fileID: -5574348742128233764} + - {fileID: 2343884554779143547} + - {fileID: -833292944778066288} + - {fileID: -942384438019783254} + - {fileID: -5345359279556101022} + - {fileID: -712942181991938360} + - {fileID: 7074675694432682807} +--- !u!114 &519842901086012108 +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: c01700fd266d6914ababb731e09af2eb, type: 3} + m_Name: DepthOfField + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + gaussianStart: + m_OverrideState: 1 + m_Value: 10 + gaussianEnd: + m_OverrideState: 1 + m_Value: 30 + gaussianMaxRadius: + m_OverrideState: 1 + m_Value: 1 + highQualitySampling: + m_OverrideState: 1 + m_Value: 0 + focusDistance: + m_OverrideState: 1 + m_Value: 10 + aperture: + m_OverrideState: 1 + m_Value: 5.6 + focalLength: + m_OverrideState: 1 + m_Value: 50 + bladeCount: + m_OverrideState: 1 + m_Value: 5 + bladeCurvature: + m_OverrideState: 1 + m_Value: 1 + bladeRotation: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &2343884554779143547 +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: 97c23e3b12dc18c42a140437e53d3951, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + neutralHDRRangeReductionMode: + m_OverrideState: 1 + m_Value: 2 + acesPreset: + m_OverrideState: 1 + m_Value: 3 + hueShiftAmount: + m_OverrideState: 1 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 1 + m_Value: 0 + paperWhite: + m_OverrideState: 1 + m_Value: 300 + detectBrightnessLimits: + m_OverrideState: 1 + m_Value: 1 + minNits: + m_OverrideState: 1 + m_Value: 0.005 + maxNits: + m_OverrideState: 1 + m_Value: 1000 +--- !u!114 &5474851606841886039 +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: 81180773991d8724ab7f2d216912b564, type: 3} + m_Name: ChromaticAberration + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &5713285358670820303 +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: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} + m_Name: MotionBlur + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + quality: + m_OverrideState: 1 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0 + clamp: + m_OverrideState: 1 + m_Value: 0.05 +--- !u!114 &7033987986701943802 +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: cdfbdbb87d3286943a057f7791b43141, type: 3} + m_Name: ChannelMixer + m_EditorClassIdentifier: + active: 1 + redOutRedIn: + m_OverrideState: 1 + m_Value: 100 + redOutGreenIn: + m_OverrideState: 1 + m_Value: 0 + redOutBlueIn: + m_OverrideState: 1 + m_Value: 0 + greenOutRedIn: + m_OverrideState: 1 + m_Value: 0 + greenOutGreenIn: + m_OverrideState: 1 + m_Value: 100 + greenOutBlueIn: + m_OverrideState: 1 + m_Value: 0 + blueOutRedIn: + m_OverrideState: 1 + m_Value: 0 + blueOutGreenIn: + m_OverrideState: 1 + m_Value: 0 + blueOutBlueIn: + m_OverrideState: 1 + m_Value: 100 +--- !u!114 &7074675694432682807 +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: 6bd486065ce11414fa40e631affc4900, type: 3} + m_Name: ProbeVolumesOptions + m_EditorClassIdentifier: + active: 1 + normalBias: + m_OverrideState: 1 + m_Value: 0.05 + viewBias: + m_OverrideState: 1 + m_Value: 0.1 + scaleBiasWithMinProbeDistance: + m_OverrideState: 1 + m_Value: 0 + samplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + animateSamplingNoise: + m_OverrideState: 1 + m_Value: 1 + leakReductionMode: + m_OverrideState: 1 + m_Value: 2 + minValidDotProductValue: + m_OverrideState: 1 + m_Value: 0.1 + occlusionOnlyReflectionNormalization: + m_OverrideState: 1 + m_Value: 1 + intensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + skyOcclusionIntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + worldOffset: + m_OverrideState: 1 + m_Value: {x: 0, y: 0, z: 0} +--- !u!114 &8644333173934411570 +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: 3eb4b772797da9440885e8bd939e9560, type: 3} + m_Name: ColorCurves + m_EditorClassIdentifier: + active: 1 + master: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + red: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + green: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + blue: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + hueVsHue: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 1 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + hueVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 1 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + satVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 0 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + lumVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 0 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &8769794060634833573 +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: c5e1dc532bcb41949b58bc4f2abfbb7e, type: 3} + m_Name: LensDistortion + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 + xMultiplier: + m_OverrideState: 1 + m_Value: 1 + yMultiplier: + m_OverrideState: 1 + m_Value: 1 + center: + m_OverrideState: 1 + m_Value: {x: 0.5, y: 0.5} + scale: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &8846041007000823114 +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: 5485954d14dfb9a4c8ead8edb0ded5b1, type: 3} + m_Name: LiftGammaGain + m_EditorClassIdentifier: + active: 1 + lift: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + gamma: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + gain: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} diff --git a/Assets/Rendering/DefaultVolumeProfile.asset.meta b/Assets/Rendering/DefaultVolumeProfile.asset.meta new file mode 100644 index 00000000..dcdce9d4 --- /dev/null +++ b/Assets/Rendering/DefaultVolumeProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7641b16591813c8478df3d5724c50315 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders.meta b/Assets/Rendering/HDRPDefaultResources.meta similarity index 77% rename from Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders.meta rename to Assets/Rendering/HDRPDefaultResources.meta index da8640b5..2393a755 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders.meta +++ b/Assets/Rendering/HDRPDefaultResources.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 753ac881f93949248b22da115e8da97f +guid: f68504a66c4b5c44898c2236d35c467d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Rendering/HDRPDefaultResources/DefaultLookDevProfile.asset b/Assets/Rendering/HDRPDefaultResources/DefaultLookDevProfile.asset new file mode 100644 index 00000000..0dd9b433 --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/DefaultLookDevProfile.asset @@ -0,0 +1,259 @@ +%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: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: DefaultLookDevProfile + m_EditorClassIdentifier: + components: + - {fileID: 8761387877531654226} + - {fileID: 1902828633788537306} + - {fileID: 1880163708194025631} + - {fileID: 2340290907100754200} +--- !u!114 &1880163708194025631 +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: 9008a067f4d626c4d8bc4bc48f04bb89, type: 3} + m_Name: AmbientOcclusion + m_EditorClassIdentifier: + active: 1 + quality: + m_OverrideState: 0 + m_Value: 1 + rayTracing: + m_OverrideState: 0 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0.5 + directLightingStrength: + m_OverrideState: 0 + m_Value: 0 + radius: + m_OverrideState: 1 + m_Value: 1 + spatialBilateralAggressiveness: + m_OverrideState: 0 + m_Value: 0.15 + temporalAccumulation: + m_OverrideState: 0 + m_Value: 1 + ghostingReduction: + m_OverrideState: 0 + m_Value: 0.5 + blurSharpness: + m_OverrideState: 0 + m_Value: 0.1 + layerMask: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Bits: 4294967295 + specularOcclusion: + m_OverrideState: 0 + m_Value: 0.5 + occluderMotionRejection: + m_OverrideState: 0 + m_Value: 1 + receiverMotionRejection: + m_OverrideState: 0 + m_Value: 1 + m_StepCount: + m_OverrideState: 0 + m_Value: 6 + m_FullResolution: + m_OverrideState: 0 + m_Value: 0 + m_MaximumRadiusInPixels: + m_OverrideState: 0 + m_Value: 40 + m_BilateralUpsample: + m_OverrideState: 0 + m_Value: 1 + m_DirectionCount: + m_OverrideState: 0 + m_Value: 2 + m_RayLength: + m_OverrideState: 0 + m_Value: 3 + m_SampleCount: + m_OverrideState: 0 + m_Value: 2 + m_Denoise: + m_OverrideState: 0 + m_Value: 1 + m_DenoiserRadius: + m_OverrideState: 0 + m_Value: 0.5 +--- !u!114 &1902828633788537306 +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: 7ddcec8a8eb2d684d833ac8f5d26aebd, type: 3} + m_Name: HDShadowSettings + m_EditorClassIdentifier: + active: 1 + maxShadowDistance: + m_OverrideState: 1 + m_Value: 25 + directionalTransmissionMultiplier: + m_OverrideState: 0 + m_Value: 1 + cascadeShadowSplitCount: + m_OverrideState: 1 + m_Value: 2 + cascadeShadowSplit0: + m_OverrideState: 0 + m_Value: 0.05 + cascadeShadowSplit1: + m_OverrideState: 0 + m_Value: 0.15 + cascadeShadowSplit2: + m_OverrideState: 0 + m_Value: 0.3 + cascadeShadowBorder0: + m_OverrideState: 0 + m_Value: 0 + cascadeShadowBorder1: + m_OverrideState: 0 + m_Value: 0 + cascadeShadowBorder2: + m_OverrideState: 0 + m_Value: 0 + cascadeShadowBorder3: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &2340290907100754200 +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: 24f077503be6ae942a1e1245dbd53ea9, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + quality: + m_OverrideState: 0 + m_Value: 3 + threshold: + m_OverrideState: 0 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0.1 + scatter: + m_OverrideState: 0 + m_Value: 0.7 + tint: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + dirtTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + dirtIntensity: + m_OverrideState: 0 + m_Value: 0 + anamorphic: + m_OverrideState: 0 + m_Value: 1 + m_Resolution: + m_OverrideState: 0 + m_Value: 2 + m_HighQualityPrefiltering: + m_OverrideState: 0 + m_Value: 0 + m_HighQualityFiltering: + m_OverrideState: 0 + m_Value: 1 +--- !u!114 &8761387877531654226 +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: f086a068d4c5889438831b3ae9afc11c, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 1 + useFullACES: + m_OverrideState: 0 + m_Value: 0 + toeStrength: + m_OverrideState: 0 + m_Value: 0 + toeLength: + m_OverrideState: 0 + m_Value: 0.5 + shoulderStrength: + m_OverrideState: 0 + m_Value: 0 + shoulderLength: + m_OverrideState: 0 + m_Value: 0.5 + shoulderAngle: + m_OverrideState: 0 + m_Value: 0 + gamma: + m_OverrideState: 0 + m_Value: 1 + lutTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + lutContribution: + m_OverrideState: 0 + m_Value: 1 + neutralHDRRangeReductionMode: + m_OverrideState: 0 + m_Value: 2 + acesPreset: + m_OverrideState: 0 + m_Value: 3 + fallbackMode: + m_OverrideState: 0 + m_Value: 1 + hueShiftAmount: + m_OverrideState: 0 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 0 + m_Value: 0 + paperWhite: + m_OverrideState: 0 + m_Value: 300 + detectBrightnessLimits: + m_OverrideState: 0 + m_Value: 1 + minNits: + m_OverrideState: 0 + m_Value: 0.005 + maxNits: + m_OverrideState: 0 + m_Value: 1000 diff --git a/Assets/Rendering/HDRPDefaultResources/DefaultLookDevProfile.asset.meta b/Assets/Rendering/HDRPDefaultResources/DefaultLookDevProfile.asset.meta new file mode 100644 index 00000000..f62e11e2 --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/DefaultLookDevProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3837bee00f735443a9ca15a1f874148 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset b/Assets/Rendering/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset new file mode 100644 index 00000000..f8c0519e --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset @@ -0,0 +1,918 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-8770122170507510650 +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: a76fd08475e21554b8f284f723dd7cf8, type: 3} + m_Name: WaterRendering + m_EditorClassIdentifier: + active: 1 + enable: + m_OverrideState: 1 + m_Value: 1 + triangleSize: + m_OverrideState: 0 + m_Value: 30 + ambientProbeDimmer: + m_OverrideState: 0 + m_Value: 1 +--- !u!114 &-7089757308646879465 +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: bcf384b154398e341b6b29969c078198, type: 3} + m_Name: MotionBlur + m_EditorClassIdentifier: + active: 1 + quality: + m_OverrideState: 1 + m_Value: 1 + intensity: + m_OverrideState: 1 + m_Value: 0.5 + maximumVelocity: + m_OverrideState: 0 + m_Value: 200 + minimumVelocity: + m_OverrideState: 0 + m_Value: 2 + cameraMotionBlur: + m_OverrideState: 0 + m_Value: 1 + specialCameraClampMode: + m_OverrideState: 0 + m_Value: 0 + cameraVelocityClamp: + m_OverrideState: 0 + m_Value: 0.05 + cameraTranslationVelocityClamp: + m_OverrideState: 0 + m_Value: 0.05 + cameraRotationVelocityClamp: + m_OverrideState: 0 + m_Value: 0.03 + depthComparisonExtent: + m_OverrideState: 0 + m_Value: 1 + m_SampleCount: + m_OverrideState: 1 + m_Value: 8 +--- !u!114 &-6026464391438864705 +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: 7a7ff42a8c5be6646ad3975f3a54c1eb, type: 3} + m_Name: DiffusionProfileList + m_EditorClassIdentifier: + active: 1 + diffusionProfiles: + m_OverrideState: 1 + m_Value: + - {fileID: 11400000, guid: 404820c4cf36ad944862fa59c56064f0, type: 2} + - {fileID: 11400000, guid: 2384dbf2c1c420f45a792fbc315fbfb1, type: 2} +--- !u!114 &-1016694868962581565 +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: 56b145d2b9ee1ac4f846968484e7485a, type: 3} + m_Name: ContactShadows + m_EditorClassIdentifier: + active: 1 + quality: + m_OverrideState: 0 + m_Value: 1 + enable: + m_OverrideState: 1 + m_Value: 1 + length: + m_OverrideState: 0 + m_Value: 0.15 + opacity: + m_OverrideState: 0 + m_Value: 1 + distanceScaleFactor: + m_OverrideState: 0 + m_Value: 0.5 + maxDistance: + m_OverrideState: 0 + m_Value: 50 + minDistance: + m_OverrideState: 0 + m_Value: 0 + fadeDistance: + m_OverrideState: 0 + m_Value: 5 + fadeInDistance: + m_OverrideState: 0 + m_Value: 0 + rayBias: + m_OverrideState: 0 + m_Value: 0.2 + thicknessScale: + m_OverrideState: 0 + m_Value: 0.15 + m_SampleCount: + m_OverrideState: 0 + m_Value: 10 +--- !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: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: DefaultSettingsVolumeProfile + m_EditorClassIdentifier: + components: + - {fileID: 7686318427622180703} + - {fileID: -1016694868962581565} + - {fileID: 7502528774814404555} + - {fileID: 7542669330009093999} + - {fileID: 1501199423866068322} + - {fileID: 5315503232242033309} + - {fileID: 1932259527246508038} + - {fileID: 448115243408767295} + - {fileID: -7089757308646879465} + - {fileID: -8770122170507510650} + - {fileID: 4981354747274665315} + - {fileID: 5305602202033311358} + - {fileID: 2138017992340590289} +--- !u!114 &448115243408767295 +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: 59b6606ef2548734bb6d11b9d160bc7e, type: 3} + m_Name: HDRISky + m_EditorClassIdentifier: + active: 1 + rotation: + m_OverrideState: 0 + m_Value: 0 + skyIntensityMode: + m_OverrideState: 0 + m_Value: 0 + exposure: + m_OverrideState: 1 + m_Value: 11 + multiplier: + m_OverrideState: 0 + m_Value: 1 + upperHemisphereLuxValue: + m_OverrideState: 1 + m_Value: 0.4660715 + upperHemisphereLuxColor: + m_OverrideState: 1 + m_Value: {x: 0.18750614, y: 0.29181972, z: 0.5} + desiredLuxValue: + m_OverrideState: 0 + m_Value: 20000 + updateMode: + m_OverrideState: 0 + m_Value: 0 + updatePeriod: + m_OverrideState: 0 + m_Value: 0 + includeSunInBaking: + m_OverrideState: 0 + m_Value: 0 + hdriSky: + m_OverrideState: 1 + m_Value: {fileID: 8900000, guid: 8253d41e6e8b11a4cbe77a4f8f82934d, type: 3} + distortionMode: + m_OverrideState: 0 + m_Value: 0 + flowmap: + m_OverrideState: 0 + m_Value: {fileID: 0} + upperHemisphereOnly: + m_OverrideState: 0 + m_Value: 1 + scrollOrientation: + m_OverrideState: 0 + m_Value: + mode: 1 + customValue: 0 + additiveValue: 0 + multiplyValue: 1 + scrollSpeed: + m_OverrideState: 0 + m_Value: + mode: 1 + customValue: 100 + additiveValue: 0 + multiplyValue: 1 + sunInitialRotation: + m_OverrideState: 0 + m_Value: -Infinity + lockSun: + m_OverrideState: 0 + m_Value: 0 + enableBackplate: + m_OverrideState: 0 + m_Value: 0 + backplateType: + m_OverrideState: 0 + m_Value: 0 + groundLevel: + m_OverrideState: 0 + m_Value: 0 + scale: + m_OverrideState: 0 + m_Value: {x: 32, y: 32} + projectionDistance: + m_OverrideState: 0 + m_Value: 16 + plateRotation: + m_OverrideState: 0 + m_Value: 0 + plateTexRotation: + m_OverrideState: 0 + m_Value: 0 + plateTexOffset: + m_OverrideState: 0 + m_Value: {x: 0, y: 0} + blendAmount: + m_OverrideState: 0 + m_Value: 0 + shadowTint: + m_OverrideState: 0 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + pointLightShadow: + m_OverrideState: 0 + m_Value: 0 + dirLightShadow: + m_OverrideState: 0 + m_Value: 0 + rectLightShadow: + m_OverrideState: 0 + m_Value: 0 + m_SkyVersion: 1 + enableDistortion: + m_OverrideState: 0 + m_Value: 0 + procedural: + m_OverrideState: 0 + m_Value: 1 + scrollDirection: + m_OverrideState: 0 + m_Value: 0 + m_ObsoleteScrollSpeed: + m_OverrideState: 0 + m_Value: 1 +--- !u!114 &1501199423866068322 +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: 24f077503be6ae942a1e1245dbd53ea9, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + quality: + m_OverrideState: 1 + m_Value: 1 + threshold: + m_OverrideState: 0 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0.2 + scatter: + m_OverrideState: 0 + m_Value: 0.7 + tint: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + dirtTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + dirtIntensity: + m_OverrideState: 0 + m_Value: 0 + anamorphic: + m_OverrideState: 0 + m_Value: 1 + m_Resolution: + m_OverrideState: 1 + m_Value: 2 + m_HighQualityPrefiltering: + m_OverrideState: 1 + m_Value: 0 + m_HighQualityFiltering: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &1932259527246508038 +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: 0d7593b3a9277ac4696b20006c21dde2, type: 3} + m_Name: VisualEnvironment + m_EditorClassIdentifier: + active: 1 + skyType: + m_OverrideState: 1 + m_Value: 1 + cloudType: + m_OverrideState: 0 + m_Value: 0 + skyAmbientMode: + m_OverrideState: 0 + m_Value: 0 + planetRadius: + m_OverrideState: 0 + m_Value: 6378.1 + renderingSpace: + m_OverrideState: 0 + m_Value: 0 + centerMode: + m_OverrideState: 0 + m_Value: 0 + planetCenter: + m_OverrideState: 0 + m_Value: {x: 0, y: -6378.1, z: 0} + windOrientation: + m_OverrideState: 0 + m_Value: 0 + windSpeed: + m_OverrideState: 0 + m_Value: 100 + fogType: + m_OverrideState: 0 + m_Value: 0 + m_Version: 1 +--- !u!114 &2138017992340590289 +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: 7a7ff42a8c5be6646ad3975f3a54c1eb, type: 3} + m_Name: DiffusionProfileList + m_EditorClassIdentifier: + active: 1 + diffusionProfiles: + m_OverrideState: 1 + m_Value: + - {fileID: 11400000, guid: 404820c4cf36ad944862fa59c56064f0, type: 2} + - {fileID: 11400000, guid: 2384dbf2c1c420f45a792fbc315fbfb1, type: 2} +--- !u!114 &4981354747274665315 +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: d877ec3e844f2ca46830012e8e79319b, type: 3} + m_Name: PhysicallyBasedSky + m_EditorClassIdentifier: + active: 1 + rotation: + m_OverrideState: 0 + m_Value: 0 + skyIntensityMode: + m_OverrideState: 0 + m_Value: 0 + exposure: + m_OverrideState: 0 + m_Value: 0 + multiplier: + m_OverrideState: 0 + m_Value: 1 + upperHemisphereLuxValue: + m_OverrideState: 0 + m_Value: 1 + upperHemisphereLuxColor: + m_OverrideState: 0 + m_Value: {x: 0, y: 0, z: 0} + desiredLuxValue: + m_OverrideState: 0 + m_Value: 20000 + updateMode: + m_OverrideState: 0 + m_Value: 0 + updatePeriod: + m_OverrideState: 0 + m_Value: 0 + includeSunInBaking: + m_OverrideState: 0 + m_Value: 0 + type: + m_OverrideState: 0 + m_Value: 1 + atmosphericScattering: + m_OverrideState: 0 + m_Value: 1 + renderingMode: + m_OverrideState: 0 + m_Value: 0 + material: + m_OverrideState: 1 + m_Value: {fileID: -876546973899608171, guid: 02532cbb810fb404db49da84f1efe41e, type: 3} + airDensityR: + m_OverrideState: 0 + m_Value: 0.04534 + airDensityG: + m_OverrideState: 0 + m_Value: 0.10237241 + airDensityB: + m_OverrideState: 0 + m_Value: 0.23264056 + airTint: + m_OverrideState: 0 + m_Value: {r: 0.9, g: 0.9, b: 1, a: 1} + airMaximumAltitude: + m_OverrideState: 0 + m_Value: 55261.973 + aerosolDensity: + m_OverrideState: 0 + m_Value: 0.01192826 + aerosolTint: + m_OverrideState: 0 + m_Value: {r: 0.9, g: 0.9, b: 0.9, a: 1} + aerosolMaximumAltitude: + m_OverrideState: 0 + m_Value: 8289.296 + aerosolAnisotropy: + m_OverrideState: 0 + m_Value: 0.8 + ozoneDensityDimmer: + m_OverrideState: 0 + m_Value: 1 + ozoneMinimumAltitude: + m_OverrideState: 0 + m_Value: 10000 + ozoneLayerWidth: + m_OverrideState: 0 + m_Value: 30000 + groundTint: + m_OverrideState: 0 + m_Value: {r: 0.12156863, g: 0.105882354, b: 0.09411765, a: 1} + groundColorTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + groundEmissionTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + groundEmissionMultiplier: + m_OverrideState: 0 + m_Value: 1 + planetRotation: + m_OverrideState: 0 + m_Value: {x: 0, y: 0, z: 0} + spaceEmissionTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + spaceEmissionMultiplier: + m_OverrideState: 0 + m_Value: 1 + spaceRotation: + m_OverrideState: 0 + m_Value: {x: 0, y: 0, z: 0} + colorSaturation: + m_OverrideState: 0 + m_Value: 1 + alphaSaturation: + m_OverrideState: 0 + m_Value: 1 + alphaMultiplier: + m_OverrideState: 0 + m_Value: 1 + horizonTint: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + zenithTint: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + horizonZenithShift: + m_OverrideState: 0 + m_Value: 0 + m_SkyVersion: 3 + m_ObsoleteEarthPreset: + m_OverrideState: 0 + m_Value: 1 + planetaryRadius: + m_OverrideState: 0 + m_Value: 6378100 + planetCenterPosition: + m_OverrideState: 0 + m_Value: {x: 0, y: -6378100, z: 0} +--- !u!114 &5305602202033311358 +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: 8c604242b4dd4c8caa4d1944b94189e0, type: 3} + m_Name: HighQualityLineRenderingVolumeComponent + m_EditorClassIdentifier: + active: 1 + enable: + m_OverrideState: 1 + m_Value: 1 + compositionMode: + m_OverrideState: 1 + m_Value: 0 + clusterCount: + m_OverrideState: 1 + m_Value: 24 + sortingQuality: + m_OverrideState: 1 + m_Value: 1 + tileOpacityThreshold: + m_OverrideState: 1 + m_Value: 0.95 + writeDepthAlphaThreshold: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &5315503232242033309 +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: 2d08ce26990eb1a4a9177b860541e702, type: 3} + m_Name: Exposure + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 1 + meteringMode: + m_OverrideState: 0 + m_Value: 2 + luminanceSource: + m_OverrideState: 0 + m_Value: 1 + fixedExposure: + m_OverrideState: 0 + m_Value: 0 + compensation: + m_OverrideState: 0 + m_Value: 0 + limitMin: + m_OverrideState: 0 + m_Value: -10 + limitMax: + m_OverrideState: 0 + m_Value: 10 + curveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -10 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 20 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + limitMinCurveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -12 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 18 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + limitMaxCurveMap: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: -10 + value: -8 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 20 + value: 22 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + adaptationMode: + m_OverrideState: 0 + m_Value: 1 + adaptationSpeedDarkToLight: + m_OverrideState: 0 + m_Value: 3 + adaptationSpeedLightToDark: + m_OverrideState: 0 + m_Value: 1 + weightTextureMask: + m_OverrideState: 0 + m_Value: {fileID: 0} + histogramPercentages: + m_OverrideState: 0 + m_Value: {x: 40, y: 90} + histogramUseCurveRemapping: + m_OverrideState: 0 + m_Value: 0 + targetMidGray: + m_OverrideState: 0 + m_Value: 0 + centerAroundExposureTarget: + m_OverrideState: 0 + m_Value: 0 + proceduralCenter: + m_OverrideState: 0 + m_Value: {x: 0.5, y: 0.5} + proceduralRadii: + m_OverrideState: 0 + m_Value: {x: 0.3, y: 0.3} + maskMinIntensity: + m_OverrideState: 0 + m_Value: -30 + maskMaxIntensity: + m_OverrideState: 0 + m_Value: 30 + proceduralSoftness: + m_OverrideState: 0 + m_Value: 0.5 +--- !u!114 &7502528774814404555 +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: 9008a067f4d626c4d8bc4bc48f04bb89, type: 3} + m_Name: AmbientOcclusion + m_EditorClassIdentifier: + active: 1 + quality: + m_OverrideState: 0 + m_Value: 1 + rayTracing: + m_OverrideState: 0 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0.5 + directLightingStrength: + m_OverrideState: 0 + m_Value: 0 + radius: + m_OverrideState: 1 + m_Value: 1.5 + spatialBilateralAggressiveness: + m_OverrideState: 0 + m_Value: 0.15 + temporalAccumulation: + m_OverrideState: 0 + m_Value: 1 + ghostingReduction: + m_OverrideState: 0 + m_Value: 0.5 + blurSharpness: + m_OverrideState: 0 + m_Value: 0.1 + layerMask: + m_OverrideState: 0 + m_Value: + serializedVersion: 2 + m_Bits: 4294967295 + specularOcclusion: + m_OverrideState: 0 + m_Value: 0.5 + occluderMotionRejection: + m_OverrideState: 0 + m_Value: 1 + receiverMotionRejection: + m_OverrideState: 0 + m_Value: 1 + m_StepCount: + m_OverrideState: 0 + m_Value: 6 + m_FullResolution: + m_OverrideState: 0 + m_Value: 0 + m_MaximumRadiusInPixels: + m_OverrideState: 0 + m_Value: 40 + m_BilateralUpsample: + m_OverrideState: 0 + m_Value: 1 + m_DirectionCount: + m_OverrideState: 0 + m_Value: 2 + m_RayLength: + m_OverrideState: 0 + m_Value: 3 + m_SampleCount: + m_OverrideState: 0 + m_Value: 2 + m_Denoise: + m_OverrideState: 0 + m_Value: 1 + m_DenoiserRadius: + m_OverrideState: 0 + m_Value: 0.5 +--- !u!114 &7542669330009093999 +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: f086a068d4c5889438831b3ae9afc11c, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 2 + useFullACES: + m_OverrideState: 0 + m_Value: 0 + toeStrength: + m_OverrideState: 0 + m_Value: 0 + toeLength: + m_OverrideState: 0 + m_Value: 0.5 + shoulderStrength: + m_OverrideState: 0 + m_Value: 0 + shoulderLength: + m_OverrideState: 0 + m_Value: 0.5 + shoulderAngle: + m_OverrideState: 0 + m_Value: 0 + gamma: + m_OverrideState: 0 + m_Value: 1 + lutTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + lutContribution: + m_OverrideState: 0 + m_Value: 1 + neutralHDRRangeReductionMode: + m_OverrideState: 0 + m_Value: 2 + acesPreset: + m_OverrideState: 0 + m_Value: 3 + fallbackMode: + m_OverrideState: 0 + m_Value: 1 + hueShiftAmount: + m_OverrideState: 0 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 0 + m_Value: 0 + paperWhite: + m_OverrideState: 0 + m_Value: 300 + detectBrightnessLimits: + m_OverrideState: 0 + m_Value: 1 + minNits: + m_OverrideState: 0 + m_Value: 0.005 + maxNits: + m_OverrideState: 0 + m_Value: 1000 +--- !u!114 &7686318427622180703 +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: 7ddcec8a8eb2d684d833ac8f5d26aebd, type: 3} + m_Name: HDShadowSettings + m_EditorClassIdentifier: + active: 1 + interCascadeBorders: 1 + maxShadowDistance: + m_OverrideState: 1 + m_Value: 150 + directionalTransmissionMultiplier: + m_OverrideState: 0 + m_Value: 1 + cascadeShadowSplitCount: + m_OverrideState: 0 + m_Value: 4 + cascadeShadowSplit0: + m_OverrideState: 0 + m_Value: 0.05 + cascadeShadowSplit1: + m_OverrideState: 0 + m_Value: 0.15 + cascadeShadowSplit2: + m_OverrideState: 0 + m_Value: 0.3 + cascadeShadowBorder0: + m_OverrideState: 1 + m_Value: 0.06905067 + cascadeShadowBorder1: + m_OverrideState: 1 + m_Value: 0.05086228 + cascadeShadowBorder2: + m_OverrideState: 0 + m_Value: 0 + cascadeShadowBorder3: + m_OverrideState: 0 + m_Value: 0 diff --git a/Assets/Rendering/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset.meta b/Assets/Rendering/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset.meta new file mode 100644 index 00000000..0bc1f5ae --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a821dc928355c04091e259c62eaa534 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineAsset.asset b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineAsset.asset new file mode 100644 index 00000000..f6a8cc0e --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineAsset.asset @@ -0,0 +1,546 @@ +%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: 0cf1dab834d4ec34195b920ea7bbf9ec, type: 3} + m_Name: HDRenderPipelineAsset + m_EditorClassIdentifier: + m_RenderPipelineSettings: + supportShadowMask: 1 + supportSSR: 0 + supportSSRTransparent: 0 + supportSSAO: 1 + supportSSGI: 0 + supportSubsurfaceScattering: 1 + sssSampleBudget: + m_Values: 140000002800000050000000 + m_SchemaId: + m_Id: With3Levels + sssDownsampleSteps: + m_Values: 000000000000000000000000 + m_SchemaId: + m_Id: With3Levels + supportVolumetrics: 1 + supportVolumetricClouds: 0 + supportLightLayers: 0 + renderingLayerMaskBuffer: 0 + supportWater: 0 + waterSimulationResolution: 128 + supportWaterExclusion: 1 + supportWaterDecals: 1 + waterDecalAtlasSize: 1024 + maximumWaterDecalCount: 48 + waterScriptInteractionsMode: 0 + waterFullCPUSimulation: 0 + supportComputeThickness: 0 + computeThicknessResolution: 1 + computeThicknessLayerMask: + serializedVersion: 2 + m_Bits: 0 + supportDistortion: 1 + supportTransparentBackface: 1 + supportTransparentDepthPrepass: 1 + supportTransparentDepthPostpass: 1 + colorBufferFormat: 74 + supportCustomPass: 1 + customBufferFormat: 8 + supportedLitShaderMode: 2 + planarReflectionResolution: + m_Values: 000100000004000000080000 + m_SchemaId: + m_Id: With3Levels + cubeReflectionResolution: + m_Values: 800000000001000000020000 + m_SchemaId: + m_Id: With3Levels + supportDecals: 1 + supportDecalLayers: 0 + supportSurfaceGradient: 1 + decalNormalBufferHP: 0 + supportHighQualityLineRendering: 0 + highQualityLineRenderingMemoryBudget: 128 + msaaSampleCount: 1 + supportMotionVectors: 1 + supportScreenSpaceLensFlare: 1 + supportDataDrivenLensFlare: 1 + supportDitheringCrossFade: 0 + supportRuntimeAOVAPI: 0 + supportTerrainHole: 0 + lightProbeSystem: 1 + oldLightProbeSystem: 0 + probeVolumeMemoryBudget: 1024 + supportProbeVolumeGPUStreaming: 0 + supportProbeVolumeDiskStreaming: 0 + probeVolumeSHBands: 1 + supportProbeVolumeScenarios: 0 + supportProbeVolumeScenarioBlending: 1 + probeVolumeBlendingMemoryBudget: 128 + supportRayTracing: 0 + supportVFXRayTracing: 0 + supportedRayTracingMode: 3 + lightLoopSettings: + cookieAtlasSize: 2048 + cookieFormat: 74 + cookieAtlasLastValidMip: 0 + cookieTexArraySize: 1 + planarReflectionAtlasSize: 0 + reflectionProbeCacheSize: 0 + reflectionCubemapSize: 0 + maxEnvLightsOnScreen: 0 + reflectionCacheCompressed: 0 + reflectionProbeFormat: 74 + reflectionProbeTexCacheSize: 4096 + reflectionProbeTexLastValidCubeMip: 3 + reflectionProbeTexLastValidPlanarMip: 0 + reflectionProbeDecreaseResToFit: 1 + skyReflectionSize: 256 + skyLightingOverrideLayerMask: + serializedVersion: 2 + m_Bits: 0 + supportFabricConvolution: 0 + maxDirectionalLightsOnScreen: 16 + maxPunctualLightsOnScreen: 512 + maxAreaLightsOnScreen: 64 + maxCubeReflectionOnScreen: 32 + maxPlanarReflectionOnScreen: 8 + maxDecalsOnScreen: 512 + maxLightsPerClusterCell: 8 + maxLocalVolumetricFogSize: 0 + maxLocalVolumetricFogOnScreen: 256 + hdShadowInitParams: + maxShadowRequests: 128 + directionalShadowsDepthBits: 32 + punctualShadowFilteringQuality: 1 + directionalShadowFilteringQuality: 1 + areaShadowFilteringQuality: 0 + punctualLightShadowAtlas: + shadowAtlasResolution: 4096 + shadowAtlasDepthBits: 32 + useDynamicViewportRescale: 1 + areaLightShadowAtlas: + shadowAtlasResolution: 4096 + shadowAtlasDepthBits: 32 + useDynamicViewportRescale: 1 + cachedPunctualLightShadowAtlas: 2048 + cachedAreaLightShadowAtlas: 1024 + allowDirectionalMixedCachedShadows: 0 + shadowResolutionDirectional: + m_Values: 00010000000200000004000000080000 + m_SchemaId: + m_Id: With4Levels + shadowResolutionPunctual: + m_Values: 00010000000200000004000000080000 + m_SchemaId: + m_Id: With4Levels + shadowResolutionArea: + m_Values: 00010000000200000004000000080000 + m_SchemaId: + m_Id: With4Levels + maxDirectionalShadowMapResolution: 2048 + maxPunctualShadowMapResolution: 2048 + maxAreaShadowMapResolution: 2048 + supportScreenSpaceShadows: 0 + maxScreenSpaceShadowSlots: 4 + screenSpaceShadowBufferFormat: 48 + decalSettings: + drawDistance: 1000 + atlasWidth: 4096 + atlasHeight: 4096 + transparentTextureResolution: + m_Values: 000100000002000000040000 + m_SchemaId: + m_Id: With3Levels + perChannelMask: 0 + postProcessSettings: + m_LutSize: 32 + lutFormat: 48 + bufferFormat: 74 + dynamicResolutionSettings: + enabled: 0 + useMipBias: 0 + advancedUpscalersByPriority: 02 + DLSSPerfQualitySetting: 0 + DLSSInjectionPoint: 0 + TAAUInjectionPoint: 0 + STPInjectionPoint: 0 + defaultInjectionPoint: 2 + DLSSUseOptimalSettings: 1 + DLSSSharpness: 0.5 + FSR2EnableSharpness: 0 + FSR2Sharpness: 0 + FSR2UseOptimalSettings: 0 + FSR2QualitySetting: 0 + FSR2InjectionPoint: 0 + fsrOverrideSharpness: 0 + fsrSharpness: 0.92 + maxPercentage: 100 + minPercentage: 100 + dynResType: 1 + upsampleFilter: 1 + forceResolution: 0 + forcedPercentage: 100 + lowResTransparencyMinimumThreshold: 0 + rayTracingHalfResThreshold: 50 + lowResSSGIMinimumThreshold: 0 + lowResVolumetricCloudsMinimumThreshold: 50 + enableDLSS: 0 + lowresTransparentSettings: + enabled: 1 + checkerboardDepthBuffer: 1 + upsampleType: 1 + xrSettings: + singlePass: 1 + occlusionMesh: 1 + cameraJitter: 0 + allowMotionBlur: 0 + postProcessQualitySettings: + NearBlurSampleCount: 030000000500000008000000 + NearBlurMaxRadius: + - 2 + - 4 + - 7 + FarBlurSampleCount: 04000000070000000e000000 + FarBlurMaxRadius: + - 5 + - 8 + - 13 + DoFResolution: 040000000200000001000000 + DoFHighQualityFiltering: 000101 + DoFPhysicallyBased: 000000 + AdaptiveSamplingWeight: + - 0.5 + - 0.75 + - 2 + LimitManualRangeNearBlur: 000000 + MotionBlurSampleCount: 04000000080000000c000000 + BloomRes: 040000000200000002000000 + BloomHighQualityFiltering: 000101 + BloomHighQualityPrefiltering: 000001 + ChromaticAberrationMaxSamples: 03000000060000000c000000 + lightSettings: + useContactShadow: + m_Values: 000001 + m_SchemaId: + m_Id: With3Levels + maximumLODLevel: + m_Values: 000000000000000000000000 + m_SchemaId: + m_Id: With3Levels + lodBias: + m_Values: + - 1 + - 1 + - 1 + m_SchemaId: + m_Id: With3Levels + lightingQualitySettings: + AOStepCount: 040000000600000010000000 + AOFullRes: 000001 + AOMaximumRadiusPixels: 200000002800000050000000 + AOBilateralUpsample: 000101 + AODirectionCount: 010000000200000004000000 + ContactShadowSampleCount: 060000000a00000010000000 + SSRMaxRaySteps: 100000002000000040000000 + SSGIRaySteps: 200000004000000080000000 + SSGIDenoise: 010101 + SSGIHalfResDenoise: 010000 + SSGIDenoiserRadius: + - 0.75 + - 0.5 + - 0.5 + SSGISecondDenoise: 010101 + RTAORayLength: + - 0.5 + - 3 + - 20 + RTAOSampleCount: 010000000200000008000000 + RTAODenoise: 010101 + RTAODenoiserRadius: + - 0.25 + - 0.5 + - 0.65 + RTGIRayLength: + - 50 + - 50 + - 50 + RTGIFullResolution: 000001 + RTGIRaySteps: 200000003000000040000000 + RTGIDenoise: 010101 + RTGIHalfResDenoise: 010000 + RTGIDenoiserRadius: + - 1 + - 1 + - 1 + RTGISecondDenoise: 010101 + RTRMinSmoothness: + - 0.6 + - 0.4 + - 0 + RTRSmoothnessFadeStart: + - 0.7 + - 0.5 + - 0 + RTRRayLength: + - 50 + - 50 + - 50 + RTRFullResolution: 000001 + RTRRayMaxIterations: 200000003000000040000000 + RTRDenoise: 010101 + RTRDenoiserRadiusDimmer: + - 0.75 + - 0.75 + - 1 + RTRDenoiserAntiFlicker: + - 1 + - 1 + - 1 + Fog_ControlMode: 000000000000000000000000 + Fog_Budget: + - 0.166 + - 0.33 + - 0.666 + Fog_DepthRatio: + - 0.666 + - 0.666 + - 0.5 + gpuResidentDrawerSettings: + mode: 0 + smallMeshScreenPercentage: 0 + enableOcclusionCullingInCameras: 0 + useDepthPrepassForOccluders: 1 + m_ObsoleteLightLayerName0: + m_ObsoleteLightLayerName1: + m_ObsoleteLightLayerName2: + m_ObsoleteLightLayerName3: + m_ObsoleteLightLayerName4: + m_ObsoleteLightLayerName5: + m_ObsoleteLightLayerName6: + m_ObsoleteLightLayerName7: + m_ObsoleteDecalLayerName0: + m_ObsoleteDecalLayerName1: + m_ObsoleteDecalLayerName2: + m_ObsoleteDecalLayerName3: + m_ObsoleteDecalLayerName4: + m_ObsoleteDecalLayerName5: + m_ObsoleteDecalLayerName6: + m_ObsoleteDecalLayerName7: + m_ObsoleteSupportRuntimeDebugDisplay: 0 + allowShaderVariantStripping: 1 + enableSRPBatcher: 1 + availableMaterialQualityLevels: -1 + m_DefaultMaterialQualityLevel: 4 + diffusionProfileSettings: {fileID: 0} + m_VolumeProfile: {fileID: 0} + virtualTexturingSettings: + streamingCpuCacheSizeInMegaBytes: 256 + streamingMipPreloadTexturesPerFrame: 0 + streamingPreloadMipCount: 1 + streamingGpuCacheSettings: + - format: 0 + sizeInMegaBytes: 128 + m_UseRenderGraph: 1 + m_CompositorCustomVolumeComponentsList: + m_InjectionPoint: 1 + m_CustomPostProcessTypesAsString: [] + m_Version: 25 + m_ObsoleteFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + m_ObsoleteBakedOrCustomReflectionFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + m_ObsoleteRealtimeReflectionFrameSettings: + overrides: 0 + enableShadow: 0 + enableContactShadows: 0 + enableShadowMask: 0 + enableSSR: 0 + enableSSAO: 0 + enableSubsurfaceScattering: 0 + enableTransmission: 0 + enableAtmosphericScattering: 0 + enableVolumetrics: 0 + enableReprojectionForVolumetrics: 0 + enableLightLayers: 0 + enableExposureControl: 1 + diffuseGlobalDimmer: 0 + specularGlobalDimmer: 0 + shaderLitMode: 0 + enableDepthPrepassWithDeferredRendering: 0 + enableTransparentPrepass: 0 + enableMotionVectors: 0 + enableObjectMotionVectors: 0 + enableDecals: 0 + enableRoughRefraction: 0 + enableTransparentPostpass: 0 + enableDistortion: 0 + enablePostprocess: 0 + enableOpaqueObjects: 0 + enableTransparentObjects: 0 + enableRealtimePlanarReflection: 0 + enableMSAA: 0 + enableAsyncCompute: 0 + runLightListAsync: 0 + runSSRAsync: 0 + runSSAOAsync: 0 + runContactShadowsAsync: 0 + runVolumeVoxelizationAsync: 0 + lightLoopSettings: + overrides: 0 + enableDeferredTileAndCluster: 0 + enableComputeLightEvaluation: 0 + enableComputeLightVariants: 0 + enableComputeMaterialVariants: 0 + enableFptlForForwardOpaque: 0 + enableBigTilePrepass: 0 + isFptlEnabled: 0 + m_ObsoleteDefaultVolumeProfile: {fileID: 0} + m_ObsoleteDefaultLookDevProfile: {fileID: 0} + m_ObsoleteFrameSettingsMovedToDefaultSettings: + bitDatas: + data1: 0 + data2: 0 + lodBias: 0 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 0 + sssCustomDownsampleSteps: 0 + msaaMode: 0 + materialQuality: 0 + m_ObsoleteBakedOrCustomReflectionFrameSettingsMovedToDefaultSettings: + bitDatas: + data1: 0 + data2: 0 + lodBias: 0 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 0 + sssCustomDownsampleSteps: 0 + msaaMode: 0 + materialQuality: 0 + m_ObsoleteRealtimeReflectionFrameSettingsMovedToDefaultSettings: + bitDatas: + data1: 0 + data2: 0 + lodBias: 0 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 0 + sssCustomDownsampleSteps: 0 + msaaMode: 0 + materialQuality: 0 + m_ObsoleteBeforeTransparentCustomPostProcesses: [] + m_ObsoleteBeforePostProcessCustomPostProcesses: [] + m_ObsoleteAfterPostProcessCustomPostProcesses: [] + m_ObsoleteBeforeTAACustomPostProcesses: [] + m_ObsoleteShaderVariantLogLevel: 0 + m_ObsoleteLensAttenuation: 0 + m_ObsoleteDiffusionProfileSettingsList: [] + m_PrefilterUseLegacyLightmaps: 0 diff --git a/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta new file mode 100644 index 00000000..51ef9d35 --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineAsset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dbb49b2436f43c6418efe37545e99ed8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset new file mode 100644 index 00000000..dc8f4657 --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset @@ -0,0 +1,99 @@ +%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: 781cc897cf8675041a751163b51f97dd, type: 3} + m_Name: HDRenderPipelineGlobalSettings + m_EditorClassIdentifier: + m_DefaultVolumeProfile: {fileID: 0} + m_LookDevVolumeProfile: {fileID: 0} + m_RenderingPathDefaultCameraFrameSettings: + bitDatas: + data1: 72198260625768269 + data2: 13763000477350330392 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + m_RenderingPathDefaultBakedOrCustomReflectionFrameSettings: + bitDatas: + data1: 135310754214733 + data2: 4539628428684460056 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + m_RenderingPathDefaultRealtimeReflectionFrameSettings: + bitDatas: + data1: 139923391782733 + data2: 13763000465807638544 + lodBias: 1 + lodBiasMode: 0 + lodBiasQualityLevel: 0 + maximumLODLevel: 0 + maximumLODLevelMode: 0 + maximumLODLevelQualityLevel: 0 + sssQualityMode: 0 + sssQualityLevel: 0 + sssCustomSampleBudget: 20 + msaaMode: 1 + materialQuality: 0 + m_RenderPipelineResources: {fileID: 0} + m_RenderPipelineRayTracingResources: {fileID: 0} + beforeTransparentCustomPostProcesses: [] + beforePostProcessCustomPostProcesses: [] + afterPostProcessBlursCustomPostProcesses: [] + afterPostProcessCustomPostProcesses: [] + beforeTAACustomPostProcesses: [] + lightLayerName0: + lightLayerName1: + lightLayerName2: + lightLayerName3: + lightLayerName4: + lightLayerName5: + lightLayerName6: + lightLayerName7: + decalLayerName0: + decalLayerName1: + decalLayerName2: + decalLayerName3: + decalLayerName4: + decalLayerName5: + decalLayerName6: + decalLayerName7: + shaderVariantLogLevel: 0 + lensAttenuationMode: 0 + diffusionProfileSettingsList: [] + rendererListCulling: 0 + DLSSProjectId: 000000 + useDLSSCustomProjectId: 0 + supportProbeVolumes: 0 + supportRuntimeDebugDisplay: 0 + apvScenesData: + serializedBounds: [] + serializedHasVolumes: [] + serializedProfiles: [] + serializedBakeSettings: [] + serializedBakingSets: [] + m_Version: 14 diff --git a/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset.meta b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset.meta new file mode 100644 index 00000000..a2994cfe --- /dev/null +++ b/Assets/Rendering/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c116788356e21a4888de895681c22f7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/URPDefaultResources.meta b/Assets/Rendering/URPDefaultResources.meta new file mode 100644 index 00000000..46cf87ce --- /dev/null +++ b/Assets/Rendering/URPDefaultResources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8f7a732fa44faff4da0cf4cd0fcec93b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset.asset b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset.asset new file mode 100644 index 00000000..ea2f5985 --- /dev/null +++ b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset.asset @@ -0,0 +1,136 @@ +%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: bf2edee5c58d82540a51f03df9d42094, type: 3} + m_Name: Universal Render Pipeline Asset + m_EditorClassIdentifier: + k_AssetVersion: 12 + k_AssetPreviousVersion: 12 + m_RendererType: 1 + m_RendererData: {fileID: 0} + m_RendererDataList: + - {fileID: 11400000, guid: 0600760c4b35037429aba9ee18c4d6f9, type: 2} + m_DefaultRendererIndex: 0 + m_RequireDepthTexture: 0 + m_RequireOpaqueTexture: 0 + m_OpaqueDownsampling: 1 + m_SupportsTerrainHoles: 1 + m_SupportsHDR: 1 + m_HDRColorBufferPrecision: 0 + m_MSAA: 1 + m_RenderScale: 1 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 + m_MainLightRenderingMode: 1 + m_MainLightShadowsSupported: 1 + m_MainLightShadowmapResolution: 2048 + m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightShadowsSupported: 0 + m_AdditionalLightsShadowmapResolution: 2048 + m_AdditionalLightsShadowResolutionTierLow: 256 + m_AdditionalLightsShadowResolutionTierMedium: 512 + m_AdditionalLightsShadowResolutionTierHigh: 1024 + m_ReflectionProbeBlending: 0 + m_ReflectionProbeBoxProjection: 0 + m_ShadowDistance: 50 + m_ShadowCascadeCount: 1 + m_Cascade2Split: 0.25 + m_Cascade3Split: {x: 0.1, y: 0.3} + m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467} + m_CascadeBorder: 0.2 + m_ShadowDepthBias: 1 + m_ShadowNormalBias: 1 + m_AnyShadowsSupported: 1 + m_SoftShadowsSupported: 0 + m_ConservativeEnclosingSphere: 1 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 2 + m_AdditionalLightsCookieResolution: 2048 + m_AdditionalLightsCookieFormat: 3 + m_UseSRPBatcher: 1 + m_SupportsDynamicBatching: 0 + m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 0 + m_DebugLevel: 0 + m_StoreActionsOptimization: 0 + m_UseAdaptivePerformance: 1 + m_ColorGradingMode: 0 + m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 + m_UseFastSRGBLinearConversion: 0 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 0 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 + m_ShadowType: 1 + m_LocalShadowsSupported: 0 + m_LocalShadowsAtlasResolution: 256 + m_MaxPixelLights: 0 + m_ShadowAtlasResolution: 256 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 0} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 1 + m_PrefilteringModeAdditionalLight: 4 + m_PrefilteringModeAdditionalLightShadows: 1 + m_PrefilterXRKeywords: 0 + m_PrefilteringModeForwardPlus: 1 + m_PrefilteringModeDeferredRendering: 1 + m_PrefilteringModeScreenSpaceOcclusion: 1 + m_PrefilterDebugKeywords: 0 + m_PrefilterWriteRenderingLayers: 0 + m_PrefilterHDROutput: 0 + m_PrefilterAlphaOutput: 0 + m_PrefilterSSAODepthNormals: 0 + m_PrefilterSSAOSourceDepthLow: 0 + m_PrefilterSSAOSourceDepthMedium: 0 + m_PrefilterSSAOSourceDepthHigh: 0 + m_PrefilterSSAOInterleaved: 0 + m_PrefilterSSAOBlueNoise: 0 + m_PrefilterSSAOSampleCountLow: 0 + m_PrefilterSSAOSampleCountMedium: 0 + m_PrefilterSSAOSampleCountHigh: 0 + m_PrefilterDBufferMRT1: 0 + m_PrefilterDBufferMRT2: 0 + m_PrefilterDBufferMRT3: 0 + m_PrefilterSoftShadowsQualityLow: 0 + m_PrefilterSoftShadowsQualityMedium: 0 + m_PrefilterSoftShadowsQualityHigh: 0 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 0 + m_PrefilterNativeRenderPass: 0 + m_PrefilterUseLegacyLightmaps: 0 + m_ShaderVariantLogLevel: 0 + m_ShadowCascades: 0 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset.asset.meta b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset.asset.meta new file mode 100644 index 00000000..968c3c6f --- /dev/null +++ b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a35a2104d5d876648b58b2603fb8c1c8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset_Renderer.asset b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset_Renderer.asset new file mode 100644 index 00000000..f031e215 --- /dev/null +++ b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset_Renderer.asset @@ -0,0 +1,53 @@ +%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: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + m_Name: Universal Render Pipeline Asset_Renderer + m_EditorClassIdentifier: + debugShaders: + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 0} + probeVolumeFragmentationDebugShader: {fileID: 0} + probeVolumeOffsetDebugShader: {fileID: 0} + probeVolumeSamplingDebugShader: {fileID: 0} + probeSamplingDebugMesh: {fileID: 0} + probeSamplingDebugTexture: {fileID: 0} + probeVolumeBlendStatesCS: {fileID: 0} + m_RendererFeatures: [] + m_RendererFeatureMap: + m_UseNativeRenderPass: 0 + xrSystemData: {fileID: 0} + postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + m_AssetVersion: 2 + m_OpaqueLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparentLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_DefaultStencilState: + overrideStencilState: 0 + stencilReference: 0 + stencilCompareFunction: 8 + passOperation: 2 + failOperation: 0 + zFailOperation: 0 + m_ShadowTransparentReceive: 1 + m_RenderingMode: 0 + m_DepthPrimingMode: 0 + m_CopyDepthMode: 1 + m_DepthAttachmentFormat: 0 + m_DepthTextureFormat: 0 + m_AccurateGbufferNormals: 0 + m_IntermediateTextureMode: 1 diff --git a/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset_Renderer.asset.meta b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset_Renderer.asset.meta new file mode 100644 index 00000000..66775445 --- /dev/null +++ b/Assets/Rendering/URPDefaultResources/Universal Render Pipeline Asset_Renderer.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0600760c4b35037429aba9ee18c4d6f9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Rendering/URPDefaultResources/UniversalRenderPipelineGlobalSettings.asset b/Assets/Rendering/URPDefaultResources/UniversalRenderPipelineGlobalSettings.asset new file mode 100644 index 00000000..64f0f206 --- /dev/null +++ b/Assets/Rendering/URPDefaultResources/UniversalRenderPipelineGlobalSettings.asset @@ -0,0 +1,257 @@ +%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: 2ec995e51a6e251468d2a3fd8a686257, type: 3} + m_Name: UniversalRenderPipelineGlobalSettings + m_EditorClassIdentifier: + m_ShaderStrippingSetting: + m_Version: 0 + m_ExportShaderVariants: 1 + m_ShaderVariantLogLevel: 0 + m_StripRuntimeDebugShaders: 1 + m_URPShaderStrippingSetting: + m_Version: 0 + m_StripUnusedPostProcessingVariants: 0 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + m_ShaderVariantLogLevel: 0 + m_ExportShaderVariants: 1 + m_StripDebugVariants: 1 + m_StripUnusedPostProcessingVariants: 0 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + supportRuntimeDebugDisplay: 0 + m_EnableRenderGraph: 0 + m_Settings: + m_SettingsList: + m_List: + - rid: 3368384739993452891 + - rid: 3368384739993452892 + - rid: 3368384739993452893 + - rid: 3368384739993452894 + - rid: 3368384739993452895 + - rid: 3368384739993452896 + - rid: 3368384739993452897 + - rid: 3368384739993452898 + - rid: 3368384739993452899 + - rid: 3368384739993452900 + - rid: 3368384739993452901 + - rid: 3368384739993452902 + - rid: 3368384739993452903 + - rid: 3368384739993452904 + - rid: 3368384739993452905 + - rid: 3368384739993452906 + - rid: 3368384739993452907 + - rid: 3368384739993452908 + - rid: 3368384739993452909 + - rid: 3368384739993452910 + - rid: 3368384739993452911 + - rid: 3368384739993452912 + m_RuntimeSettings: + m_List: [] + m_AssetVersion: 8 + m_ObsoleteDefaultVolumeProfile: {fileID: 0} + m_RenderingLayerNames: + - Default + m_ValidRenderingLayers: 0 + lightLayerName0: + lightLayerName1: + lightLayerName2: + lightLayerName3: + lightLayerName4: + lightLayerName5: + lightLayerName6: + lightLayerName7: + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + references: + version: 2 + RefIds: + - rid: 3368384739993452891 + type: {class: UniversalRenderPipelineEditorAssets, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultSettingsVolumeProfile: {fileID: 11400000, guid: eda47df5b85f4f249abf7abd73db2cb2, type: 2} + - rid: 3368384739993452892 + type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} + m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} + m_DefaultSpriteMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} + - rid: 3368384739993452893 + type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 1 + m_BlueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + m_BayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} + m_DebugFontTex: {fileID: 2800000, guid: 26a413214480ef144b2915d6ff4d0beb, type: 3} + - rid: 3368384739993452894 + type: {class: UniversalRenderPipelineDebugShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DebugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} + m_HdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + m_ProbeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} + - rid: 3368384739993452895 + type: {class: UniversalRenderPipelineRuntimeShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_FallbackErrorShader: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} + m_BlitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} + m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} + m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3} + m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} + m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} + m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} + m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + - rid: 3368384739993452896 + type: {class: UniversalRenderPipelineRuntimeXRResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_xrOcclusionMeshPS: {fileID: 4800000, guid: 4431b1f1f743fbf4eb310a967890cbea, type: 3} + m_xrMirrorViewPS: {fileID: 4800000, guid: d5a307c014552314b9f560906d708772, type: 3} + m_xrMotionVector: {fileID: 4800000, guid: f89aac1e4f84468418fe30e611dff395, type: 3} + - rid: 3368384739993452897 + type: {class: URPDefaultVolumeProfileSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_VolumeProfile: {fileID: 11400000, guid: 7641b16591813c8478df3d5724c50315, type: 2} + - rid: 3368384739993452898 + type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3} + m_AutodeskInteractiveTransparent: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3} + m_AutodeskInteractiveMasked: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3} + m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} + m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} + m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3} + m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3} + m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3} + - rid: 3368384739993452899 + type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_EnableRenderCompatibilityMode: 0 + - rid: 3368384739993452900 + type: {class: UniversalRendererResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + m_CameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3} + m_StencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} + m_DBufferClear: {fileID: 4800000, guid: f056d8bd2a1c7e44e9729144b4c70395, type: 3} + - rid: 3368384739993452901 + type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_StripUnusedPostProcessingVariants: 0 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + - rid: 3368384739993452902 + type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_LightShader: {fileID: 4800000, guid: 3f6c848ca3d7bca4bbe846546ac701a1, type: 3} + m_ProjectedShadowShader: {fileID: 4800000, guid: ce09d4a80b88c5a4eb9768fab4f1ee00, type: 3} + m_SpriteShadowShader: {fileID: 4800000, guid: 44fc62292b65ab04eabcf310e799ccf6, type: 3} + m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3} + m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3} + m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3} + m_FallOffLookup: {fileID: 2800000, guid: 5688ab254e4c0634f8d6c8e0792331ca, type: 3} + m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} + m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} + - rid: 3368384739993452903 + type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} + data: + m_Version: 0 + m_InstanceDataBufferCopyKernels: {fileID: 7200000, guid: f984aeb540ded8b4fbb8a2047ab5b2e2, type: 3} + m_InstanceDataBufferUploadKernels: {fileID: 7200000, guid: 53864816eb00f2343b60e1a2c5a262ef, type: 3} + m_TransformUpdaterKernels: {fileID: 7200000, guid: 2a567b9b2733f8d47a700c3c85bed75b, type: 3} + m_WindDataUpdaterKernels: {fileID: 7200000, guid: fde76746e4fd0ed418c224f6b4084114, type: 3} + m_OccluderDepthPyramidKernels: {fileID: 7200000, guid: 08b2b5fb307b0d249860612774a987da, type: 3} + m_InstanceOcclusionCullingKernels: {fileID: 7200000, guid: f6d223acabc2f974795a5a7864b50e6c, type: 3} + m_OcclusionCullingDebugKernels: {fileID: 7200000, guid: b23e766bcf50ca4438ef186b174557df, type: 3} + m_DebugOcclusionTestPS: {fileID: 4800000, guid: d3f0849180c2d0944bc71060693df100, type: 3} + m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3} + - rid: 3368384739993452904 + type: {class: RenderGraphGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_EnableCompilationCaching: 1 + m_EnableValidityChecks: 1 + - rid: 3368384739993452905 + type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + probeVolumeBlendStatesCS: {fileID: 7200000, guid: a3f7b8c99de28a94684cb1daebeccf5d, type: 3} + probeVolumeUploadDataCS: {fileID: 7200000, guid: 0951de5992461754fa73650732c4954c, type: 3} + probeVolumeUploadDataL2CS: {fileID: 7200000, guid: 6196f34ed825db14b81fb3eb0ea8d931, type: 3} + - rid: 3368384739993452906 + type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_IncludeReferencedInScenes: 0 + m_IncludeAssetsByLabel: 0 + m_LabelToInclude: + - rid: 3368384739993452907 + type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + dilationShader: {fileID: 7200000, guid: 6bb382f7de370af41b775f54182e491d, type: 3} + subdivideSceneCS: {fileID: 7200000, guid: bb86f1f0af829fd45b2ebddda1245c22, type: 3} + voxelizeSceneShader: {fileID: 4800000, guid: c8b6a681c7b4e2e4785ffab093907f9e, type: 3} + traceVirtualOffsetCS: {fileID: -6772857160820960102, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} + traceVirtualOffsetRT: {fileID: -5126288278712620388, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} + skyOcclusionCS: {fileID: -6772857160820960102, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} + skyOcclusionRT: {fileID: -5126288278712620388, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} + renderingLayerCS: {fileID: -6772857160820960102, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} + renderingLayerRT: {fileID: -5126288278712620388, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} + - rid: 3368384739993452908 + type: {class: RenderGraphUtilsResources, ns: UnityEngine.Rendering.RenderGraphModule.Util, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 0 + m_CoreCopyPS: {fileID: 4800000, guid: 12dc59547ea167a4ab435097dd0f9add, type: 3} + - rid: 3368384739993452909 + type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + probeVolumeDebugShader: {fileID: 4800000, guid: 3b21275fd12d65f49babb5286f040f2d, type: 3} + probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 3a80877c579b9144ebdcc6d923bca303, type: 3} + probeVolumeSamplingDebugShader: {fileID: 4800000, guid: bf54e6528c79a224e96346799064c393, type: 3} + probeVolumeOffsetDebugShader: {fileID: 4800000, guid: db8bd7436dc2c5f4c92655307d198381, type: 3} + probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 20be25aac4e22ee49a7db76fb3df6de2, type: 3} + numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3} + - rid: 3368384739993452910 + type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + m_ProbeVolumeDisableStreamingAssets: 0 + - rid: 3368384739993452911 + type: {class: ShaderStrippingSetting, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 0 + m_ExportShaderVariants: 1 + m_ShaderVariantLogLevel: 0 + m_StripRuntimeDebugShaders: 1 + - rid: 3368384739993452912 + type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3} + m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3} + m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3} diff --git a/Assets/Rendering/URPDefaultResources/UniversalRenderPipelineGlobalSettings.asset.meta b/Assets/Rendering/URPDefaultResources/UniversalRenderPipelineGlobalSettings.asset.meta new file mode 100644 index 00000000..f6c6d3cb --- /dev/null +++ b/Assets/Rendering/URPDefaultResources/UniversalRenderPipelineGlobalSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ec72006901959cd4791a67f23cef8143 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ScriptTemplates/71-My Scripts__Game Objects__Mono Behaviour-NewBehaviourScript.cs.txt b/Assets/ScriptTemplates/71-My Scripts__Game Objects__Mono Behaviour-NewBehaviourScript.cs.txt deleted file mode 100644 index 12dcde0c..00000000 --- a/Assets/ScriptTemplates/71-My Scripts__Game Objects__Mono Behaviour-NewBehaviourScript.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using UnityEngine; - -#NAMESPACE#public class #SCRIPTNAME# : MonoBehaviour -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/72-My Scripts__Game Objects__Scriptable Object-NewScriptableObject.cs.txt b/Assets/ScriptTemplates/72-My Scripts__Game Objects__Scriptable Object-NewScriptableObject.cs.txt deleted file mode 100644 index 6084fbf0..00000000 --- a/Assets/ScriptTemplates/72-My Scripts__Game Objects__Scriptable Object-NewScriptableObject.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using UnityEngine; - -#NAMESPACE#public class #SCRIPTNAME# : ScriptableObject -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/73-My Scripts__Entities__System-NewSystem.cs.txt b/Assets/ScriptTemplates/73-My Scripts__Entities__System-NewSystem.cs.txt deleted file mode 100644 index 54cfb4c6..00000000 --- a/Assets/ScriptTemplates/73-My Scripts__Entities__System-NewSystem.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using Unity.Entities; - -#NAMESPACE#public partial struct #SCRIPTNAME# : ISystem -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/74-My Scripts__Entities__Component-NewComponent.cs.txt b/Assets/ScriptTemplates/74-My Scripts__Entities__Component-NewComponent.cs.txt deleted file mode 100644 index 2b991428..00000000 --- a/Assets/ScriptTemplates/74-My Scripts__Entities__Component-NewComponent.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using Unity.Entities; - -#NAMESPACE#public struct #SCRIPTNAME# : IComponentData -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/75-My Scripts__Entities__Authoring-NewAuthoring.cs.txt b/Assets/ScriptTemplates/75-My Scripts__Entities__Authoring-NewAuthoring.cs.txt deleted file mode 100644 index 8779d504..00000000 --- a/Assets/ScriptTemplates/75-My Scripts__Entities__Authoring-NewAuthoring.cs.txt +++ /dev/null @@ -1,13 +0,0 @@ -#SIGNATURE#using Unity.Entities; -using UnityEngine; - -#NAMESPACE#public class #SCRIPTNAME# : MonoBehaviour -{ - public class #SCRIPTNAME#Baker : Baker<#SCRIPTNAME#> - { - public override void Bake(#SCRIPTNAME# authoring) - { - - } - } -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/75-My Scripts__Entities__Authoring-NewAuthoring.cs.txt.meta b/Assets/ScriptTemplates/75-My Scripts__Entities__Authoring-NewAuthoring.cs.txt.meta deleted file mode 100644 index 626b43cc..00000000 --- a/Assets/ScriptTemplates/75-My Scripts__Entities__Authoring-NewAuthoring.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c16f4ba42ae8652418e554abba5799c5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ScriptTemplates/76-My Scripts__Entities__Managed System-NewManagedSystem.cs.txt b/Assets/ScriptTemplates/76-My Scripts__Entities__Managed System-NewManagedSystem.cs.txt deleted file mode 100644 index 50cc1655..00000000 --- a/Assets/ScriptTemplates/76-My Scripts__Entities__Managed System-NewManagedSystem.cs.txt +++ /dev/null @@ -1,9 +0,0 @@ -#SIGNATURE#using Unity.Entities; - -#NAMESPACE#public partial class #SCRIPTNAME# : SystemBase -{ - protected override void OnUpdate() - { - - } -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/76-My Scripts__Entities__Managed System-NewManagedSystem.cs.txt.meta b/Assets/ScriptTemplates/76-My Scripts__Entities__Managed System-NewManagedSystem.cs.txt.meta deleted file mode 100644 index 9faa2835..00000000 --- a/Assets/ScriptTemplates/76-My Scripts__Entities__Managed System-NewManagedSystem.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 6107209ebc8b1334facd61fd39f5092d -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ScriptTemplates/77-My Scripts__Entities__Managed Component-NewManagedComponent.cs.txt b/Assets/ScriptTemplates/77-My Scripts__Entities__Managed Component-NewManagedComponent.cs.txt deleted file mode 100644 index 8468b2fa..00000000 --- a/Assets/ScriptTemplates/77-My Scripts__Entities__Managed Component-NewManagedComponent.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using Unity.Entities; - -#NAMESPACE#public class #SCRIPTNAME# : IComponentData -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/77-My Scripts__Entities__Managed Component-NewManagedComponent.cs.txt.meta b/Assets/ScriptTemplates/77-My Scripts__Entities__Managed Component-NewManagedComponent.cs.txt.meta deleted file mode 100644 index 72e14a60..00000000 --- a/Assets/ScriptTemplates/77-My Scripts__Entities__Managed Component-NewManagedComponent.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 39183c0978530bf4e96d82ef04174faf -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ScriptTemplates/78-My Scripts__C# Class-NewClass.cs.txt b/Assets/ScriptTemplates/78-My Scripts__C# Class-NewClass.cs.txt deleted file mode 100644 index 07e6bc11..00000000 --- a/Assets/ScriptTemplates/78-My Scripts__C# Class-NewClass.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using System; - -#NAMESPACE#public class #SCRIPTNAME# -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/78-My Scripts__C# Class-NewClass.cs.txt.meta b/Assets/ScriptTemplates/78-My Scripts__C# Class-NewClass.cs.txt.meta deleted file mode 100644 index 5e9de06a..00000000 --- a/Assets/ScriptTemplates/78-My Scripts__C# Class-NewClass.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ffe00a2bb10cc7742a9e192ed18013f5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ScriptTemplates/79-My Scripts__C# Struct-NewStruct.cs.txt b/Assets/ScriptTemplates/79-My Scripts__C# Struct-NewStruct.cs.txt deleted file mode 100644 index b0a28198..00000000 --- a/Assets/ScriptTemplates/79-My Scripts__C# Struct-NewStruct.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using System; - -#NAMESPACE#public struct #SCRIPTNAME# -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/79-My Scripts__C# Struct-NewStruct.cs.txt.meta b/Assets/ScriptTemplates/79-My Scripts__C# Struct-NewStruct.cs.txt.meta deleted file mode 100644 index 6d45e140..00000000 --- a/Assets/ScriptTemplates/79-My Scripts__C# Struct-NewStruct.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a400a616546ede94c9ce3a74636fd176 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ScriptTemplates/80-My Scripts__C# Enum-NewEnum.cs.txt b/Assets/ScriptTemplates/80-My Scripts__C# Enum-NewEnum.cs.txt deleted file mode 100644 index b6d9f3b6..00000000 --- a/Assets/ScriptTemplates/80-My Scripts__C# Enum-NewEnum.cs.txt +++ /dev/null @@ -1,4 +0,0 @@ -#SIGNATURE##NAMESPACE#public enum #SCRIPTNAME# -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/80-My Scripts__C# Enum-NewEnum.cs.txt.meta b/Assets/ScriptTemplates/80-My Scripts__C# Enum-NewEnum.cs.txt.meta deleted file mode 100644 index e5fa4dad..00000000 --- a/Assets/ScriptTemplates/80-My Scripts__C# Enum-NewEnum.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b3293ab31ca52484784f15be48433073 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ScriptTemplates/81-My Scripts__C# Interface-NewInterface.cs.txt b/Assets/ScriptTemplates/81-My Scripts__C# Interface-NewInterface.cs.txt deleted file mode 100644 index 47c04479..00000000 --- a/Assets/ScriptTemplates/81-My Scripts__C# Interface-NewInterface.cs.txt +++ /dev/null @@ -1,6 +0,0 @@ -#SIGNATURE#using System; - -#NAMESPACE#public interface #SCRIPTNAME# -{ - -} \ No newline at end of file diff --git a/Assets/ScriptTemplates/81-My Scripts__C# Interface-NewInterface.cs.txt.meta b/Assets/ScriptTemplates/81-My Scripts__C# Interface-NewInterface.cs.txt.meta deleted file mode 100644 index 8d2a5f60..00000000 --- a/Assets/ScriptTemplates/81-My Scripts__C# Interface-NewInterface.cs.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f29d605558446ef4aa37e5ca0241a5cd -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta new file mode 100644 index 00000000..c836f9e5 --- /dev/null +++ b/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7fada4f5486aa344a348dfe4282d0d3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor.meta b/Assets/Scripts/Editor.meta new file mode 100644 index 00000000..1a0f6b6d --- /dev/null +++ b/Assets/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d8aa05c8ccefb441b81891b4fc33723 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/Editor.asmdef b/Assets/Scripts/Editor/Editor.asmdef new file mode 100644 index 00000000..72e60dfc --- /dev/null +++ b/Assets/Scripts/Editor/Editor.asmdef @@ -0,0 +1,18 @@ +{ + "name": "Editor", + "rootNamespace": "", + "references": [ + "GUID:1ef0bbeee4c5c164fadb7031fd63e223" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Scripts/Editor/Editor.asmdef.meta b/Assets/Scripts/Editor/Editor.asmdef.meta new file mode 100644 index 00000000..c604c1f5 --- /dev/null +++ b/Assets/Scripts/Editor/Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9f9cf16b14b3d0347905ab8b0f1a303e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Editor/PackageExporter.cs b/Assets/Scripts/Editor/PackageExporter.cs new file mode 100644 index 00000000..cb56d6c0 --- /dev/null +++ b/Assets/Scripts/Editor/PackageExporter.cs @@ -0,0 +1,13 @@ +using System.Linq; +using Needle.HybridPackages; +using UnityEditor; + +public static class PackageExporter +{ + public static void ExportPackage() + { + string packageName = "com.mygamedevtools.scene-loader"; + string[] guids = AssetDatabase.GetAllAssetPaths().Where(p => p.StartsWith("Packages/" + packageName + "/")).Select(p => AssetDatabase.AssetPathToGUID(p)).ToArray(); + AssetStoreToolsPatchProvider.PackagerExportPatch.ExportPackage(guids, packageName + ".unitypackage"); + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoader.cs.meta b/Assets/Scripts/Editor/PackageExporter.cs.meta similarity index 83% rename from Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoader.cs.meta rename to Assets/Scripts/Editor/PackageExporter.cs.meta index 32c3b870..a4786f44 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoader.cs.meta +++ b/Assets/Scripts/Editor/PackageExporter.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8be1d8db5fbb3ad47ac9419fc7b34a73 +guid: 4cfbd3e1010eb7f4fb1e9aab4b796286 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset index e907cc73..70c5d616 100644 --- a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset +++ b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset @@ -160,16 +160,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} m_Name: LiberationSans SDF - Fallback m_EditorClassIdentifier: - hashCode: -1699145518 - material: {fileID: 2180264} - materialHashCode: 462855346 m_Version: 1.1.0 + m_Material: {fileID: 2180264} m_SourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 - m_SourceFontFile_EditorRef: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, - type: 3} m_SourceFontFile: {fileID: 12800000, guid: e3265ab4bf004d28a9537516768c1c75, type: 3} m_AtlasPopulationMode: 1 + InternalDynamicOS: 0 m_FaceInfo: + m_FaceIndex: 0 m_FamilyName: Liberation Sans m_StyleName: Regular m_PointSize: 86 @@ -194,7 +192,7 @@ MonoBehaviour: m_AtlasTextures: - {fileID: 28268798066460806} m_AtlasTextureIndex: 0 - m_IsMultiAtlasTexturesEnabled: 0 + m_IsMultiAtlasTexturesEnabled: 1 m_ClearDynamicDataOnBuild: 1 m_UsedGlyphRects: [] m_FreeGlyphRects: @@ -233,15 +231,21 @@ MonoBehaviour: m_KerningTable: kerningPairs: [] m_FontFeatureTable: + m_MultipleSubstitutionRecords: [] + m_LigatureSubstitutionRecords: [] m_GlyphPairAdjustmentRecords: [] + m_MarkToBaseAdjustmentRecords: [] + m_MarkToMarkAdjustmentRecords: [] fallbackFontAssets: [] m_FallbackFontAssetTable: [] m_CreationSettings: sourceFontFileName: sourceFontFileGUID: e3265ab4bf004d28a9537516768c1c75 + faceIndex: 0 pointSizeSamplingMode: 0 pointSize: 86 padding: 9 + paddingMode: 0 packingMode: 4 atlasWidth: 512 atlasHeight: 512 diff --git a/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset b/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset index ceb609b2..018d42f8 100644 --- a/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset +++ b/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset @@ -3,8 +3,9 @@ --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 @@ -12,6 +13,12 @@ MonoBehaviour: m_Name: Default Style Sheet m_EditorClassIdentifier: m_StyleList: + - m_Name: Normal + m_HashCode: -1183493901 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: + m_ClosingTagArray: - m_Name: H1 m_HashCode: 2425 m_OpeningDefinition: <#40ff80>* @@ -19,19 +26,25 @@ MonoBehaviour: m_OpeningTagArray: 3c00000073000000690000007a000000650000003d00000032000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000660000006600000038000000300000003e0000002a000000 m_ClosingTagArray: 2a0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 - m_Name: Quote - m_HashCode: 92254330 + m_HashCode: 93368250 m_OpeningDefinition: m_ClosingDefinition: m_OpeningTagArray: 3c000000690000003e0000003c00000073000000690000007a000000650000003d0000003700000035000000250000003e0000003c0000006d000000610000007200000067000000690000006e0000003d0000003100000030000000250000003e000000 m_ClosingTagArray: 3c0000002f000000690000003e0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f00000077000000690000006400000074000000680000003e0000003c0000002f0000006d000000610000007200000067000000690000006e0000003e000000 + - m_Name: A + m_HashCode: 65 + m_OpeningDefinition: + m_ClosingDefinition: + m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000003400000030000000610000003000000066000000660000003e0000003c000000750000003e000000 + m_ClosingTagArray: 3c0000002f000000750000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000 - m_Name: Link - m_HashCode: 2687968 + m_HashCode: 2656128 m_OpeningDefinition: <#40a0ff> m_ClosingDefinition: m_OpeningTagArray: 3c000000750000003e0000003c000000230000003400000030000000610000003000000066000000660000003e0000003c0000006c000000690000006e0000006b0000003d0000002200000049000000440000005f0000003000000031000000220000003e000000 m_ClosingTagArray: 3c0000002f000000750000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f0000006c000000690000006e0000006b0000003e000000 - m_Name: Title - m_HashCode: 98732960 + m_HashCode: 97690656 m_OpeningDefinition: m_ClosingDefinition: m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e0000003c000000620000003e0000003c000000610000006c00000069000000670000006e0000003d00000063000000650000006e0000007400000065000000720000003e000000 diff --git a/Assets/TextMesh Pro/Resources/TMP Settings.asset b/Assets/TextMesh Pro/Resources/TMP Settings.asset index c09a92f1..edfa6c61 100644 --- a/Assets/TextMesh Pro/Resources/TMP Settings.asset +++ b/Assets/TextMesh Pro/Resources/TMP Settings.asset @@ -12,14 +12,17 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391, type: 3} m_Name: TMP Settings m_EditorClassIdentifier: - m_enableWordWrapping: 1 + assetVersion: 2 + m_TextWrappingMode: 1 m_enableKerning: 1 + m_ActiveFontFeatures: 00000000 m_enableExtraPadding: 0 m_enableTintAllSprites: 0 m_enableParseEscapeCharacters: 1 m_EnableRaycastTarget: 1 m_GetFontFeaturesAtRuntime: 1 m_missingGlyphCharacter: 0 + m_ClearDynamicDataOnBuild: 1 m_warningsDisabled: 0 m_defaultFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_defaultFontAssetPath: Fonts & Materials/ @@ -29,18 +32,18 @@ MonoBehaviour: m_defaultTextMeshProTextContainerSize: {x: 20, y: 5} m_defaultTextMeshProUITextContainerSize: {x: 200, y: 50} m_autoSizeTextContainer: 0 + m_IsTextObjectScaleStatic: 0 m_fallbackFontAssets: [] m_matchMaterialPreset: 1 - m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45, - type: 2} + m_HideSubTextObjects: 1 + m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45, type: 2} m_defaultSpriteAssetPath: Sprite Assets/ m_enableEmojiSupport: 1 m_MissingCharacterSpriteUnicode: 0 + m_EmojiFallbackTextAssets: [] m_defaultColorGradientPresetsPath: Color Gradient Presets/ - m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e, - type: 2} + m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e, type: 2} m_StyleSheetsResourcePath: m_leadingCharacters: {fileID: 4900000, guid: d82c1b31c7e74239bff1220585707d2b, type: 3} - m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b, - type: 3} + m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b, type: 3} m_UseModernHangulLineBreakingRules: 0 diff --git a/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl b/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl new file mode 100644 index 00000000..b6119946 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl @@ -0,0 +1,178 @@ +float2 UnpackUV(float uv) +{ + float2 output; + output.x = floor(uv / 4096.0); + output.y = uv - 4096.0 * output.x; + + return output * 0.001953125; +} + +float4 BlendARGB(float4 overlying, float4 underlying) +{ + overlying.rgb *= overlying.a; + underlying.rgb *= underlying.a; + float3 blended = overlying.rgb + ((1 - overlying.a) * underlying.rgb); + float alpha = underlying.a + (1 - underlying.a) * overlying.a; + return float4(blended / alpha, alpha); +} + +float3 GetSpecular(float3 n, float3 l) +{ + float spec = pow(max(0.0, dot(n, l)), _Reflectivity); + return _SpecularColor.rgb * spec * _SpecularPower; +} + +void GetSurfaceNormal_float(texture2D atlas, float textureWidth, float textureHeight, float2 uv, bool isFront, out float3 nornmal) +{ + float3 delta = float3(1.0 / textureWidth, 1.0 / textureHeight, 0.0); + + // Read "height field" + float4 h = float4( + SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv - delta.xz).a, + SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv + delta.xz).a, + SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv - delta.zy).a, + SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv + delta.zy).a); + + bool raisedBevel = _BevelType; + + h += _BevelOffset; + + float bevelWidth = max(.01, _BevelWidth); + + // Track outline + h -= .5; + h /= bevelWidth; + h = saturate(h + .5); + + if (raisedBevel) h = 1 - abs(h * 2.0 - 1.0); + h = lerp(h, sin(h * 3.141592 / 2.0), float4(_BevelRoundness, _BevelRoundness, _BevelRoundness, _BevelRoundness)); + h = min(h, 1.0 - float4(_BevelClamp, _BevelClamp, _BevelClamp, _BevelClamp)); + h *= _BevelAmount * bevelWidth * _GradientScale * -2.0; + + float3 va = normalize(float3(-1.0, 0.0, h.y - h.x)); + float3 vb = normalize(float3(0.0, 1.0, h.w - h.z)); + + float3 f = float3(1, 1, 1); + if (isFront) f = float3(1, 1, -1); + nornmal = cross(va, vb) * f; +} + +void EvaluateLight_float(float4 faceColor, float3 n, out float4 color) +{ + n.z = abs(n.z); + float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), 1.0)); + + float3 col = max(faceColor.rgb, 0) + GetSpecular(n, light)* faceColor.a; + //faceColor.rgb += col * faceColor.a; + col *= 1 - (dot(n, light) * _Diffuse); + col *= lerp(_Ambient, 1, n.z * n.z); + + //fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); + //faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; + + color = float4(col, faceColor.a); +} + +// Add custom function to handle time in HDRP + + +// +void GenerateUV_float(float2 inUV, float4 transform, float2 animSpeed, out float2 outUV) +{ + outUV = inUV * transform.xy + transform.zw + (animSpeed * _Time.y); +} + +void ComputeUVOffset_float(float texWidth, float texHeight, float2 offset, float SDR, out float2 uvOffset) +{ + uvOffset = float2(-offset.x * SDR / texWidth, -offset.y * SDR / texHeight); +} + +void ScreenSpaceRatio2_float(float4x4 projection, float4 position, float2 objectScale, float screenWidth, float screenHeight, float fontScale, out float SSR) +{ + float2 pixelSize = position.w; + pixelSize /= (objectScale * mul((float2x2)projection, float2(screenWidth, screenHeight))); + SSR = rsqrt(dot(pixelSize, pixelSize)*2) * fontScale; +} + +// UV : Texture coordinate of the source distance field texture +// TextureSize : Size of the source distance field texture +// Filter : Enable perspective filter (soften) +void ScreenSpaceRatio_float(float2 UV, float TextureSize, bool Filter, out float SSR) +{ + if(Filter) + { + float2 a = float2(ddx(UV.x), ddy(UV.x)); + float2 b = float2(ddx(UV.y), ddy(UV.y)); + float s = lerp(dot(a,a), dot(b,b), 0.5); + SSR = rsqrt(s) / TextureSize; + } + else + { + float s = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y))); + SSR = s / TextureSize; + } +} + +// SSR : Screen Space Ratio +// SD : Signed Distance (encoded : Distance / SDR + .5) +// SDR : Signed Distance Ratio +// +// IsoPerimeter : Dilate / Contract the shape +void ComputeSDF_float(float SSR, float SD, float SDR, float isoPerimeter, float softness, out float outAlpha) +{ + softness *= SSR * SDR; + float d = (SD - 0.5) * SDR; // Signed distance to edge, in Texture space + outAlpha = saturate((d * 2.0 * SSR + 0.5 + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness)); // Screen pixel coverage (alpha) +} + +void ComputeSDF2_float(float SSR, float SD, float SDR, float2 isoPerimeter, float2 softness, out float2 outAlpha) +{ + softness *= SSR * SDR; + float d = (SD - 0.5f) * SDR; + outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness)); +} + +void ComputeSDF4_float(float SSR, float SD, float SDR, float4 isoPerimeter, float4 softness, out float4 outAlpha) +{ + softness *= SSR * SDR; + float d = (SD - 0.5f) * SDR; + outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness)); +} + +void ComputeSDF44_float(float SSR, float4 SD, float SDR, float4 isoPerimeter, float4 softness, bool outline, out float4 outAlpha) +{ + softness *= SSR * SDR; + float4 d = (SD - 0.5f) * SDR; + if(outline) d.w = max(max(d.x, d.y), d.z); + outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness)); +} + +void Composite_float(float4 overlying, float4 underlying, out float4 outColor) +{ + outColor = BlendARGB(overlying, underlying); +} + +// Face only +void Layer1_float(float alpha, float4 color0, out float4 outColor) +{ + color0.a *= alpha; + outColor = color0; +} + +// Face + 1 Outline +void Layer2_float(float2 alpha, float4 color0, float4 color1, out float4 outColor) +{ + color1.a *= alpha.y; + color0.rgb *= color0.a; color1.rgb *= color1.a; + outColor = lerp(color1, color0, alpha.x); + outColor.rgb /= outColor.a; +} + +// Face + 3 Outline +void Layer4_float(float4 alpha, float4 color0, float4 color1, float4 color2, float4 color3, out float4 outColor) +{ + color3.a *= alpha.w; + color0.rgb *= color0.a; color1.rgb *= color1.a; color2.rgb *= color2.a; color3.rgb *= color3.a; + outColor = lerp(lerp(lerp(color3, color2, alpha.z), color1, alpha.y), color0, alpha.x); + outColor.rgb /= outColor.a; +} diff --git a/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl.meta b/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl.meta new file mode 100644 index 00000000..001b14e6 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 96de908384869cd409c75efa351d5edf +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader index bab2b2c6..7e0f35c3 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader @@ -1,26 +1,26 @@ Shader "TextMeshPro/Bitmap Custom Atlas" { Properties { - _MainTex ("Font Atlas", 2D) = "white" {} - _FaceTex ("Font Texture", 2D) = "white" {} - [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) - - _VertexOffsetX ("Vertex OffsetX", float) = 0 - _VertexOffsetY ("Vertex OffsetY", float) = 0 - _MaskSoftnessX ("Mask SoftnessX", float) = 0 - _MaskSoftnessY ("Mask SoftnessY", float) = 0 - - _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) - _Padding ("Padding", float) = 0 - - _StencilComp("Stencil Comparison", Float) = 8 - _Stencil("Stencil ID", Float) = 0 - _StencilOp("Stencil Operation", Float) = 0 - _StencilWriteMask("Stencil Write Mask", Float) = 255 - _StencilReadMask("Stencil Read Mask", Float) = 255 - - _CullMode("Cull Mode", Float) = 0 - _ColorMask("Color Mask", Float) = 15 + _MainTex ("Font Atlas", 2D) = "white" {} + _FaceTex ("Font Texture", 2D) = "white" {} + _FaceColor ("Text Color", Color) = (1,1,1,1) + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _Padding ("Padding", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 } SubShader{ @@ -55,15 +55,18 @@ SubShader{ #include "UnityCG.cginc" + #include "UnityUI.cginc" - struct appdata_t { + struct appdata_t + { float4 vertex : POSITION; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - struct v2f { + struct v2f + { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord0 : TEXCOORD0; @@ -81,15 +84,9 @@ SubShader{ uniform float4 _ClipRect; uniform float _MaskSoftnessX; uniform float _MaskSoftnessY; - - float2 UnpackUV(float uv) - { - float2 output; - output.x = floor(uv / 4096); - output.y = uv - 4096 * output.x; - - return output * 0.001953125; - } + uniform float _UIMaskSoftnessX; + uniform float _UIMaskSoftnessY; + uniform int _UIVertexColorAlwaysGammaSpace; v2f vert (appdata_t v) { @@ -101,6 +98,10 @@ SubShader{ float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + v.color.rgb = UIGammaToLinear(v.color.rgb); + } fixed4 faceColor = v.color; faceColor *= _FaceColor; @@ -108,13 +109,14 @@ SubShader{ OUT.vertex = vPosition; OUT.color = faceColor; OUT.texcoord0 = v.texcoord0; - OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex); + OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex); float2 pixelSize = vPosition.w; pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); // Clamp _ClipRect to 16bit. - float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); - OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); return OUT; } diff --git a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader index 006a271e..b89e2672 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader @@ -1,25 +1,25 @@ Shader "TextMeshPro/Mobile/Bitmap" { Properties { - _MainTex ("Font Atlas", 2D) = "white" {} - [HDR]_Color ("Text Color", Color) = (1,1,1,1) - _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0 + _MainTex ("Font Atlas", 2D) = "white" {} + _Color ("Text Color", Color) = (1,1,1,1) + _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0 - _VertexOffsetX("Vertex OffsetX", float) = 0 - _VertexOffsetY("Vertex OffsetY", float) = 0 - _MaskSoftnessX("Mask SoftnessX", float) = 0 - _MaskSoftnessY("Mask SoftnessY", float) = 0 + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 - _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) - _StencilComp("Stencil Comparison", Float) = 8 - _Stencil("Stencil ID", Float) = 0 - _StencilOp("Stencil Operation", Float) = 0 - _StencilWriteMask("Stencil Write Mask", Float) = 255 - _StencilReadMask("Stencil Read Mask", Float) = 255 + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 - _CullMode("Cull Mode", Float) = 0 - _ColorMask("Color Mask", Float) = 15 + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 } SubShader { @@ -55,15 +55,18 @@ SubShader { #include "UnityCG.cginc" + #include "UnityUI.cginc" - struct appdata_t { + struct appdata_t + { float4 vertex : POSITION; fixed4 color : COLOR; float2 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - struct v2f { + struct v2f + { float4 vertex : POSITION; fixed4 color : COLOR; float2 texcoord0 : TEXCOORD0; @@ -79,6 +82,9 @@ SubShader { uniform float4 _ClipRect; uniform float _MaskSoftnessX; uniform float _MaskSoftnessY; + uniform float _UIMaskSoftnessX; + uniform float _UIMaskSoftnessY; + uniform int _UIVertexColorAlwaysGammaSpace; v2f vert (appdata_t v) { @@ -88,8 +94,11 @@ SubShader { vert.y += _VertexOffsetY; vert.xy += (vert.w * 0.5) / _ScreenParams.xy; - - OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert)); + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + v.color.rgb = UIGammaToLinear(v.color.rgb); + } + OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert)); OUT.color = v.color; OUT.color *= _Color; OUT.color.rgb *= _DiffusePower; @@ -99,8 +108,9 @@ SubShader { //pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); // Clamp _ClipRect to 16bit. - float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); - OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); return OUT; } diff --git a/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader b/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader index 8ce4937a..caa527f7 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader @@ -1,25 +1,25 @@ Shader "TextMeshPro/Bitmap" { Properties { - _MainTex ("Font Atlas", 2D) = "white" {} - _FaceTex ("Font Texture", 2D) = "white" {} - [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) + _MainTex ("Font Atlas", 2D) = "white" {} + _FaceTex ("Font Texture", 2D) = "white" {} + _FaceColor ("Text Color", Color) = (1,1,1,1) - _VertexOffsetX ("Vertex OffsetX", float) = 0 - _VertexOffsetY ("Vertex OffsetY", float) = 0 - _MaskSoftnessX ("Mask SoftnessX", float) = 0 - _MaskSoftnessY ("Mask SoftnessY", float) = 0 + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 - _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) - _StencilComp("Stencil Comparison", Float) = 8 - _Stencil("Stencil ID", Float) = 0 - _StencilOp("Stencil Operation", Float) = 0 - _StencilWriteMask("Stencil Write Mask", Float) = 255 - _StencilReadMask("Stencil Read Mask", Float) = 255 + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 - _CullMode("Cull Mode", Float) = 0 - _ColorMask("Color Mask", Float) = 15 + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 } SubShader{ @@ -54,15 +54,18 @@ SubShader{ #include "UnityCG.cginc" + #include "UnityUI.cginc" - struct appdata_t { + struct appdata_t + { float4 vertex : POSITION; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - struct v2f { + struct v2f + { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord0 : TEXCOORD0; @@ -80,15 +83,9 @@ SubShader{ uniform float4 _ClipRect; uniform float _MaskSoftnessX; uniform float _MaskSoftnessY; - - float2 UnpackUV(float uv) - { - float2 output; - output.x = floor(uv / 4096); - output.y = uv - 4096 * output.x; - - return output * 0.001953125; - } + uniform float _UIMaskSoftnessX; + uniform float _UIMaskSoftnessY; + uniform int _UIVertexColorAlwaysGammaSpace; v2f vert (appdata_t v) { @@ -100,6 +97,10 @@ SubShader{ float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + v.color.rgb = UIGammaToLinear(v.color.rgb); + } fixed4 faceColor = v.color; faceColor *= _FaceColor; @@ -107,13 +108,14 @@ SubShader{ OUT.vertex = vPosition; OUT.color = faceColor; OUT.texcoord0 = v.texcoord0; - OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex); + OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex); float2 pixelSize = vPosition.w; pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); // Clamp _ClipRect to 16bit. - float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); - OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); return OUT; } diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader index c50c5930..757a6173 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader @@ -4,10 +4,10 @@ Properties { _FaceTex ("Face Texture", 2D) = "white" {} _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineTex ("Outline Texture", 2D) = "white" {} _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 @@ -21,7 +21,7 @@ Properties { _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416 - [HDR]_SpecularColor ("Specular", Color) = (1,1,1,1) + _SpecularColor ("Specular", Color) = (1,1,1,1) _SpecularPower ("Specular", Range(0,4)) = 2.0 _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10 _Diffuse ("Diffuse", Range(0,1)) = 0.5 @@ -37,13 +37,13 @@ Properties { _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) + _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 - [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowColor ("Color", Color) = (0, 1, 0, 0.5) _GlowOffset ("Offset", Range(-1,1)) = 0 _GlowInner ("Inner", Range(0,1)) = 0.05 _GlowOuter ("Outer", Range(0,1)) = 0.05 @@ -127,17 +127,18 @@ SubShader { #include "TMPro_Properties.cginc" #include "TMPro.cginc" - struct vertex_t { + struct vertex_t + { UNITY_VERTEX_INPUT_INSTANCE_ID float4 position : POSITION; float3 normal : NORMAL; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - - struct pixel_t { + struct pixel_t + { UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO float4 position : SV_POSITION; @@ -147,16 +148,20 @@ SubShader { float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw) float3 viewDir : TEXCOORD3; - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float4 texcoord2 : TEXCOORD4; // u,v, scale, bias fixed4 underlayColor : COLOR1; - #endif + #endif + float4 textures : TEXCOORD5; }; // Used by Unity internally to handle Texture Tiling and Offset. - float4 _FaceTex_ST; - float4 _OutlineTex_ST; + uniform float4 _FaceTex_ST; + uniform float4 _OutlineTex_ST; + uniform float _UIMaskSoftnessX; + uniform float _UIMaskSoftnessY; + uniform int _UIVertexColorAlwaysGammaSpace; pixel_t VertShader(vertex_t input) { @@ -167,7 +172,7 @@ SubShader { UNITY_TRANSFER_INSTANCE_ID(input,output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.position; vert.x += _VertexOffsetX; @@ -178,7 +183,7 @@ SubShader { float2 pixelSize = vPosition.w; pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); float scale = rsqrt(dot(pixelSize, pixelSize)); - scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; @@ -188,13 +193,13 @@ SubShader { float alphaClip = (1.0 - _OutlineWidth*_ScaleRatioA - _OutlineSoftness*_ScaleRatioA); - #if GLOW_ON + #if GLOW_ON alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB); - #endif + #endif alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight; - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float4 underlayColor = _UnderlayColor; underlayColor.rgb *= underlayColor.a; @@ -205,23 +210,28 @@ SubShader { float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; float2 bOffset = float2(x, y); - #endif + #endif // Generate UV for the Masking Texture float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); // Support for texture tiling and offset - float2 textureUV = UnpackUV(input.texcoord1.x); + float2 textureUV = input.texcoord1; float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex); float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex); + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } output.position = vPosition; output.color = input.color; output.atlas = input.texcoord0; output.param = float4(alphaClip, scale, bias, weight); - output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz); #if (UNDERLAY_ON || UNDERLAY_INNER) output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias); @@ -239,9 +249,9 @@ SubShader { float c = tex2D(_MainTex, input.atlas).a; - #ifndef UNDERLAY_ON + #ifndef UNDERLAY_ON clip(c - input.param.x); - #endif + #endif float scale = input.param.y; float bias = input.param.z; @@ -261,7 +271,7 @@ SubShader { faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); - #if BEVEL_ON + #if BEVEL_ON float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0); float3 n = GetSurfaceNormal(input.atlas, weight, dxy); @@ -278,36 +288,35 @@ SubShader { fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; - #endif + #endif - #if UNDERLAY_ON + #if UNDERLAY_ON float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a); - #endif + #endif - #if UNDERLAY_INNER + #if UNDERLAY_INNER float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a); - #endif + #endif - #if GLOW_ON + #if GLOW_ON float4 glowColor = GetGlowColor(sd, scale); faceColor.rgb += glowColor.rgb * glowColor.a; - #endif + #endif - // Alternative implementation to UnityGet2DClipping with support for softness. - #if UNITY_UI_CLIP_RECT + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); faceColor *= m.x * m.y; - #endif + #endif - #if UNITY_UI_ALPHACLIP + #if UNITY_UI_ALPHACLIP clip(faceColor.a - 0.001); - #endif + #endif return faceColor * input.color.a; } - ENDCG } } diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader index ed48574d..27c14bc6 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader @@ -4,10 +4,10 @@ Properties { _FaceTex ("Face Texture", 2D) = "white" {} _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineTex ("Outline Texture", 2D) = "white" {} _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 @@ -21,7 +21,7 @@ Properties { _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416 - [HDR]_SpecularColor ("Specular", Color) = (1,1,1,1) + _SpecularColor ("Specular", Color) = (1,1,1,1) _SpecularPower ("Specular", Range(0,4)) = 2.0 _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10 _Diffuse ("Diffuse", Range(0,1)) = 0.5 @@ -37,13 +37,13 @@ Properties { _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) + _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 - [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowColor ("Color", Color) = (0, 1, 0, 0.5) _GlowOffset ("Offset", Range(-1,1)) = 0 _GlowInner ("Inner", Range(0,1)) = 0.05 _GlowOuter ("Outer", Range(0,1)) = 0.05 @@ -109,7 +109,8 @@ SubShader { Blend One OneMinusSrcAlpha ColorMask[_ColorMask] - Pass { + Pass + { CGPROGRAM #pragma target 3.0 #pragma vertex VertShader @@ -127,17 +128,18 @@ SubShader { #include "TMPro_Properties.cginc" #include "TMPro.cginc" - struct vertex_t { + struct vertex_t + { UNITY_VERTEX_INPUT_INSTANCE_ID float4 position : POSITION; float3 normal : NORMAL; float4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - - struct pixel_t { + struct pixel_t + { UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO float4 position : SV_POSITION; @@ -147,18 +149,23 @@ SubShader { float2 mask : TEXCOORD2; // Position in object space(xy) float3 viewDir : TEXCOORD3; - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float2 texcoord2 : TEXCOORD4; float4 underlayColor : COLOR1; - #endif + #endif + float4 textures : TEXCOORD5; }; // Used by Unity internally to handle Texture Tiling and Offset. float4 _FaceTex_ST; float4 _OutlineTex_ST; + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; - float4 SRGBToLinear(float4 rgba) { + float4 SRGBToLinear(float4 rgba) + { return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a); } @@ -171,7 +178,7 @@ SubShader { UNITY_TRANSFER_INSTANCE_ID(input,output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.position; vert.x += _VertexOffsetX; @@ -182,27 +189,31 @@ SubShader { float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float4 underlayColor = _UnderlayColor; underlayColor.rgb *= underlayColor.a; float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; float2 bOffset = float2(x, y); - #endif + #endif // Generate UV for the Masking Texture float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); // Support for texture tiling and offset - float2 textureUV = UnpackUV(input.texcoord1.x); + float2 textureUV = input.texcoord1; float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex); float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex); + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } float4 color = input.color; - #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA) + #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA) color = SRGBToLinear(input.color); - #endif + #endif output.position = vPosition; output.color = color; @@ -210,10 +221,10 @@ SubShader { output.weight = weight; output.mask = half2(vert.xy * 2 - clampedRect.xy - clampedRect.zw); output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz); - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) output.texcoord2 = input.texcoord0 + bOffset; output.underlayColor = underlayColor; - #endif + #endif output.textures = float4(faceUV, outlineUV); return output; @@ -226,9 +237,9 @@ SubShader { float c = tex2D(_MainTex, input.atlas).a; - float2 pixelSize = float2(ddx(input.atlas.y), ddy(input.atlas.y)); - pixelSize *= _TextureWidth * .75; - float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1); + float pixelSize = abs(ddx(input.atlas.y)) + abs(ddy(input.atlas.y)); + pixelSize *= _TextureHeight * 0.75; + float scale = 1 / pixelSize * _GradientScale * (_Sharpness + 1); float weight = input.weight; float bias = (.5 - weight) + (.5 / scale); @@ -247,7 +258,7 @@ SubShader { faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); - #if BEVEL_ON + #if BEVEL_ON float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0); float3 n = GetSurfaceNormal(input.atlas, weight, dxy); @@ -264,45 +275,45 @@ SubShader { fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; - #endif + #endif - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float bScale = scale; bScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * bScale); float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale); - #endif + #endif - #if UNDERLAY_ON + #if UNDERLAY_ON float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale; faceColor += input.underlayColor * saturate(d - bBias) * (1 - faceColor.a); - #endif + #endif - #if UNDERLAY_INNER + #if UNDERLAY_INNER float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale; faceColor += input.underlayColor * (1 - saturate(d - bBias)) * saturate(1 - sd) * (1 - faceColor.a); - #endif + #endif - #if GLOW_ON + #if GLOW_ON float4 glowColor = GetGlowColor(sd, scale); faceColor.rgb += glowColor.rgb * glowColor.a; - #endif + #endif // Alternative implementation to UnityGet2DClipping with support for softness. - #if UNITY_UI_CLIP_RECT - float2 maskZW = 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + (1 / scale)); + #if UNITY_UI_CLIP_RECT + half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + float2 maskZW = 0.25 / (0.25 * maskSoftness + 1 / scale); half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW); faceColor *= m.x * m.y; - #endif + #endif - #if UNITY_UI_ALPHACLIP + #if UNITY_UI_ALPHACLIP clip(faceColor.a - 0.001); - #endif + #endif return faceColor * input.color.a; - } - - ENDCG } + ENDCG + } } Fallback "TextMeshPro/Mobile/Distance Field" diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph new file mode 100644 index 00000000..4f7157ca --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph @@ -0,0 +1,12074 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "386c36a1c4c34ea29deb680fb82cfe8b", + "m_Properties": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "c417006ffa034c44b79da3dd323165ff" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "6b0cd1bfb339459ca967fa23df287ef0" + } + ], + "m_Nodes": [ + { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + }, + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + { + "m_Id": "e591df3a1eb94e259b762f2830b407e2" + }, + { + "m_Id": "bc782d8e80154073b48a687a07adf60a" + }, + { + "m_Id": "2786e48f93f54a82aee4303ce7b63c82" + }, + { + "m_Id": "7f7d8028b58d4227a4560891be6e7cda" + }, + { + "m_Id": "f5a8bfcec21a4dac9df63993ec53635e" + }, + { + "m_Id": "be58359e488f42e9b5121357d0fa526b" + } + ], + "m_GroupDatas": [ + { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + } + ], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 5 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 7 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 6 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 1 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": -2506.000244140625, + "y": -3749.0 + }, + "m_Blocks": [ + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": -2506.000244140625, + "y": -3480.0 + }, + "m_Blocks": [ + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "e591df3a1eb94e259b762f2830b407e2" + }, + { + "m_Id": "bc782d8e80154073b48a687a07adf60a" + }, + { + "m_Id": "2786e48f93f54a82aee4303ce7b63c82" + }, + { + "m_Id": "7f7d8028b58d4227a4560891be6e7cda" + }, + { + "m_Id": "f5a8bfcec21a4dac9df63993ec53635e" + }, + { + "m_Id": "be58359e488f42e9b5121357d0fa526b" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"fileID\":10210,\"guid\":\"0000000000000000e000000000000000\",\"type\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "TextMeshPro/SRP", + "m_GraphPrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "7cf0e63037a74dc2a9f591225c678ff4" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "007c75c776ac4f1babe9cd7ae1fc4f14", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5722.99951171875, + "y": -3827.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1356dc7cbdfa4199a6535d3bbf4cd536" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.BuiltinData", + "m_ObjectId": "00996039d61e400a9e854ce591ac35a0", + "m_Distortion": false, + "m_DistortionMode": 0, + "m_DistortionDepthTest": true, + "m_AddPrecomputedVelocity": false, + "m_TransparentWritesMotionVec": false, + "m_DepthOffset": false, + "m_ConservativeDepthOffset": false, + "m_TransparencyFog": true, + "m_AlphaTestShadow": false, + "m_BackThenFrontRendering": false, + "m_TransparentDepthPrepass": false, + "m_TransparentDepthPostpass": false, + "m_TransparentPerPixelSorting": false, + "m_SupportLodCrossFade": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "013228b0fdf1424097798f0973a9a4fb", + "m_Title": "Face Texture", + "m_Position": { + "x": -4828.0, + "y": -2832.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "02559cbe5ad441a3904ccb75ded2b2c5", + "m_Id": 5, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "03182b3263304258b265266325c21f65", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "045c4f6b050549c7a0efb208e6349779", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "04dc152dd2ba4d519391577eb1156235", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4540.0, + "y": -2749.0, + "width": 151.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "3d04f5ba6e7b40d281f22eb424145acd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "04dfcc9ff13a4bf282ed46faec39d15c", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "05805bc6fcc941fd889922555c6c86d7", + "m_Guid": { + "m_GuidSerialized": "fe84e680-4cee-4ca5-be86-2e293a9ba093" + }, + "m_Name": "Ambient Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_05805bc6fcc941fd889922555c6c86d7", + "m_OverrideReferenceName": "_Ambient", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "0580d4b7e3a049049569f4508643a724", + "m_Guid": { + "m_GuidSerialized": "eefb88c5-7665-45dc-b3c2-7cf98b9990d6" + }, + "m_Name": "Softness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_D64EC33D", + "m_OverrideReferenceName": "_Softness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "068ae649e00b40e198ec5a30ad741fab", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0699eea947fc426cbfeb8744cf120222", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "07946387933e416db576b677f0711e5f", + "m_Guid": { + "m_GuidSerialized": "21d612fb-8153-41f8-9e2f-9de044c19fbf" + }, + "m_Name": "_FaceTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1A08AD4A", + "m_OverrideReferenceName": "_FaceText_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "082e9706dffc4c188270980d4e44ce0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0848ba750e0341198cf0bbd413e0efe4", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "09b1b86c1c074337a4c439d3a308dd2e", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0a67ca5280214bd794dc0ad66b5710a9", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0b57f2d35157477ab2b29a5aac14ae8b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0ba4932e164847878ddb7b7bcff96985", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0c4dc51f26484c26ad88a3fe4002abcd", + "m_Id": 2, + "m_DisplayName": "Color (1)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "0d6a57754b824f6db9cefa6953bc06a9", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0d7878dd226d4cfb81a991dc312309fc", + "m_Id": 0, + "m_DisplayName": "Underlay Dilate", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "0f7ffb6d2de4447f9736780cbcee8e07", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0fac35636fca4474a6afaefc3c757775", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "105b1ed1aa714e41bbe1ef5472bdb11f", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4923.99951171875, + "y": -4233.0, + "width": 158.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "8a08179f99d649d289b8053d5fa0ad22" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "109f638d1f9b49d4991d6d21a86d4eb7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5098.99951171875, + "y": -3182.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "880bb02c6c6b49b18aa6ebc66dc566a0" + }, + { + "m_Id": "1b9cd8f5f4004e2eaf8afbaab803bc04" + }, + { + "m_Id": "b224a1cf80604103ad085c799995f3c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "10a99c07aad742349d258db16838c129", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1196ae398cc348349ab0c1a23fdab4bd", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1356dc7cbdfa4199a6535d3bbf4cd536", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "14ad19bf20a140dd88d58452d7df688b", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "150533bad8e2424aaa2c74e253af8592", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4955.0, + "y": -3487.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "72fb5a0d7796446b9e2b929cb32facdc" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "163beb4431c34f538340bc0af0991e6f", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3284.0, + "y": -3516.0, + "width": 119.99999237060547, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c334de01ecd429baa7652fc6002536b" + }, + { + "m_Id": "e2d28f29bbac4983a401574480b5ca28" + }, + { + "m_Id": "6a7af6143e114a538663e71f56731a21" + }, + { + "m_Id": "3e25be96bb3747738c238cf3a741d5df" + }, + { + "m_Id": "4907352322c644ebacdf2ca30f2994fd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "183118ca50814141b7bc3e0cee27fb9b", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "19075add867e4757b9520d18fe8de1d0", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4291.99951171875, + "y": -3197.0, + "width": 124.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c28ee9109014fa086e5de7a3993341d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "0580d4b7e3a049049569f4508643a724" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1b9cd8f5f4004e2eaf8afbaab803bc04", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1bdde3efd3b7464b8934c555be0f8a48", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "1be90d4f96a841748b0c95219b12ad27", + "m_Guid": { + "m_GuidSerialized": "4c91c146-43bb-4de8-948a-fbf8b1da10e1" + }, + "m_Name": "Bevel Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_97690701", + "m_OverrideReferenceName": "_BevelOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": -0.5, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "1c4df61c2fea404eb3b87b270d7c59bc", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4311.0, + "y": -3221.0, + "width": 148.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "f864c900600e427ba7793f00c715e971" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1d35fa1fb5004f96a65ace54fbe4f1ad", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1db37082bf844442804487b4944352de", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1df58cfa4dad4c449d01ee1c5ea05f2e", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "1e12726617b24675958e942eb62e4b09", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4772.0, + "y": -4404.0, + "width": 145.00001525878907, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "0848ba750e0341198cf0bbd413e0efe4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1f247658c7ba45fb93c41f51e21acb0d", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1f46181633594ae0a1fb2adb76b42981", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "200245fc8bbe4826b209ab5f7ffe074c", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "204dacb5a95b424facf11cb6f65bd188", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "215a82c127204988b751de7d3a39b955", + "m_Id": 6, + "m_DisplayName": "Outline", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Outline", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "215b30ae27784ec3a13360a9029af283", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "21a7a380e66d42e780e2a2a1baa630d5", + "m_Guid": { + "m_GuidSerialized": "b2d0099f-e605-49f5-9959-e7cacae37aa3" + }, + "m_Name": "Bevel Type", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_21a7a380e66d42e780e2a2a1baa630d5", + "m_OverrideReferenceName": "_BevelType", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e", + "m_Guid": { + "m_GuidSerialized": "cd167d3a-7465-4d5a-86fc-0f22dc0ef908" + }, + "m_Name": "Outline Color 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_5550EB71", + "m_OverrideReferenceName": "_OutlineColor1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "232b1aa09e67479abae141d3c76d3c5b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "256d41e89a204d22951450de1c38051d", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "26e48352a08441bfa694dcea54c06e36", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "2786e48f93f54a82aee4303ce7b63c82", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Smoothness", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "9d0c47172bf840a0ac029980ba082af7" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Smoothness" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "281bcee4777040f8a31ee0e10344e98d", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "285f6a9863d54ed2a8150727ad749456", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4177.0, + "y": -2422.0, + "width": 154.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "b42e6dbfbc864097af182cbff5c0c1fb" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.IsFrontFaceNode", + "m_ObjectId": "2a552a0b828f457c911aa19561e410ae", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Is Front Face", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4282.0, + "y": -3681.3330078125, + "width": 121.99999237060547, + "height": 77.33348846435547 + } + }, + "m_Slots": [ + { + "m_Id": "2ef1d888dc9d49e59d6a6950897ddc93" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "2ac79705aa9e415dbb74ec215233fd1b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Composite (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3350.0, + "y": -3810.0, + "width": 213.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "a75f7ac601c446469802fe7754c1f279" + }, + { + "m_Id": "8c38a5d8327f456e9783740c05382619" + }, + { + "m_Id": "facc84930f544fd7a0205a6176b18ac0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Composite", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2b01ea3023e34c94af1754e4dcea8f2e", + "m_Id": 0, + "m_DisplayName": "Face Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2bf5f2fdd2984599b7323d10cfb1d240", + "m_Id": 1, + "m_DisplayName": "Filter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Filter", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "2c10b97b92c947ceb307a93759c0228b", + "m_Guid": { + "m_GuidSerialized": "6be0b8ff-a766-4c6b-a6e4-3a72758ac95f" + }, + "m_Name": "Bevel Amount", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B01DD93E", + "m_OverrideReferenceName": "_BevelAmount", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.25, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2c7a9460724b47daad8df1be144de7c6", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "2d0a269511e34bd1ba9056d2c939dff2", + "m_Guid": { + "m_GuidSerialized": "edbe73dc-53ab-4bc1-9d64-ab36e0e05f03" + }, + "m_Name": "_FaceUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_3A8E0F13", + "m_OverrideReferenceName": "_FaceUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "2db15d90c2204143b225ec4ef08d0755", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4387.0, + "y": -2405.0, + "width": 163.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "def8e0b9d8384982bc5b4c32d877e458" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "2e4eb1ef08bb44178c82e53872485e0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2ef1d888dc9d49e59d6a6950897ddc93", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": true, + "m_DefaultValue": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.SystemData", + "m_ObjectId": "305e3be306674fcd8bb02273d27ee5b7", + "m_MaterialNeedsUpdateHash": 280372, + "m_SurfaceType": 1, + "m_RenderingPass": 4, + "m_BlendMode": 0, + "m_ZTest": 4, + "m_ZWrite": false, + "m_TransparentCullMode": 2, + "m_OpaqueCullMode": 2, + "m_SortPriority": 0, + "m_AlphaTest": true, + "m_TransparentDepthPrepass": false, + "m_TransparentDepthPostpass": false, + "m_SupportLodCrossFade": false, + "m_DoubleSidedMode": 0, + "m_DOTSInstancing": false, + "m_CustomVelocity": false, + "m_Tessellation": false, + "m_TessellationMode": 0, + "m_TessellationFactorMinDistance": 20.0, + "m_TessellationFactorMaxDistance": 50.0, + "m_TessellationFactorTriangleSize": 100.0, + "m_TessellationShapeFactor": 0.75, + "m_TessellationBackFaceCullEpsilon": -0.25, + "m_TessellationMaxDisplacement": 0.009999999776482582, + "m_DebugSymbols": false, + "m_Version": 2, + "inspectorFoldoutMask": 9 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "30ca940fe2794c949f2a1d4d2caaa446", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "319916a5921343f7b7eef0e50dc93def", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4791.0, + "y": -3245.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "d219977210094c0082c517d8dc00c8bb" + }, + { + "m_Id": "f48f04ad45d046a8b88e71731ed506e7" + }, + { + "m_Id": "e6e80c6b0db545cda26b079a9a78fbb3" + }, + { + "m_Id": "c6bdb985bc16435fa72f5a3c81bb633c" + }, + { + "m_Id": "d1a17e42e7a04dc38984e3c01149445b" + }, + { + "m_Id": "fb15d0ba56d54a6192f11e107aeb5fa8" + }, + { + "m_Id": "c35312edaa2344788b1964ee2f63a236" + }, + { + "m_Id": "c88fcbaeea954a5f9c68c339fa8b604d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "34a67e0fef884f9399e674d9eeaf720c", + "m_Id": 6, + "m_DisplayName": "Color3", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color3", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "34a72a5ebb04402384a4fd3748111a37", + "m_Id": 0, + "m_DisplayName": "Alpha Clip Threshold", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AlphaClipThreshold", + "m_StageCapability": 2, + "m_Value": 0.0010000000474974514, + "m_DefaultValue": 0.5, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3535ae87c6dd4769b52b20d9eca61069", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "35cbea6373dd4e4f8d0fea36e8add392", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "36a0c473c4c04c3a930dd38f3920d410", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "36f1b4d96f2941c39e5cd95d9c1d2ce6", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6008.99951171875, + "y": -3341.0, + "width": 144.99998474121095, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "65b3dc13b2b6484283ffe5abfe87a06a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "373f1de8db6c429c9d46c781f741d7a4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3802c81c3be24823aa1d7c9997a33c29", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "3915c1927ffe49f8967304321cfbe497", + "m_Id": 4, + "m_DisplayName": "Atlas", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Atlas", + "m_StageCapability": 3, + "m_BareResource": true, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "39a382d661e2484da71f04c43f48e55f", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "39f2f84f30304d859fb07569e2695f60", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3423.000244140625, + "y": -3516.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "4b2d9ea03bf64fa19dcae1511d2581da" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3c50439118b2496f9e390021b0964606", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.AlphaClipThreshold", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3028.0, + "y": -3054.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "34a72a5ebb04402384a4fd3748111a37" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.AlphaClipThreshold" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3d04f5ba6e7b40d281f22eb424145acd", + "m_Id": 0, + "m_DisplayName": "Face Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3db1608e927e4102a3c3a88e9fcab39a", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3dccd64e7f324bc1a75c1479d7a67c51", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "3e231021af7b47ba97f2871e7f25d0fe", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2803.000244140625, + "y": -3520.0, + "width": 140.0, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "6ccaced3889e4503a9414d808ec33981" + }, + { + "m_Id": "7f3d71a6c96847c099da45f95aafbecb" + }, + { + "m_Id": "d8edec16956c4f15b7d51d6ec10753f4" + }, + { + "m_Id": "39a382d661e2484da71f04c43f48e55f" + }, + { + "m_Id": "8764669016f6442f8152593c18a649d7" + }, + { + "m_Id": "26e48352a08441bfa694dcea54c06e36" + }, + { + "m_Id": "3e94a0d106064bdb864c960512ef4026" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3e25be96bb3747738c238cf3a741d5df", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "3e372195f4bd4845852a37839e5b602d", + "m_Guid": { + "m_GuidSerialized": "60abd046-2a1a-48cd-a0af-2f702f7f53ab" + }, + "m_Name": "_MainTex", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_90CBF488", + "m_OverrideReferenceName": "_MainTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":28684132378477856,\"guid\":\"8f586378b4e144a9851e7b34d9b748ee\",\"type\":2}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "3e94a0d106064bdb864c960512ef4026", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "3ec4797e381747829ef4712c85fcf7a1", + "m_Guid": { + "m_GuidSerialized": "020d65cc-50a8-4b8a-a624-90d7b489f549" + }, + "m_Name": "Specular Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_3ec4797e381747829ef4712c85fcf7a1", + "m_OverrideReferenceName": "_SpecularPower", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 1.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 4.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "3fdf4b7bc5d4426492dcc057603ef4a6", + "m_Guid": { + "m_GuidSerialized": "675d2567-3fca-4da6-9462-dfa4924950f1" + }, + "m_Name": "_OutlineUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_D66D89E6", + "m_OverrideReferenceName": "_OutlineUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "400d0b6c95dd4540ad3da3e8cb7e50b2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "41986ac6400d46709d0ef043a67f6b34", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "41b9b79b3859472882bcea393703eec0", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "424dbeeb009344efa29c304c4979e3d6", + "m_Guid": { + "m_GuidSerialized": "314c37de-c6f2-4463-866d-8588f6fc119e" + }, + "m_Name": "Diffuse Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_424dbeeb009344efa29c304c4979e3d6", + "m_OverrideReferenceName": "_Diffuse", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "42a586e4f6ec40eeaba891b7fd133864", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4934.0, + "y": -4442.99951171875, + "width": 133.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "da7a06d393a44089842070d51d2aa0a6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "42cadae0923e4969b50bbc3f78185934", + "m_Title": "Face + 3 Outlines + Underlay", + "m_Position": { + "x": -5468.0, + "y": -3558.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4328cdbf78b94c038fd614c59bfe1cac", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "44317f2e371447e2a8d894f8a021a235", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Layer1 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4004.999755859375, + "y": -4173.0, + "width": 191.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "10a99c07aad742349d258db16838c129" + }, + { + "m_Id": "b85d677872b44421bf5536f42ba0267c" + }, + { + "m_Id": "75aba700d74d4b2687bf3166cf1da3e2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer1", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "44806230fa384c1e95f9c5918a14f056", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4488af8ff6a7421298a7e827f567263b", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4109.0, + "width": 158.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "66f69ef16eac4eb48357bde804cf3c39" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "4590bfa2a0664b65b6f073bae33a071f", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 1, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "4648b46ad29a4008a80de4f8a5a5b813", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4615.0, + "y": -2422.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "b2baf44eae52473cb6cda7b1debece01" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "46fbf3eeb0ea4470869cba7443249295", + "m_Guid": { + "m_GuidSerialized": "be87c5a3-e361-4b95-89c8-911c39a51c0d" + }, + "m_Name": "Outline Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_A0B54237", + "m_OverrideReferenceName": "_OutlineTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "47d020251e9841a5b1f0fd64396026a1", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "48390d02257d41bf98eace1deaa4c539", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "8036d0e6090b456e9b4ea87227868236" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "484b51c50485473b819c4f05087b32d7", + "m_Title": "Underlay", + "m_Position": { + "x": -5253.0, + "y": -4542.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4907352322c644ebacdf2ca30f2994fd", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "49e7c3ad55ce458797f0e60c950cb965", + "m_Guid": { + "m_GuidSerialized": "31b55db9-0da1-4ec4-af2b-d83747ed5bc4" + }, + "m_Name": "Underlay Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_CE9DEDB3", + "m_OverrideReferenceName": "_UnderlayOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4a66dcbe712a4d40bd8f355b834594b5", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "4abff6ff92fa4a05b203f10580988335", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4323.99951171875, + "y": -3498.0, + "width": 140.0, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "b015d1b7e4134c59baf6851e7649802c" + }, + { + "m_Id": "d9dc4839ee2847999110bdb234d6041a" + }, + { + "m_Id": "91d6a9a5fbc04ea49075cb51835e7264" + }, + { + "m_Id": "f42ad06b3c6a45d3ab33de904c063412" + }, + { + "m_Id": "ed6c215a65584deeaefad1d2c7743044" + }, + { + "m_Id": "edbee7a8952b46529ac5ad0365775774" + }, + { + "m_Id": "70337a74f6ad4b7bb6befc825219bab1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4b2d9ea03bf64fa19dcae1511d2581da", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4bda5c294e1949138d033640e1d385b4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4c28ee9109014fa086e5de7a3993341d", + "m_Id": 0, + "m_DisplayName": "Softness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4c334de01ecd429baa7652fc6002536b", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4d1cb1a475df49f9a148195a65f5453a", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4d9ce48719d143748f9f8e22da6f9ddc", + "m_Id": 5, + "m_DisplayName": "TextureWidth", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureWidth", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4e64dac49ddc47c3b5b1e27b17a08304", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "4eb3c00a1ca44e10be833b7ca61ff059", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4f194ff591484e908fc2bcdacbcf2570", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4309.0, + "y": -2773.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "2b01ea3023e34c94af1754e4dcea8f2e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "509e6f38505b4b0695b263706a55028f", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "51378bae98a94c309785d14cd5cbb453", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "GetSurfaceNormal (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4067.333251953125, + "y": -3881.99951171875, + "width": 263.9999694824219, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "5b0077c23eae443887872f84227deccc" + }, + { + "m_Id": "3915c1927ffe49f8967304321cfbe497" + }, + { + "m_Id": "4d9ce48719d143748f9f8e22da6f9ddc" + }, + { + "m_Id": "ebd6d75abcb84108bcadbfe7ee5f6244" + }, + { + "m_Id": "ef9738ec7e894772a14e9dce441c16c6" + }, + { + "m_Id": "9eeec1a9713045af8845cea263d5ea48" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GetSurfaceNormal", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "51f76f8a53ad43a4ad028426548ce9ba", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "52798bdb86f6400e86489a7a368e9f8b", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6154.99951171875, + "y": -3169.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1df58cfa4dad4c449d01ee1c5ea05f2e" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "53073e5ea924459fa6681a4943e9f947", + "m_Guid": { + "m_GuidSerialized": "5fdac24e-2d58-4471-80ce-79c3ab9a2564" + }, + "m_Name": "Outline Color 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_DBAB5AEC", + "m_OverrideReferenceName": "_OutlineColor2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.009433984756469727, + "g": 0.02534518577158451, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "54d7a93ffec5490aa4591da23a21b693", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "55ffa45ec3654d5e88089fb40d2b0465", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "56c25395796e4d2fbe5c892d428d1620", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5102.99951171875, + "y": -3427.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "9eb8137a6c2e41bbafdc8b0732dd47a3" + }, + { + "m_Id": "36a0c473c4c04c3a930dd38f3920d410" + }, + { + "m_Id": "068ae649e00b40e198ec5a30ad741fab" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "57abc172afd449e2a4d567f93432507b", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "582d6e289dbe4fdca7cf0307273eaa2f", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "59bd90a849624124bae6464ee3669aa6", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4007.0, + "y": -2395.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "2e4eb1ef08bb44178c82e53872485e0f" + }, + { + "m_Id": "8695190a5e614f2d90081871a8a06fc2" + }, + { + "m_Id": "81bdb47901ef48e5a588c6724b1b0142" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "5b0077c23eae443887872f84227deccc", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5b3ff4ee364f4d7a923b530ad60d8762", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5bd258837c514ff7ab0bf7027e762c18", + "m_Guid": { + "m_GuidSerialized": "2d8f3ee9-1307-4b58-a60d-526e86b07109" + }, + "m_Name": "Bevel Roundness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_AB6A015F", + "m_OverrideReferenceName": "_BevelRoundness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5da82bf481f8489ebd05e997f617f51b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": 4.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5e42524569844befad16fda5a94eb9cb", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5fbe253f3e444f2aa8ac717f9c856619", + "m_Guid": { + "m_GuidSerialized": "0a61c93f-6430-4aa6-af07-79bc3b411ccd" + }, + "m_Name": "Bevel Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B50BBFCC", + "m_OverrideReferenceName": "_BevelWidth", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.5, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61133d79a89048c195f54939b2a1d30a", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61a6ac5f29344d109411f26850ab0a96", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDLitData", + "m_ObjectId": "6238ae56182d404f8563cb88cb801549", + "m_RayTracing": false, + "m_MaterialType": 0, + "m_MaterialTypeMask": 2, + "m_RefractionModel": 0, + "m_SSSTransmission": true, + "m_EnergyConservingSpecular": true, + "m_ClearCoat": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6271438664e74b3fbf723bd6a1f50f8b", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "62bc551cea604e88b7858cc37d96a98a", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "636180f6e0504f2baaa5cc086980cb47", + "m_Guid": { + "m_GuidSerialized": "c1223e37-093d-4d5a-b2b0-cd9cc3e4f88e" + }, + "m_Name": "Outline Offset 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_636180f6e0504f2baaa5cc086980cb47", + "m_OverrideReferenceName": "_OutlineOffset1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "63c7cd57fc3c45a9a97b514fdae32693", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5266.99951171875, + "y": -3387.0, + "width": 156.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "c422a9a9ff824176aad2241f58c44d0b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "641eda269d7b4da9acb65f8d50035ea9", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "65b3dc13b2b6484283ffe5abfe87a06a", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "65c8e64a7535466e933eed08a2f77532", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4791.0, + "y": -3499.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "256d41e89a204d22951450de1c38051d" + }, + { + "m_Id": "0a67ca5280214bd794dc0ad66b5710a9" + }, + { + "m_Id": "ebbd94a7102a4457a48ac492de3bff14" + }, + { + "m_Id": "6271438664e74b3fbf723bd6a1f50f8b" + }, + { + "m_Id": "c9b722d107ce4cd6a748c883472b9b0f" + }, + { + "m_Id": "74cf69e61bef44589521f1bf2bf3c59a" + }, + { + "m_Id": "6e532f83d1c44e839bcfc5845d3b01d6" + }, + { + "m_Id": "cb5e9f9567e84f8fa5463efc0e256e19" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "66f69ef16eac4eb48357bde804cf3c39", + "m_Id": 0, + "m_DisplayName": "_UnderlayColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "67a519f507384ff1861df5d8d5b486be", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4278.0, + "y": -3939.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "c3e6d7c20c184bf39fd8822130e693e7" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDLitSubTarget", + "m_ObjectId": "67bc2306558f4f2fa807637aaebaeab4" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "68ec7c31365549d6a8ce883edfc02de2", + "m_Id": 4, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6a7af6143e114a538663e71f56731a21", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "6b0cd1bfb339459ca967fa23df287ef0", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "c417006ffa034c44b79da3dd323165ff" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "6b2f65c1463f4f7bad16c54a95d2fe75", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5101.0, + "y": -3301.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "1d35fa1fb5004f96a65ace54fbe4f1ad" + }, + { + "m_Id": "fa6de3be9f5b4411b5081b49e645f424" + }, + { + "m_Id": "400d0b6c95dd4540ad3da3e8cb7e50b2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6ccaced3889e4503a9414d808ec33981", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6dfc1177dd0541a7a780fbf911ad1956", + "m_Id": 0, + "m_DisplayName": "_OutlineTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6e13f3cd573c467a94379f45d96cb690", + "m_Id": 2, + "m_DisplayName": "SSR", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "6e532f83d1c44e839bcfc5845d3b01d6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6e8946a245e842b38231d4a241bfb3ef", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3026.0, + "y": -3110.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "ef0b93f78372439696f50711eaf57d90" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6fbdcc5a972b4fa883dc5f21e525a376", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "70337a74f6ad4b7bb6befc825219bab1", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "703396865b6e4990a0cf1189ea684e5c", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "712da461f71a454db59d349f752d41ee", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "71dd947935b64ce38f0d25406dde447b", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "724e17584e97443e9e285dfa7253c8e3", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 0.15000000596046449, + "m_DefaultValue": 1.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "72fb5a0d7796446b9e2b929cb32facdc", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "7444469eb9884253819add9ef96baa25", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4298.0, + "y": -3809.99951171875, + "width": 144.66648864746095, + "height": 129.33323669433595 + } + }, + "m_Slots": [ + { + "m_Id": "03182b3263304258b265266325c21f65" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "748c31bbcecc4b30bec2e42c0612175b", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "74b41464cbed4e9e8e23af5ab9be40cf", + "m_Guid": { + "m_GuidSerialized": "41afbdcb-f3ae-4340-8973-1c1998c992a2" + }, + "m_Name": "Outline Offset 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "74cf69e61bef44589521f1bf2bf3c59a", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "7564379492aa4c5a927ff3501acdc70d", + "m_Id": 0, + "m_DisplayName": "Normal (Tangent Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalTS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "757174b6f25040fdbb20355a21752222", + "m_Id": 0, + "m_DisplayName": "Outline Offset 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "75aba700d74d4b2687bf3166cf1da3e2", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "75c5657544c648058b20cea090f48dbf", + "m_Id": 0, + "m_DisplayName": "_OutlineUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "767769f736d5478cba5f10a415e28e7f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "773b90134e894e429203c0c83e80b9de", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "77991fa631724e0cb32eed66ff017b23", + "m_Id": 0, + "m_DisplayName": "Metallic", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Metallic", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "77e28f3e930b4c249145630ec961af95", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "79147f6986644769b58d9ed64fe771e1", + "m_Id": 0, + "m_DisplayName": "OutlineMode", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7984fd094e1147bdabb4e26fbd3d31c8", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3113.000244140625, + "y": -3468.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "082e9706dffc4c188270980d4e44ce0f" + }, + { + "m_Id": "f2a351a5375c441b8d9ab7e2c9545a77" + }, + { + "m_Id": "41986ac6400d46709d0ef043a67f6b34" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "7a046f410ce64aa88438b0bfd412c045", + "m_Guid": { + "m_GuidSerialized": "d47271f5-5a84-47bf-a09e-c825d2aeb013" + }, + "m_Name": "Outline Color 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_551702C5", + "m_OverrideReferenceName": "_OutlineColor3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "7a0f504e4175406dbd8134250f4e350b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7a80e8839f0e4a1d9a6c0814f8793ee6", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4961.99951171875, + "y": -3452.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "6fbdcc5a972b4fa883dc5f21e525a376" + }, + { + "m_Id": "0ba4932e164847878ddb7b7bcff96985" + }, + { + "m_Id": "9178663316db43d582f1c4a127d307c6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7acfafd73b8c4dfab8c55c18a887e087", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7b8a19bd115e4167a25b59cb3218a817", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "7c27ccb2c2dc4ca59c5438c3358630ca", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", + "m_ObjectId": "7cf0e63037a74dc2a9f591225c678ff4", + "m_ActiveSubTarget": { + "m_Id": "67bc2306558f4f2fa807637aaebaeab4" + }, + "m_Datas": [ + { + "m_Id": "00996039d61e400a9e854ce591ac35a0" + }, + { + "m_Id": "305e3be306674fcd8bb02273d27ee5b7" + }, + { + "m_Id": "6238ae56182d404f8563cb88cb801549" + }, + { + "m_Id": "a8c49a47cb934f7e8e4d88fce06df6ff" + } + ], + "m_CustomEditorGUI": "TMPro.EditorUtilities.TMP_SDF_HDRPLitShaderGUI", + "m_SupportVFX": false, + "m_SupportLineRendering": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7d7696aa6d184b4fb9c316a9dec37aee", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4959.0, + "y": -3326.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "4d1cb1a475df49f9a148195a65f5453a" + }, + { + "m_Id": "47d020251e9841a5b1f0fd64396026a1" + }, + { + "m_Id": "62bc551cea604e88b7858cc37d96a98a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7d78a616c2754cc28d1f32cf66ade611", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4005.0, + "y": -2797.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "d9bcb754db834583b6518c5ed5152114" + }, + { + "m_Id": "861d4258049a4a3e8164f7297090f88e" + }, + { + "m_Id": "a7c06457d7454693a8bc3dc95257b2c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "7e0fadb2533f496192c1ad3e78642010", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4188.0, + "width": 173.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d48c3871e3064027a10ae9f4babd3be0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "7f2e6b5f15364ed9835d67d0cf4f8f65", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2586.0, + "y": -3592.0, + "width": 200.0, + "height": 41.0 + } + }, + "m_Slots": [ + { + "m_Id": "85ff8667d72947edada4e9fb4ff60559" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7f3d71a6c96847c099da45f95aafbecb", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "7f7d8028b58d4227a4560891be6e7cda", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Occlusion", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a00de0d572a84a08a23fe14c2ad5030d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Occlusion" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "8036d0e6090b456e9b4ea87227868236", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "80e665a5eeb64730a51742f698bf0d48", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "8135ca333f8f4ea78163743e6ec1f55c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4081.999755859375, + "y": -3140.0, + "width": 156.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6a6a119394e4082a11bc024a6e42ef8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "81bdb47901ef48e5a588c6724b1b0142", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "81e8ed0534534674a74263e6161a2a1a", + "m_Guid": { + "m_GuidSerialized": "78aab961-c4a8-41f3-b203-1239c3b33b13" + }, + "m_Name": "Underlay Dilate", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_D48690B9", + "m_OverrideReferenceName": "_UnderlayDilate", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "82af2db1018543d7832af96c1cfc981f", + "m_Guid": { + "m_GuidSerialized": "37906c7b-9a3a-454b-a62a-9aa097e64bde" + }, + "m_Name": "Light Angle", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_82af2db1018543d7832af96c1cfc981f", + "m_OverrideReferenceName": "_LightAngle", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 6.28000020980835 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "82d5443fe54d4a3b9420f8745d00a632", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": 8.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "84dc74cdbd8c45e1b189e4fd9a69942d", + "m_Id": 0, + "m_DisplayName": "Outline Offset 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "85a1ad8e741e41759002e8cdc8cd0b96", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "ScreenSpaceRatio (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5800.99951171875, + "y": -3363.0, + "width": 258.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "6e13f3cd573c467a94379f45d96cb690" + }, + { + "m_Id": "8e6ed600f6504f4083092f5b511e44c4" + }, + { + "m_Id": "93b161cce4504cb79c97b6d8db178de7" + }, + { + "m_Id": "2bf5f2fdd2984599b7323d10cfb1d240" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ScreenSpaceRatio", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "85b5940eb77e4625812ded7215bab8d7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4081.999755859375, + "y": -3096.0, + "width": 156.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ada023d617104472b8ab75a81558c0a1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "85ff8667d72947edada4e9fb4ff60559", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "861d4258049a4a3e8164f7297090f88e", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "867a4ae13c0d4a028c71bc1063824c14", + "m_Guid": { + "m_GuidSerialized": "d483c212-0a30-4f6d-b94d-9abbc83a6522" + }, + "m_Name": "Outline Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_C68C9E14", + "m_OverrideReferenceName": "_IsoPerimeter", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 2, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "8695190a5e614f2d90081871a8a06fc2", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8764669016f6442f8152593c18a649d7", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "880bb02c6c6b49b18aa6ebc66dc566a0", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "88253223d2c34ecfab92b0c344048f94", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "ComputeSDF (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4323.0, + "width": 227.99998474121095, + "height": 190.0 + } + }, + "m_Slots": [ + { + "m_Id": "c52a1744a9a14989b0ae452ad6de6061" + }, + { + "m_Id": "a03db80c558b4f87a330c5ae0a9443a5" + }, + { + "m_Id": "8f1b1d1e8ff24b3284993e52354e54fa" + }, + { + "m_Id": "5da82bf481f8489ebd05e997f617f51b" + }, + { + "m_Id": "82d5443fe54d4a3b9420f8745d00a632" + }, + { + "m_Id": "61133d79a89048c195f54939b2a1d30a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8a08179f99d649d289b8053d5fa0ad22", + "m_Id": 0, + "m_DisplayName": "Underlay Offset", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8b66f4e6bc9d4662b3218ac33a69839f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8c38a5d8327f456e9783740c05382619", + "m_Id": 3, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8cbd81814903479ea1d3151c1f38183e", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "8cf8aae64c1d443f9303126886b40f17", + "m_Guid": { + "m_GuidSerialized": "8d78c9a5-aaef-41fb-af68-2358e401d7ac" + }, + "m_Name": "_UnderlayColor", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_2F5FE804", + "m_OverrideReferenceName": "_UnderlayColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8e6ed600f6504f4083092f5b511e44c4", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "8ed907a2cc7949b68a283ae243ea1977", + "m_Guid": { + "m_GuidSerialized": "36803443-a9bc-4f3c-a4f2-7d66a5417ac1" + }, + "m_Name": "Outline Offset 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8f1b1d1e8ff24b3284993e52354e54fa", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9147636b0cfa466a9b37a013d8f693bf", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5421.99951171875, + "y": -3902.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a4f471e3221c4134b291bd9d2ba22db6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9178663316db43d582f1c4a127d307c6", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "91890fe48ebe4717aea61ecaf3ad4861", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2983.000244140625, + "y": -3468.0, + "width": 119.99999237060547, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "3dccd64e7f324bc1a75c1479d7a67c51" + }, + { + "m_Id": "e444f2c81d1e48329fa2c91005277e8d" + }, + { + "m_Id": "b2c26292b7434733878a9b042f44de89" + }, + { + "m_Id": "964fea1fd4b24f4daf5bef84c4b45118" + }, + { + "m_Id": "deac82280a2b43078e0e40863e2d974c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "91d6a9a5fbc04ea49075cb51835e7264", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "928621a3ca2d41c89a10336bbbc81ddc", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "93b161cce4504cb79c97b6d8db178de7", + "m_Id": 3, + "m_DisplayName": "TextureSize", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureSize", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "945b45993dd84a979755b98c48138f72", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "952d0fa5cd744df0b434cd38e9a90b93", + "m_Guid": { + "m_GuidSerialized": "ce395871-ddeb-47c3-a31d-07855800c197" + }, + "m_Name": "_UnderlaySoftness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_F2B9E3EF", + "m_OverrideReferenceName": "_UnderlaySoftness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "95928bcb6a284b8d88105a84c2e1d3ce", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4793.0, + "y": -2593.0, + "width": 155.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d880558893fb442b9320cf55885d1117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "964fea1fd4b24f4daf5bef84c4b45118", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "98934a69591249d5b8b92b39045359a3", + "m_Title": "Outline1 Texture", + "m_Position": { + "x": -4672.0, + "y": -2481.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "998db5e5901e45b29040eb2099370071", + "m_Guid": { + "m_GuidSerialized": "6f383614-f2ad-4269-be8f-87b0ecb03cf0" + }, + "m_Name": "Bevel Clamp", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_5BD7E808", + "m_OverrideReferenceName": "_BevelClamp", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "9c228fac287d446296b91a4acf5cec59", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4600.0, + "y": -3498.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "582d6e289dbe4fdca7cf0307273eaa2f" + }, + { + "m_Id": "1db37082bf844442804487b4944352de" + }, + { + "m_Id": "8b66f4e6bc9d4662b3218ac33a69839f" + }, + { + "m_Id": "4a66dcbe712a4d40bd8f355b834594b5" + }, + { + "m_Id": "a0285c9c381a49cba194709efa0a7c85" + }, + { + "m_Id": "b2728d0dd3ce40678867c94a7d977916" + }, + { + "m_Id": "e141833aa78b4fd59ecad949beb43a78" + }, + { + "m_Id": "51f76f8a53ad43a4ad028426548ce9ba" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9c26fdddba244d36a854298c00473247", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9d0c47172bf840a0ac029980ba082af7", + "m_Id": 0, + "m_DisplayName": "Smoothness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Smoothness", + "m_StageCapability": 2, + "m_Value": 0.5, + "m_DefaultValue": 0.5, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "9d3c3383d5934a17bf9efbb7fd9e9043", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5443.0, + "y": -3315.0, + "width": 144.99998474121095, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "232b1aa09e67479abae141d3c76d3c5b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e6e50a71d9843b49b62ebe1cf7d3d59", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4486.0, + "y": -3865.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "3535ae87c6dd4769b52b20d9eca61069" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e87ce9607e14015a3790c528ca5dfda", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4637.0, + "y": -2239.0, + "width": 167.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "75c5657544c648058b20cea090f48dbf" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "9eb8137a6c2e41bbafdc8b0732dd47a3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "9eeec1a9713045af8845cea263d5ea48", + "m_Id": 6, + "m_DisplayName": "IsFront", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "IsFront", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "9f0de188085746d5a19073da1de85ddb", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4160.0, + "y": -2739.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "7c27ccb2c2dc4ca59c5438c3358630ca" + }, + { + "m_Id": "373f1de8db6c429c9d46c781f741d7a4" + }, + { + "m_Id": "fd0b096ed5b74f9e9ec51327be200731" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a00de0d572a84a08a23fe14c2ad5030d", + "m_Id": 0, + "m_DisplayName": "Ambient Occlusion", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Occlusion", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a0285c9c381a49cba194709efa0a7c85", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a03db80c558b4f87a330c5ae0a9443a5", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "a3f8b6e8ae7f48e2989a029904401502", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "a455bd79094c4413a7b7dd80ca8b9368", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4611.0, + "y": -2691.0, + "width": 222.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "ffb07af0bca546d8b9bc439d34aa68f5" + }, + { + "m_Id": "2c7a9460724b47daad8df1be144de7c6" + }, + { + "m_Id": "55ffa45ec3654d5e88089fb40d2b0465" + }, + { + "m_Id": "e495a9f7a11f4eb89334e83be154ceb9" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateShaderProperty", + "m_ObjectId": "a4ad98d8828c424384229c344ebe2ed0", + "m_Guid": { + "m_GuidSerialized": "f98fc1a2-bb81-4bd1-a207-23d3a90d518e" + }, + "m_Name": "SamplerState", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "SamplerState_a4ad98d8828c424384229c344ebe2ed0", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": false, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_filter": 0, + "m_wrap": 1, + "m_anisotropic": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a4f471e3221c4134b291bd9d2ba22db6", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "a535f3bcbeb14622bb177eb6f46e76f4", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4647.0, + "y": -2283.0, + "width": 177.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "6dfc1177dd0541a7a780fbf911ad1956" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "a6bbb32e8d884be9bb36db91fe4b81b1", + "m_Guid": { + "m_GuidSerialized": "6aa76edf-7b80-46ac-add4-406cf1d85493" + }, + "m_Name": "_GradientScale", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_EAE27356", + "m_OverrideReferenceName": "_GradientScale", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 10.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "a6c38edd2e8743a9b057ba8452b9f129", + "m_Guid": { + "m_GuidSerialized": "9fc942ee-4a1d-4ced-a5a6-81893e3ddb63" + }, + "m_Name": "Light Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_a6c38edd2e8743a9b057ba8452b9f129", + "m_OverrideReferenceName": "_SpecularColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "a75f7ac601c446469802fe7754c1f279", + "m_Id": 0, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a7942746b5564dc7bbbae1deb2403022", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "a7c06457d7454693a8bc3dc95257b2c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.LightingData", + "m_ObjectId": "a8c49a47cb934f7e8e4d88fce06df6ff", + "m_NormalDropOffSpace": 0, + "m_BlendPreserveSpecular": true, + "m_ReceiveDecals": true, + "m_ReceiveSSR": true, + "m_ReceiveSSRTransparent": false, + "m_SpecularAA": false, + "m_SpecularOcclusionMode": 0, + "m_OverrideBakedGI": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "aa2794b8f0e24bf281d22e0fef0647be", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "aa3e347d733e48f7b65d8a8847370eec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "EvaluateLight (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3631.0, + "y": -3810.0, + "width": 230.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "0699eea947fc426cbfeb8744cf120222" + }, + { + "m_Id": "0c4dc51f26484c26ad88a3fe4002abcd" + }, + { + "m_Id": "d5173cc3c6cd4f1998550f3187a3e9c8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "EvaluateLight", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aa87c72ac0e64469acc34f936f00b3d0", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4225.0, + "width": 193.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "0d7878dd226d4cfb81a991dc312309fc" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "abd59150589b436cadf8c9e6f43ccb8e", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "aca823a8188948c782eddaf0f45e1868", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalOS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2542.0, + "y": -3404.000244140625, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "e386b183a18245a796b024022f7f3074" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalOS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "acd0cd5a177f4a97bf23db7219305e3f", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4348.0, + "y": -3905.99951171875, + "width": 185.33299255371095, + "height": 101.33324432373047 + } + }, + "m_Slots": [ + { + "m_Id": "945b45993dd84a979755b98c48138f72" + }, + { + "m_Id": "e51a636b2621440eb94cc802c1cf4bfc" + }, + { + "m_Id": "1bdde3efd3b7464b8934c555be0f8a48" + }, + { + "m_Id": "e364823e158a407fb48dd7b630c79973" + }, + { + "m_Id": "703396865b6e4990a0cf1189ea684e5c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ada023d617104472b8ab75a81558c0a1", + "m_Id": 0, + "m_DisplayName": "Outline Color 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aef5c44f84e04c3185e0b93e95e34204", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5264.99951171875, + "y": -3142.0, + "width": 159.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "84dc74cdbd8c45e1b189e4fd9a69942d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b000f852aa984e9dae25b125a4607f4e", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b015d1b7e4134c59baf6851e7649802c", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "b0b352c4503a43d083a64e57352b29a0", + "m_Guid": { + "m_GuidSerialized": "01cfcc78-60aa-4f71-a1e3-8d8df6dae253" + }, + "m_Name": "Reflectivity Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_b0b352c4503a43d083a64e57352b29a0", + "m_OverrideReferenceName": "_Reflectivity", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 5.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 5.0, + "y": 15.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "b1188549725543d485436c2e921ffbb2", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4146.0, + "y": -2833.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "281bcee4777040f8a31ee0e10344e98d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "b163c9f1666644b0bba62cf0e12df7bc", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4373.0, + "y": -2715.0, + "width": 180.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "cce40479b6284b6fa3174db9f09d0ac9" + }, + { + "m_Id": "80e665a5eeb64730a51742f698bf0d48" + }, + { + "m_Id": "1f46181633594ae0a1fb2adb76b42981" + }, + { + "m_Id": "8cbd81814903479ea1d3151c1f38183e" + }, + { + "m_Id": "cfaf3f3a5a1146e194cddad30c95aada" + }, + { + "m_Id": "b43489e37a5c4df88f15844292a55ec7" + }, + { + "m_Id": "cd7281fb41aa4e61ac0fdf71d4f4bd46" + }, + { + "m_Id": "f01d52cdcb1647aab35782b4af535efd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 1, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b224a1cf80604103ad085c799995f3c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b2728d0dd3ce40678867c94a7d977916", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b2baf44eae52473cb6cda7b1debece01", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b2c26292b7434733878a9b042f44de89", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "b30617d78dec40a7b8aa7f72dca7f41d", + "m_Id": 0, + "m_DisplayName": "Bent Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BentNormal", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b42e6dbfbc864097af182cbff5c0c1fb", + "m_Id": 0, + "m_DisplayName": "Outline Color 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b43489e37a5c4df88f15844292a55ec7", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "b4a40cb6acd441acb83cfe0240bf910d", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4750.99951171875, + "y": -4274.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "d0b10e52e21941b183f5f635894c76c8" + }, + { + "m_Id": "0d6a57754b824f6db9cefa6953bc06a9" + }, + { + "m_Id": "773b90134e894e429203c0c83e80b9de" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "b4c4676c68bb4752af59e21f896d9470", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "b571db753a1948d5a6f1de4e7d0c7238", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5581.99951171875, + "y": -3867.0, + "width": 183.99998474121095, + "height": 100.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "5b3ff4ee364f4d7a923b530ad60d8762" + }, + { + "m_Id": "c183b5bd9bbe45089f93996e73110918" + }, + { + "m_Id": "1196ae398cc348349ab0c1a23fdab4bd" + }, + { + "m_Id": "183118ca50814141b7bc3e0cee27fb9b" + }, + { + "m_Id": "f44e4374a48a4996aa60d23d3ae1e9f9" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b691728a389a417d9b4f2d02541209c2", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b7f9ac55517141868bfb9d2ad6429792", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b85d677872b44421bf5536f42ba0267c", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b911c23b90124d15924551e2730501eb", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "bc782d8e80154073b48a687a07adf60a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BentNormal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b30617d78dec40a7b8aa7f72dca7f41d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BentNormal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "bc9afcb18afa4ccc82d2cdc34d3f4641", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -5392.0, + "y": -3867.0, + "width": 125.99999237060547, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "5e42524569844befad16fda5a94eb9cb" + }, + { + "m_Id": "54d7a93ffec5490aa4591da23a21b693" + }, + { + "m_Id": "aa2794b8f0e24bf281d22e0fef0647be" + }, + { + "m_Id": "200245fc8bbe4826b209ab5f7ffe074c" + }, + { + "m_Id": "fc2e62201c5847e798fd939314413fcd" + }, + { + "m_Id": "fe11fa80cc1847a5a37f6757d521cf25" + }, + { + "m_Id": "de0c6f7f7af94defa6c3dbc6433de9d4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "be58359e488f42e9b5121357d0fa526b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Metallic", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "77991fa631724e0cb32eed66ff017b23" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Metallic" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c183b5bd9bbe45089f93996e73110918", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "c234e5216678436195ee1a5914bc79da", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4446.0, + "y": -2347.000244140625, + "width": 222.00001525878907, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "b4c4676c68bb4752af59e21f896d9470" + }, + { + "m_Id": "3db1608e927e4102a3c3a88e9fcab39a" + }, + { + "m_Id": "0f7ffb6d2de4447f9736780cbcee8e07" + }, + { + "m_Id": "d4954b7bbbb0412cbc997bcbe7dfa808" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "c35312edaa2344788b1964ee2f63a236", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "c3e6d7c20c184bf39fd8822130e693e7", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "c417006ffa034c44b79da3dd323165ff", + "m_Guid": { + "m_GuidSerialized": "7a28a011-205c-4fa8-bf4f-8064aa2308b2" + }, + "m_Name": "_ScaleRatioA", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_ScaleRatioA", + "m_DefaultReferenceName": "_ScaleRatioA", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "c422a9a9ff824176aad2241f58c44d0b", + "m_Id": 0, + "m_DisplayName": "Outline Offset 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "c478c32c45884c57a62f7b2aa8ddc3b0", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c49cfb8bb96846dc87ee00c0c041a372", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c52a1744a9a14989b0ae452ad6de6061", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c6bdb985bc16435fa72f5a3c81bb633c", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c7d4094601ac4bc1aead609c72b1f1c1", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c7ddee91dc5b48dc828309c77fdb0b88", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4266.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a7942746b5564dc7bbbae1deb2403022" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "c88fcbaeea954a5f9c68c339fa8b604d", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c9b722d107ce4cd6a748c883472b9b0f", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c9d7f0dbae7d422985a1cc87c025e76b", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4315.0, + "y": -3165.0, + "width": 144.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "79147f6986644769b58d9ed64fe771e1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "c9ec735d1a1046769e5601b2c97c849a", + "m_Guid": { + "m_GuidSerialized": "281a9526-c332-4471-a44e-ece4a1e95ef6" + }, + "m_Name": "Face Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_75569DEA", + "m_OverrideReferenceName": "_FaceTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ca2a1083dc014f39ab8af0cdf140866b", + "m_Id": 0, + "m_DisplayName": "_FaceTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "cb3c0c3f08654b068bea44c4ffb15f4a", + "m_Guid": { + "m_GuidSerialized": "21009d12-8d94-4273-b0d0-a8ee0608ddcf" + }, + "m_Name": "OutlineMode", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_cb3c0c3f08654b068bea44c4ffb15f4a", + "m_OverrideReferenceName": "_OutlineMode", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cb5e9f9567e84f8fa5463efc0e256e19", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "cb7117ecb1d047a8b2cb00ed552cb181", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3032.66650390625, + "y": -3029.33349609375, + "width": 200.0, + "height": 41.33349609375 + } + }, + "m_Slots": [ + { + "m_Id": "724e17584e97443e9e285dfa7253c8e3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cc88101667c9488f9c5a716e851c1b21", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cce40479b6284b6fa3174db9f09d0ac9", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "cd7281fb41aa4e61ac0fdf71d4f4bd46", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cda5e3b4c1054bf3a65c0b7ec6bc778a", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "cdddee3a537c464697357f11b966f9b8", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4420.0, + "y": -4483.0, + "width": 156.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "41b9b79b3859472882bcea393703eec0" + }, + { + "m_Id": "c7d4094601ac4bc1aead609c72b1f1c1" + }, + { + "m_Id": "767769f736d5478cba5f10a415e28e7f" + }, + { + "m_Id": "b691728a389a417d9b4f2d02541209c2" + }, + { + "m_Id": "045c4f6b050549c7a0efb208e6349779" + }, + { + "m_Id": "509e6f38505b4b0695b263706a55028f" + }, + { + "m_Id": "204dacb5a95b424facf11cb6f65bd188" + }, + { + "m_Id": "35cbea6373dd4e4f8d0fea36e8add392" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "cfaf3f3a5a1146e194cddad30c95aada", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d0a791a544614667962a9a9a9ce0c68a", + "m_Title": "Screen Space Ratio", + "m_Position": { + "x": -6179.99951171875, + "y": -3422.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d0b10e52e21941b183f5f635894c76c8", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d1a17e42e7a04dc38984e3c01149445b", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d219977210094c0082c517d8dc00c8bb", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d258902c6ec74942afdb9ebf8c1d07f8", + "m_Title": "Generate Normal", + "m_Position": { + "x": -4511.33349609375, + "y": -3999.3330078125 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "d30452ac6b244ecca03df4d7b4de9f81", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d48c3871e3064027a10ae9f4babd3be0", + "m_Id": 0, + "m_DisplayName": "_UnderlaySoftness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d4954b7bbbb0412cbc997bcbe7dfa808", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "d4df208fc23b42f2b52364124f1b661c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5268.0, + "y": -3261.0, + "width": 159.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "757174b6f25040fdbb20355a21752222" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "d5173cc3c6cd4f1998550f3187a3e9c8", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d6a6a119394e4082a11bc024a6e42ef8", + "m_Id": 0, + "m_DisplayName": "Outline Color 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d880558893fb442b9320cf55885d1117", + "m_Id": 0, + "m_DisplayName": "_FaceUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d8edec16956c4f15b7d51d6ec10753f4", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d9bcb754db834583b6518c5ed5152114", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d9dc4839ee2847999110bdb234d6041a", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "da7a06d393a44089842070d51d2aa0a6", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "daaf032a109749a88c9b8ff8e1f8b541", + "m_Title": "Offset Scale", + "m_Position": { + "x": -5747.99951171875, + "y": -3961.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "dbcb748279484a4590e53518c49122b8", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4783.0, + "y": -2765.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "7a0f504e4175406dbd8134250f4e350b" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "dc75c4e3a1bc4bb0a128086c2b0679a5", + "m_Guid": { + "m_GuidSerialized": "85cd941f-2fd2-43a3-b0fa-9f728bfb4220" + }, + "m_Name": "Face Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_99AFBB3D", + "m_OverrideReferenceName": "_FaceColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "de0c6f7f7af94defa6c3dbc6433de9d4", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "deac82280a2b43078e0e40863e2d974c", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "def8e0b9d8384982bc5b4c32d877e458", + "m_Id": 0, + "m_DisplayName": "Outline Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "dff7a66b353a4023b29c9d937da77960", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4602.0, + "y": -4298.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "7b8a19bd115e4167a25b59cb3218a817" + }, + { + "m_Id": "0b57f2d35157477ab2b29a5aac14ae8b" + }, + { + "m_Id": "e9e06fcb161e44ba8cc9f6f60264df78" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "e141833aa78b4fd59ecad949beb43a78", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e2d28f29bbac4983a401574480b5ca28", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e364823e158a407fb48dd7b630c79973", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "e386b183a18245a796b024022f7f3074", + "m_Id": 0, + "m_DisplayName": "Normal (Object Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalOS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e444f2c81d1e48329fa2c91005277e8d", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "e495a9f7a11f4eb89334e83be154ceb9", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e51a636b2621440eb94cc802c1cf4bfc", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e591df3a1eb94e259b762f2830b407e2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Emission", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "4590bfa2a0664b65b6f073bae33a071f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Emission" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e6e80c6b0db545cda26b079a9a78fbb3", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "e818605f8f5a4f01bf61caaa33693581", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "ComputeSDF44 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4144.0, + "y": -3369.0, + "width": 244.0, + "height": 214.0 + } + }, + "m_Slots": [ + { + "m_Id": "641eda269d7b4da9acb65f8d50035ea9" + }, + { + "m_Id": "f6823778a3cf42d5bbe8a83e5f9c9fa3" + }, + { + "m_Id": "9c26fdddba244d36a854298c00473247" + }, + { + "m_Id": "f684c5678e9e4f078157a3ab7ef5057b" + }, + { + "m_Id": "14ad19bf20a140dd88d58452d7df688b" + }, + { + "m_Id": "215a82c127204988b751de7d3a39b955" + }, + { + "m_Id": "c478c32c45884c57a62f7b2aa8ddc3b0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF44", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e9e06fcb161e44ba8cc9f6f60264df78", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebbd94a7102a4457a48ac492de3bff14", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebd6d75abcb84108bcadbfe7ee5f6244", + "m_Id": 7, + "m_DisplayName": "TextureHeight", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureHeight", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "ec184d6d9fb2494897774c9e7d279e6d", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4803.0, + "y": -2627.0, + "width": 165.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ca2a1083dc014f39ab8af0cdf140866b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "07946387933e416db576b677f0711e5f" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "ec1f2e8bc9fd4ae38b133c60ee6c49b8", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4957.99951171875, + "y": -3204.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "748c31bbcecc4b30bec2e42c0612175b" + }, + { + "m_Id": "4bda5c294e1949138d033640e1d385b4" + }, + { + "m_Id": "4e64dac49ddc47c3b5b1e27b17a08304" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "ec79eb447dfd47a9b3380344c6a60f43", + "m_Guid": { + "m_GuidSerialized": "54c77f8b-0534-4b35-a3f0-83ab2ebe6c1f" + }, + "m_Name": "_OutlineTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1774DE83", + "m_OverrideReferenceName": "_OutlineTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "ecf16c34d46f4502ac601f0c38c7576b", + "m_Title": "Vertex Color", + "m_Position": { + "x": -3448.000244140625, + "y": -3579.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ed1d1f1613334c3bb904dd08161cd7e5", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ed6c215a65584deeaefad1d2c7743044", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "edbee7a8952b46529ac5ad0365775774", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "ef0b93f78372439696f50711eaf57d90", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.7353569269180298, + "y": 0.7353569269180298, + "z": 0.7353569269180298 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "ef9738ec7e894772a14e9dce441c16c6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "f01d52cdcb1647aab35782b4af535efd", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "f23a8b2b7c85478388ff7a8c8a6de740", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Layer4 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3849.999755859375, + "y": -3286.0, + "width": 193.0, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "0fac35636fca4474a6afaefc3c757775" + }, + { + "m_Id": "cc88101667c9488f9c5a716e851c1b21" + }, + { + "m_Id": "68ec7c31365549d6a8ce883edfc02de2" + }, + { + "m_Id": "02559cbe5ad441a3904ccb75ded2b2c5" + }, + { + "m_Id": "34a67e0fef884f9399e674d9eeaf720c" + }, + { + "m_Id": "3802c81c3be24823aa1d7c9997a33c29" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer4", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f2903158b3624759bca1fcd843698078", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f2a351a5375c441b8d9ab7e2c9545a77", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "f383b24f0bc6434dafe44b3e3d338a63", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6012.99951171875, + "y": -3209.0, + "width": 183.99998474121095, + "height": 100.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "fb5e1e2a67c14602808358686bb75091" + }, + { + "m_Id": "712da461f71a454db59d349f752d41ee" + }, + { + "m_Id": "b000f852aa984e9dae25b125a4607f4e" + }, + { + "m_Id": "b911c23b90124d15924551e2730501eb" + }, + { + "m_Id": "c49cfb8bb96846dc87ee00c0c041a372" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "f3d31c1f18d8491a8ecf5cbc37e4b7db", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4321.99951171875, + "y": -3246.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ed1d1f1613334c3bb904dd08161cd7e5" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f42ad06b3c6a45d3ab33de904c063412", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f44e4374a48a4996aa60d23d3ae1e9f9", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f48f04ad45d046a8b88e71731ed506e7", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f4ecc442a2d246759f7c2c0412953d28", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a3f8b6e8ae7f48e2989a029904401502" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f5a8bfcec21a4dac9df63993ec53635e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalTS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "7564379492aa4c5a927ff3501acdc70d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalTS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f6823778a3cf42d5bbe8a83e5f9c9fa3", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f684c5678e9e4f078157a3ab7ef5057b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": { + "x": 3.0, + "y": 2.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "f814deb543c24fbbafbcdb5071d96022", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4600.0, + "y": -3245.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "abd59150589b436cadf8c9e6f43ccb8e" + }, + { + "m_Id": "7acfafd73b8c4dfab8c55c18a887e087" + }, + { + "m_Id": "928621a3ca2d41c89a10336bbbc81ddc" + }, + { + "m_Id": "b7f9ac55517141868bfb9d2ad6429792" + }, + { + "m_Id": "09b1b86c1c074337a4c439d3a308dd2e" + }, + { + "m_Id": "1f247658c7ba45fb93c41f51e21acb0d" + }, + { + "m_Id": "d30452ac6b244ecca03df4d7b4de9f81" + }, + { + "m_Id": "215b30ae27784ec3a13360a9029af283" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f864c900600e427ba7793f00c715e971", + "m_Id": 0, + "m_DisplayName": "Outline Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fa6de3be9f5b4411b5081b49e645f424", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DivideNode", + "m_ObjectId": "faace8101df943d8956faa31728cb004", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Divide", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5254.99951171875, + "y": -3891.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "77e28f3e930b4c249145630ec961af95" + }, + { + "m_Id": "f2903158b3624759bca1fcd843698078" + }, + { + "m_Id": "30ca940fe2794c949f2a1d4d2caaa446" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "facc84930f544fd7a0205a6176b18ac0", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "fb15d0ba56d54a6192f11e107aeb5fa8", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fb5e1e2a67c14602808358686bb75091", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "fc2e62201c5847e798fd939314413fcd", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fd0b096ed5b74f9e9ec51327be200731", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "fdb77c3e92ee497b88ca5dc46dc45350", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4208.0, + "y": -2371.0, + "width": 180.0, + "height": 180.0 + } + }, + "m_Slots": [ + { + "m_Id": "4328cdbf78b94c038fd614c59bfe1cac" + }, + { + "m_Id": "04dfcc9ff13a4bf282ed46faec39d15c" + }, + { + "m_Id": "71dd947935b64ce38f0d25406dde447b" + }, + { + "m_Id": "61a6ac5f29344d109411f26850ab0a96" + }, + { + "m_Id": "44806230fa384c1e95f9c5918a14f056" + }, + { + "m_Id": "4eb3c00a1ca44e10be833b7ca61ff059" + }, + { + "m_Id": "57abc172afd449e2a4d567f93432507b" + }, + { + "m_Id": "cda5e3b4c1054bf3a65c0b7ec6bc778a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "fe11fa80cc1847a5a37f6757d521cf25", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "ffb07af0bca546d8b9bc439d34aa68f5", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph.meta b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph.meta new file mode 100644 index 00000000..a445e27d --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ca2ed216f98028c4dae6c5224a952b3c +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph new file mode 100644 index 00000000..3118dd04 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph @@ -0,0 +1,11759 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "386c36a1c4c34ea29deb680fb82cfe8b", + "m_Properties": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "ced40c943add479a86f25f7fb5ed59da" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "469965f1c9284b7eb032d415d6295b2c" + } + ], + "m_Nodes": [ + { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + }, + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + { + "m_Id": "e591df3a1eb94e259b762f2830b407e2" + } + ], + "m_GroupDatas": [ + { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + } + ], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 5 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 7 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 6 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 1 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": -2506.000244140625, + "y": -3749.0 + }, + "m_Blocks": [ + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": -2506.000244140625, + "y": -3480.0 + }, + "m_Blocks": [ + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "e591df3a1eb94e259b762f2830b407e2" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"fileID\":10210,\"guid\":\"0000000000000000e000000000000000\",\"type\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "TextMeshPro/SRP", + "m_GraphPrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "7cf0e63037a74dc2a9f591225c678ff4" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "007c75c776ac4f1babe9cd7ae1fc4f14", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5722.99951171875, + "y": -3827.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1356dc7cbdfa4199a6535d3bbf4cd536" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.BuiltinData", + "m_ObjectId": "00996039d61e400a9e854ce591ac35a0", + "m_Distortion": false, + "m_DistortionMode": 0, + "m_DistortionDepthTest": true, + "m_AddPrecomputedVelocity": false, + "m_TransparentWritesMotionVec": false, + "m_DepthOffset": false, + "m_ConservativeDepthOffset": false, + "m_TransparencyFog": true, + "m_AlphaTestShadow": false, + "m_BackThenFrontRendering": false, + "m_TransparentDepthPrepass": false, + "m_TransparentDepthPostpass": false, + "m_TransparentPerPixelSorting": false, + "m_SupportLodCrossFade": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "013228b0fdf1424097798f0973a9a4fb", + "m_Title": "Face Texture", + "m_Position": { + "x": -4824.0, + "y": -2949.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "02559cbe5ad441a3904ccb75ded2b2c5", + "m_Id": 5, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "03182b3263304258b265266325c21f65", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "045c4f6b050549c7a0efb208e6349779", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "04dc152dd2ba4d519391577eb1156235", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4534.0, + "y": -2747.0, + "width": 150.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "3d04f5ba6e7b40d281f22eb424145acd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "04dfcc9ff13a4bf282ed46faec39d15c", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "05805bc6fcc941fd889922555c6c86d7", + "m_Guid": { + "m_GuidSerialized": "fe84e680-4cee-4ca5-be86-2e293a9ba093" + }, + "m_Name": "Ambient Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_05805bc6fcc941fd889922555c6c86d7", + "m_OverrideReferenceName": "_Ambient", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "0580d4b7e3a049049569f4508643a724", + "m_Guid": { + "m_GuidSerialized": "eefb88c5-7665-45dc-b3c2-7cf98b9990d6" + }, + "m_Name": "Softness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_D64EC33D", + "m_OverrideReferenceName": "_Softness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "068ae649e00b40e198ec5a30ad741fab", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0699eea947fc426cbfeb8744cf120222", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "07946387933e416db576b677f0711e5f", + "m_Guid": { + "m_GuidSerialized": "21d612fb-8153-41f8-9e2f-9de044c19fbf" + }, + "m_Name": "_FaceTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1A08AD4A", + "m_OverrideReferenceName": "_FaceTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "082e9706dffc4c188270980d4e44ce0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0848ba750e0341198cf0bbd413e0efe4", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "09b1b86c1c074337a4c439d3a308dd2e", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0a67ca5280214bd794dc0ad66b5710a9", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0b57f2d35157477ab2b29a5aac14ae8b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0ba4932e164847878ddb7b7bcff96985", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0c4dc51f26484c26ad88a3fe4002abcd", + "m_Id": 2, + "m_DisplayName": "Color (1)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "0d6a57754b824f6db9cefa6953bc06a9", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0d7878dd226d4cfb81a991dc312309fc", + "m_Id": 0, + "m_DisplayName": "Underlay Dilate", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "0f7ffb6d2de4447f9736780cbcee8e07", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0fac35636fca4474a6afaefc3c757775", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "105b1ed1aa714e41bbe1ef5472bdb11f", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4923.99951171875, + "y": -4233.0, + "width": 158.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "8a08179f99d649d289b8053d5fa0ad22" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "109f638d1f9b49d4991d6d21a86d4eb7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5098.99951171875, + "y": -3182.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "880bb02c6c6b49b18aa6ebc66dc566a0" + }, + { + "m_Id": "1b9cd8f5f4004e2eaf8afbaab803bc04" + }, + { + "m_Id": "b224a1cf80604103ad085c799995f3c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "10a99c07aad742349d258db16838c129", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1196ae398cc348349ab0c1a23fdab4bd", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1356dc7cbdfa4199a6535d3bbf4cd536", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "14ad19bf20a140dd88d58452d7df688b", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "150533bad8e2424aaa2c74e253af8592", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4955.0, + "y": -3487.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "72fb5a0d7796446b9e2b929cb32facdc" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "163beb4431c34f538340bc0af0991e6f", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3284.0, + "y": -3516.0, + "width": 119.99999237060547, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c334de01ecd429baa7652fc6002536b" + }, + { + "m_Id": "e2d28f29bbac4983a401574480b5ca28" + }, + { + "m_Id": "6a7af6143e114a538663e71f56731a21" + }, + { + "m_Id": "3e25be96bb3747738c238cf3a741d5df" + }, + { + "m_Id": "4907352322c644ebacdf2ca30f2994fd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "19075add867e4757b9520d18fe8de1d0", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4291.99951171875, + "y": -3197.0, + "width": 124.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c28ee9109014fa086e5de7a3993341d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "0580d4b7e3a049049569f4508643a724" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1b9cd8f5f4004e2eaf8afbaab803bc04", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1bdde3efd3b7464b8934c555be0f8a48", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "1be90d4f96a841748b0c95219b12ad27", + "m_Guid": { + "m_GuidSerialized": "4c91c146-43bb-4de8-948a-fbf8b1da10e1" + }, + "m_Name": "Bevel Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_97690701", + "m_OverrideReferenceName": "_BevelOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": -0.5, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "1c4df61c2fea404eb3b87b270d7c59bc", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4311.0, + "y": -3221.0, + "width": 148.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "f864c900600e427ba7793f00c715e971" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1d35fa1fb5004f96a65ace54fbe4f1ad", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1db37082bf844442804487b4944352de", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1df58cfa4dad4c449d01ee1c5ea05f2e", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "1e12726617b24675958e942eb62e4b09", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4772.0, + "y": -4404.0, + "width": 145.00001525878907, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "0848ba750e0341198cf0bbd413e0efe4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1f247658c7ba45fb93c41f51e21acb0d", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1f46181633594ae0a1fb2adb76b42981", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "200245fc8bbe4826b209ab5f7ffe074c", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "204dacb5a95b424facf11cb6f65bd188", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "215a82c127204988b751de7d3a39b955", + "m_Id": 6, + "m_DisplayName": "Outline", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Outline", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "215b30ae27784ec3a13360a9029af283", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "21a7a380e66d42e780e2a2a1baa630d5", + "m_Guid": { + "m_GuidSerialized": "b2d0099f-e605-49f5-9959-e7cacae37aa3" + }, + "m_Name": "Bevel Type", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_21a7a380e66d42e780e2a2a1baa630d5", + "m_OverrideReferenceName": "_BevelType", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e", + "m_Guid": { + "m_GuidSerialized": "cd167d3a-7465-4d5a-86fc-0f22dc0ef908" + }, + "m_Name": "Outline Color 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_5550EB71", + "m_OverrideReferenceName": "_OutlineColor1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "232b1aa09e67479abae141d3c76d3c5b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "256d41e89a204d22951450de1c38051d", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "26e48352a08441bfa694dcea54c06e36", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "281bcee4777040f8a31ee0e10344e98d", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "285f6a9863d54ed2a8150727ad749456", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4181.99951171875, + "y": -2415.0, + "width": 154.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "b42e6dbfbc864097af182cbff5c0c1fb" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDUnlitSubTarget", + "m_ObjectId": "29b1a6d4abc94131be838c0bc77892fc" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.IsFrontFaceNode", + "m_ObjectId": "2a552a0b828f457c911aa19561e410ae", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Is Front Face", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4282.0, + "y": -3681.3330078125, + "width": 121.99999237060547, + "height": 77.33348846435547 + } + }, + "m_Slots": [ + { + "m_Id": "2ef1d888dc9d49e59d6a6950897ddc93" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "2ac79705aa9e415dbb74ec215233fd1b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Composite (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3350.0, + "y": -3810.0, + "width": 213.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "a75f7ac601c446469802fe7754c1f279" + }, + { + "m_Id": "8c38a5d8327f456e9783740c05382619" + }, + { + "m_Id": "facc84930f544fd7a0205a6176b18ac0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Composite", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2b01ea3023e34c94af1754e4dcea8f2e", + "m_Id": 0, + "m_DisplayName": "Face Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2bf5f2fdd2984599b7323d10cfb1d240", + "m_Id": 1, + "m_DisplayName": "Filter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Filter", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "2c10b97b92c947ceb307a93759c0228b", + "m_Guid": { + "m_GuidSerialized": "6be0b8ff-a766-4c6b-a6e4-3a72758ac95f" + }, + "m_Name": "Bevel Amount", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B01DD93E", + "m_OverrideReferenceName": "_BevelAmount", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.25, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2c7a9460724b47daad8df1be144de7c6", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "2d0a269511e34bd1ba9056d2c939dff2", + "m_Guid": { + "m_GuidSerialized": "edbe73dc-53ab-4bc1-9d64-ab36e0e05f03" + }, + "m_Name": "_FaceUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_3A8E0F13", + "m_OverrideReferenceName": "_FaceUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "2db15d90c2204143b225ec4ef08d0755", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4387.0, + "y": -2405.0, + "width": 163.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "def8e0b9d8384982bc5b4c32d877e458" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "2e4eb1ef08bb44178c82e53872485e0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2ef1d888dc9d49e59d6a6950897ddc93", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": true, + "m_DefaultValue": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.SystemData", + "m_ObjectId": "305e3be306674fcd8bb02273d27ee5b7", + "m_MaterialNeedsUpdateHash": 1, + "m_SurfaceType": 1, + "m_RenderingPass": 4, + "m_BlendMode": 0, + "m_ZTest": 4, + "m_ZWrite": false, + "m_TransparentCullMode": 2, + "m_OpaqueCullMode": 2, + "m_SortPriority": 0, + "m_AlphaTest": true, + "m_TransparentDepthPrepass": false, + "m_TransparentDepthPostpass": false, + "m_SupportLodCrossFade": false, + "m_DoubleSidedMode": 0, + "m_DOTSInstancing": false, + "m_CustomVelocity": false, + "m_Tessellation": false, + "m_TessellationMode": 0, + "m_TessellationFactorMinDistance": 20.0, + "m_TessellationFactorMaxDistance": 50.0, + "m_TessellationFactorTriangleSize": 100.0, + "m_TessellationShapeFactor": 0.75, + "m_TessellationBackFaceCullEpsilon": -0.25, + "m_TessellationMaxDisplacement": 0.009999999776482582, + "m_DebugSymbols": false, + "m_Version": 2, + "inspectorFoldoutMask": 9 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "30ca940fe2794c949f2a1d4d2caaa446", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "319916a5921343f7b7eef0e50dc93def", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4791.0, + "y": -3245.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "d219977210094c0082c517d8dc00c8bb" + }, + { + "m_Id": "f48f04ad45d046a8b88e71731ed506e7" + }, + { + "m_Id": "e6e80c6b0db545cda26b079a9a78fbb3" + }, + { + "m_Id": "c6bdb985bc16435fa72f5a3c81bb633c" + }, + { + "m_Id": "d1a17e42e7a04dc38984e3c01149445b" + }, + { + "m_Id": "fb15d0ba56d54a6192f11e107aeb5fa8" + }, + { + "m_Id": "c35312edaa2344788b1964ee2f63a236" + }, + { + "m_Id": "c88fcbaeea954a5f9c68c339fa8b604d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "34a67e0fef884f9399e674d9eeaf720c", + "m_Id": 6, + "m_DisplayName": "Color3", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color3", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "34a72a5ebb04402384a4fd3748111a37", + "m_Id": 0, + "m_DisplayName": "Alpha Clip Threshold", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AlphaClipThreshold", + "m_StageCapability": 2, + "m_Value": 0.0010000000474974514, + "m_DefaultValue": 0.5, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3535ae87c6dd4769b52b20d9eca61069", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "35cbea6373dd4e4f8d0fea36e8add392", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "36a0c473c4c04c3a930dd38f3920d410", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "36f1b4d96f2941c39e5cd95d9c1d2ce6", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6008.99951171875, + "y": -3341.0, + "width": 144.99998474121095, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "65b3dc13b2b6484283ffe5abfe87a06a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "373f1de8db6c429c9d46c781f741d7a4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3802c81c3be24823aa1d7c9997a33c29", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "3915c1927ffe49f8967304321cfbe497", + "m_Id": 4, + "m_DisplayName": "Atlas", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Atlas", + "m_StageCapability": 3, + "m_BareResource": true, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "39a382d661e2484da71f04c43f48e55f", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "39f2f84f30304d859fb07569e2695f60", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3423.000244140625, + "y": -3516.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "4b2d9ea03bf64fa19dcae1511d2581da" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3c50439118b2496f9e390021b0964606", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.AlphaClipThreshold", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3028.0, + "y": -3054.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "34a72a5ebb04402384a4fd3748111a37" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.AlphaClipThreshold" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3d04f5ba6e7b40d281f22eb424145acd", + "m_Id": 0, + "m_DisplayName": "Face Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3db1608e927e4102a3c3a88e9fcab39a", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3dccd64e7f324bc1a75c1479d7a67c51", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "3e231021af7b47ba97f2871e7f25d0fe", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2803.000244140625, + "y": -3520.0, + "width": 140.0, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "6ccaced3889e4503a9414d808ec33981" + }, + { + "m_Id": "7f3d71a6c96847c099da45f95aafbecb" + }, + { + "m_Id": "d8edec16956c4f15b7d51d6ec10753f4" + }, + { + "m_Id": "39a382d661e2484da71f04c43f48e55f" + }, + { + "m_Id": "8764669016f6442f8152593c18a649d7" + }, + { + "m_Id": "26e48352a08441bfa694dcea54c06e36" + }, + { + "m_Id": "3e94a0d106064bdb864c960512ef4026" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3e25be96bb3747738c238cf3a741d5df", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "3e372195f4bd4845852a37839e5b602d", + "m_Guid": { + "m_GuidSerialized": "60abd046-2a1a-48cd-a0af-2f702f7f53ab" + }, + "m_Name": "_MainTex", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_90CBF488", + "m_OverrideReferenceName": "_MainTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":28684132378477856,\"guid\":\"8f586378b4e144a9851e7b34d9b748ee\",\"type\":2}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "3e94a0d106064bdb864c960512ef4026", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "3ec4797e381747829ef4712c85fcf7a1", + "m_Guid": { + "m_GuidSerialized": "020d65cc-50a8-4b8a-a624-90d7b489f549" + }, + "m_Name": "Specular Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_3ec4797e381747829ef4712c85fcf7a1", + "m_OverrideReferenceName": "_SpecularPower", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 1.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 4.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "3fdf4b7bc5d4426492dcc057603ef4a6", + "m_Guid": { + "m_GuidSerialized": "675d2567-3fca-4da6-9462-dfa4924950f1" + }, + "m_Name": "_OutlineUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_D66D89E6", + "m_OverrideReferenceName": "_OutlineUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "400d0b6c95dd4540ad3da3e8cb7e50b2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "41986ac6400d46709d0ef043a67f6b34", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "41b9b79b3859472882bcea393703eec0", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "424dbeeb009344efa29c304c4979e3d6", + "m_Guid": { + "m_GuidSerialized": "314c37de-c6f2-4463-866d-8588f6fc119e" + }, + "m_Name": "Diffuse Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_424dbeeb009344efa29c304c4979e3d6", + "m_OverrideReferenceName": "_Diffuse", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "42a586e4f6ec40eeaba891b7fd133864", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4934.0, + "y": -4442.99951171875, + "width": 133.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "da7a06d393a44089842070d51d2aa0a6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "42cadae0923e4969b50bbc3f78185934", + "m_Title": "Face + 3 Outlines + Underlay", + "m_Position": { + "x": -5468.0, + "y": -3558.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4328cdbf78b94c038fd614c59bfe1cac", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "44317f2e371447e2a8d894f8a021a235", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Layer1 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4001.0, + "y": -4168.0, + "width": 191.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "10a99c07aad742349d258db16838c129" + }, + { + "m_Id": "b85d677872b44421bf5536f42ba0267c" + }, + { + "m_Id": "75aba700d74d4b2687bf3166cf1da3e2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer1", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "44806230fa384c1e95f9c5918a14f056", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4488af8ff6a7421298a7e827f567263b", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4109.0, + "width": 158.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "66f69ef16eac4eb48357bde804cf3c39" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "4590bfa2a0664b65b6f073bae33a071f", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 1, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "4648b46ad29a4008a80de4f8a5a5b813", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4613.0, + "y": -2415.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "b2baf44eae52473cb6cda7b1debece01" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "469965f1c9284b7eb032d415d6295b2c", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "ced40c943add479a86f25f7fb5ed59da" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "46fbf3eeb0ea4470869cba7443249295", + "m_Guid": { + "m_GuidSerialized": "be87c5a3-e361-4b95-89c8-911c39a51c0d" + }, + "m_Name": "Outline Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_A0B54237", + "m_OverrideReferenceName": "_OutlineTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "47d020251e9841a5b1f0fd64396026a1", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "48390d02257d41bf98eace1deaa4c539", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "8036d0e6090b456e9b4ea87227868236" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "484b51c50485473b819c4f05087b32d7", + "m_Title": "Underlay", + "m_Position": { + "x": -5253.0, + "y": -4542.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4907352322c644ebacdf2ca30f2994fd", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "49e7c3ad55ce458797f0e60c950cb965", + "m_Guid": { + "m_GuidSerialized": "31b55db9-0da1-4ec4-af2b-d83747ed5bc4" + }, + "m_Name": "Underlay Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_CE9DEDB3", + "m_OverrideReferenceName": "_UnderlayOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4a66dcbe712a4d40bd8f355b834594b5", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "4abff6ff92fa4a05b203f10580988335", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4323.99951171875, + "y": -3498.0, + "width": 140.0, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "b015d1b7e4134c59baf6851e7649802c" + }, + { + "m_Id": "d9dc4839ee2847999110bdb234d6041a" + }, + { + "m_Id": "91d6a9a5fbc04ea49075cb51835e7264" + }, + { + "m_Id": "f42ad06b3c6a45d3ab33de904c063412" + }, + { + "m_Id": "ed6c215a65584deeaefad1d2c7743044" + }, + { + "m_Id": "edbee7a8952b46529ac5ad0365775774" + }, + { + "m_Id": "70337a74f6ad4b7bb6befc825219bab1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4b2d9ea03bf64fa19dcae1511d2581da", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4bda5c294e1949138d033640e1d385b4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4c28ee9109014fa086e5de7a3993341d", + "m_Id": 0, + "m_DisplayName": "Softness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4c334de01ecd429baa7652fc6002536b", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4d1cb1a475df49f9a148195a65f5453a", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4d9ce48719d143748f9f8e22da6f9ddc", + "m_Id": 5, + "m_DisplayName": "TextureWidth", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureWidth", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4e64dac49ddc47c3b5b1e27b17a08304", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "4eb3c00a1ca44e10be833b7ca61ff059", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4f194ff591484e908fc2bcdacbcf2570", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4310.0, + "y": -2771.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "2b01ea3023e34c94af1754e4dcea8f2e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "509e6f38505b4b0695b263706a55028f", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "51378bae98a94c309785d14cd5cbb453", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "GetSurfaceNormal (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4067.333251953125, + "y": -3881.99951171875, + "width": 263.9999694824219, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "5b0077c23eae443887872f84227deccc" + }, + { + "m_Id": "3915c1927ffe49f8967304321cfbe497" + }, + { + "m_Id": "4d9ce48719d143748f9f8e22da6f9ddc" + }, + { + "m_Id": "ebd6d75abcb84108bcadbfe7ee5f6244" + }, + { + "m_Id": "ef9738ec7e894772a14e9dce441c16c6" + }, + { + "m_Id": "9eeec1a9713045af8845cea263d5ea48" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GetSurfaceNormal", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "51f76f8a53ad43a4ad028426548ce9ba", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "52798bdb86f6400e86489a7a368e9f8b", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6154.99951171875, + "y": -3169.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1df58cfa4dad4c449d01ee1c5ea05f2e" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "53073e5ea924459fa6681a4943e9f947", + "m_Guid": { + "m_GuidSerialized": "5fdac24e-2d58-4471-80ce-79c3ab9a2564" + }, + "m_Name": "Outline Color 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_DBAB5AEC", + "m_OverrideReferenceName": "_OutlineColor2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.009433984756469727, + "g": 0.02534518577158451, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "54d7a93ffec5490aa4591da23a21b693", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "55ffa45ec3654d5e88089fb40d2b0465", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "56c25395796e4d2fbe5c892d428d1620", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5102.99951171875, + "y": -3427.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "9eb8137a6c2e41bbafdc8b0732dd47a3" + }, + { + "m_Id": "36a0c473c4c04c3a930dd38f3920d410" + }, + { + "m_Id": "068ae649e00b40e198ec5a30ad741fab" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "57abc172afd449e2a4d567f93432507b", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "582d6e289dbe4fdca7cf0307273eaa2f", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "59bd90a849624124bae6464ee3669aa6", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4005.999755859375, + "y": -2395.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "2e4eb1ef08bb44178c82e53872485e0f" + }, + { + "m_Id": "8695190a5e614f2d90081871a8a06fc2" + }, + { + "m_Id": "81bdb47901ef48e5a588c6724b1b0142" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "5b0077c23eae443887872f84227deccc", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5b3ff4ee364f4d7a923b530ad60d8762", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5bd258837c514ff7ab0bf7027e762c18", + "m_Guid": { + "m_GuidSerialized": "2d8f3ee9-1307-4b58-a60d-526e86b07109" + }, + "m_Name": "Bevel Roundness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_AB6A015F", + "m_OverrideReferenceName": "_BevelRoundness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5da82bf481f8489ebd05e997f617f51b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": 4.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5e42524569844befad16fda5a94eb9cb", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5fbe253f3e444f2aa8ac717f9c856619", + "m_Guid": { + "m_GuidSerialized": "0a61c93f-6430-4aa6-af07-79bc3b411ccd" + }, + "m_Name": "Bevel Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B50BBFCC", + "m_OverrideReferenceName": "_BevelWidth", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.5, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61133d79a89048c195f54939b2a1d30a", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61a6ac5f29344d109411f26850ab0a96", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6271438664e74b3fbf723bd6a1f50f8b", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "62bc551cea604e88b7858cc37d96a98a", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "636180f6e0504f2baaa5cc086980cb47", + "m_Guid": { + "m_GuidSerialized": "c1223e37-093d-4d5a-b2b0-cd9cc3e4f88e" + }, + "m_Name": "Outline Offset 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_636180f6e0504f2baaa5cc086980cb47", + "m_OverrideReferenceName": "_OutlineOffset1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "63c7cd57fc3c45a9a97b514fdae32693", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5266.99951171875, + "y": -3387.0, + "width": 156.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "c422a9a9ff824176aad2241f58c44d0b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "641eda269d7b4da9acb65f8d50035ea9", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "65b3dc13b2b6484283ffe5abfe87a06a", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "65c8e64a7535466e933eed08a2f77532", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4791.0, + "y": -3499.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "256d41e89a204d22951450de1c38051d" + }, + { + "m_Id": "0a67ca5280214bd794dc0ad66b5710a9" + }, + { + "m_Id": "ebbd94a7102a4457a48ac492de3bff14" + }, + { + "m_Id": "6271438664e74b3fbf723bd6a1f50f8b" + }, + { + "m_Id": "c9b722d107ce4cd6a748c883472b9b0f" + }, + { + "m_Id": "74cf69e61bef44589521f1bf2bf3c59a" + }, + { + "m_Id": "6e532f83d1c44e839bcfc5845d3b01d6" + }, + { + "m_Id": "cb5e9f9567e84f8fa5463efc0e256e19" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "66f69ef16eac4eb48357bde804cf3c39", + "m_Id": 0, + "m_DisplayName": "_UnderlayColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "67a519f507384ff1861df5d8d5b486be", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4278.0, + "y": -3939.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "c3e6d7c20c184bf39fd8822130e693e7" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "68ec7c31365549d6a8ce883edfc02de2", + "m_Id": 4, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6a7af6143e114a538663e71f56731a21", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "6b2f65c1463f4f7bad16c54a95d2fe75", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5101.0, + "y": -3301.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "1d35fa1fb5004f96a65ace54fbe4f1ad" + }, + { + "m_Id": "fa6de3be9f5b4411b5081b49e645f424" + }, + { + "m_Id": "400d0b6c95dd4540ad3da3e8cb7e50b2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6ccaced3889e4503a9414d808ec33981", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6dfc1177dd0541a7a780fbf911ad1956", + "m_Id": 0, + "m_DisplayName": "_OutlineTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6e13f3cd573c467a94379f45d96cb690", + "m_Id": 2, + "m_DisplayName": "SSR", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "6e532f83d1c44e839bcfc5845d3b01d6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6e8946a245e842b38231d4a241bfb3ef", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3026.0, + "y": -3110.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "ef0b93f78372439696f50711eaf57d90" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6fbdcc5a972b4fa883dc5f21e525a376", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "70337a74f6ad4b7bb6befc825219bab1", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "712da461f71a454db59d349f752d41ee", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "71dd947935b64ce38f0d25406dde447b", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "724e17584e97443e9e285dfa7253c8e3", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 0.15000000596046449, + "m_DefaultValue": 1.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "72fb5a0d7796446b9e2b929cb32facdc", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "7444469eb9884253819add9ef96baa25", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4298.0, + "y": -3809.99951171875, + "width": 144.66648864746095, + "height": 129.33323669433595 + } + }, + "m_Slots": [ + { + "m_Id": "03182b3263304258b265266325c21f65" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "748c31bbcecc4b30bec2e42c0612175b", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "74b41464cbed4e9e8e23af5ab9be40cf", + "m_Guid": { + "m_GuidSerialized": "41afbdcb-f3ae-4340-8973-1c1998c992a2" + }, + "m_Name": "Outline Offset 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "74cf69e61bef44589521f1bf2bf3c59a", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "757174b6f25040fdbb20355a21752222", + "m_Id": 0, + "m_DisplayName": "Outline Offset 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "75aba700d74d4b2687bf3166cf1da3e2", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "75c5657544c648058b20cea090f48dbf", + "m_Id": 0, + "m_DisplayName": "_OutlineUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "767769f736d5478cba5f10a415e28e7f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "773b90134e894e429203c0c83e80b9de", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "77e28f3e930b4c249145630ec961af95", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDUnlitData", + "m_ObjectId": "77ebd01f5b3149ad810a5acbffc85921", + "m_EnableShadowMatte": false, + "m_DistortionOnly": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "79147f6986644769b58d9ed64fe771e1", + "m_Id": 0, + "m_DisplayName": "OutlineMode", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7984fd094e1147bdabb4e26fbd3d31c8", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3113.000244140625, + "y": -3468.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "082e9706dffc4c188270980d4e44ce0f" + }, + { + "m_Id": "f2a351a5375c441b8d9ab7e2c9545a77" + }, + { + "m_Id": "41986ac6400d46709d0ef043a67f6b34" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "7a046f410ce64aa88438b0bfd412c045", + "m_Guid": { + "m_GuidSerialized": "d47271f5-5a84-47bf-a09e-c825d2aeb013" + }, + "m_Name": "Outline Color 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_551702C5", + "m_OverrideReferenceName": "_OutlineColor3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "7a0f504e4175406dbd8134250f4e350b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7a80e8839f0e4a1d9a6c0814f8793ee6", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4961.99951171875, + "y": -3452.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "6fbdcc5a972b4fa883dc5f21e525a376" + }, + { + "m_Id": "0ba4932e164847878ddb7b7bcff96985" + }, + { + "m_Id": "9178663316db43d582f1c4a127d307c6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7acfafd73b8c4dfab8c55c18a887e087", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7b3b88c5975841d6b6d5c3c5515055a0", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7b8a19bd115e4167a25b59cb3218a817", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "7c27ccb2c2dc4ca59c5438c3358630ca", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", + "m_ObjectId": "7cf0e63037a74dc2a9f591225c678ff4", + "m_ActiveSubTarget": { + "m_Id": "29b1a6d4abc94131be838c0bc77892fc" + }, + "m_Datas": [ + { + "m_Id": "00996039d61e400a9e854ce591ac35a0" + }, + { + "m_Id": "305e3be306674fcd8bb02273d27ee5b7" + }, + { + "m_Id": "77ebd01f5b3149ad810a5acbffc85921" + } + ], + "m_CustomEditorGUI": "TMPro.EditorUtilities.TMP_SDF_HDRPUnlitShaderGUI", + "m_SupportVFX": false, + "m_SupportLineRendering": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7d7696aa6d184b4fb9c316a9dec37aee", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4959.0, + "y": -3326.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "4d1cb1a475df49f9a148195a65f5453a" + }, + { + "m_Id": "47d020251e9841a5b1f0fd64396026a1" + }, + { + "m_Id": "62bc551cea604e88b7858cc37d96a98a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7d78a616c2754cc28d1f32cf66ade611", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4006.000244140625, + "y": -2795.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "d9bcb754db834583b6518c5ed5152114" + }, + { + "m_Id": "861d4258049a4a3e8164f7297090f88e" + }, + { + "m_Id": "a7c06457d7454693a8bc3dc95257b2c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "7e0fadb2533f496192c1ad3e78642010", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4188.0, + "width": 173.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d48c3871e3064027a10ae9f4babd3be0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "7f2e6b5f15364ed9835d67d0cf4f8f65", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2586.0, + "y": -3592.0, + "width": 200.0, + "height": 41.0 + } + }, + "m_Slots": [ + { + "m_Id": "85ff8667d72947edada4e9fb4ff60559" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7f3d71a6c96847c099da45f95aafbecb", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "8036d0e6090b456e9b4ea87227868236", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "80e665a5eeb64730a51742f698bf0d48", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "8135ca333f8f4ea78163743e6ec1f55c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4081.999755859375, + "y": -3140.0, + "width": 156.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6a6a119394e4082a11bc024a6e42ef8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "81bdb47901ef48e5a588c6724b1b0142", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "81e8ed0534534674a74263e6161a2a1a", + "m_Guid": { + "m_GuidSerialized": "78aab961-c4a8-41f3-b203-1239c3b33b13" + }, + "m_Name": "Underlay Dilate", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_D48690B9", + "m_OverrideReferenceName": "_UnderlayDilate", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "82af2db1018543d7832af96c1cfc981f", + "m_Guid": { + "m_GuidSerialized": "37906c7b-9a3a-454b-a62a-9aa097e64bde" + }, + "m_Name": "Light Angle", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_82af2db1018543d7832af96c1cfc981f", + "m_OverrideReferenceName": "_LightAngle", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 6.28000020980835 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "82d5443fe54d4a3b9420f8745d00a632", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": 8.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "84dc74cdbd8c45e1b189e4fd9a69942d", + "m_Id": 0, + "m_DisplayName": "Outline Offset 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "85a1ad8e741e41759002e8cdc8cd0b96", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "ScreenSpaceRatio (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5802.0, + "y": -3363.0, + "width": 258.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "6e13f3cd573c467a94379f45d96cb690" + }, + { + "m_Id": "8e6ed600f6504f4083092f5b511e44c4" + }, + { + "m_Id": "93b161cce4504cb79c97b6d8db178de7" + }, + { + "m_Id": "2bf5f2fdd2984599b7323d10cfb1d240" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ScreenSpaceRatio", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "85b5940eb77e4625812ded7215bab8d7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4081.999755859375, + "y": -3096.0, + "width": 156.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ada023d617104472b8ab75a81558c0a1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "85ff8667d72947edada4e9fb4ff60559", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "861d4258049a4a3e8164f7297090f88e", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "867a4ae13c0d4a028c71bc1063824c14", + "m_Guid": { + "m_GuidSerialized": "d483c212-0a30-4f6d-b94d-9abbc83a6522" + }, + "m_Name": "Outline Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_C68C9E14", + "m_OverrideReferenceName": "_IsoPerimeter", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 2, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "8695190a5e614f2d90081871a8a06fc2", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8764669016f6442f8152593c18a649d7", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "880bb02c6c6b49b18aa6ebc66dc566a0", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "88253223d2c34ecfab92b0c344048f94", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "ComputeSDF (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4323.0, + "width": 227.99998474121095, + "height": 190.0 + } + }, + "m_Slots": [ + { + "m_Id": "c52a1744a9a14989b0ae452ad6de6061" + }, + { + "m_Id": "a03db80c558b4f87a330c5ae0a9443a5" + }, + { + "m_Id": "8f1b1d1e8ff24b3284993e52354e54fa" + }, + { + "m_Id": "5da82bf481f8489ebd05e997f617f51b" + }, + { + "m_Id": "82d5443fe54d4a3b9420f8745d00a632" + }, + { + "m_Id": "61133d79a89048c195f54939b2a1d30a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8a08179f99d649d289b8053d5fa0ad22", + "m_Id": 0, + "m_DisplayName": "Underlay Offset", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8a39319405ad44cb8b7aae71c41dcd01", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8b66f4e6bc9d4662b3218ac33a69839f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8c38a5d8327f456e9783740c05382619", + "m_Id": 3, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8cbd81814903479ea1d3151c1f38183e", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "8cf8aae64c1d443f9303126886b40f17", + "m_Guid": { + "m_GuidSerialized": "8d78c9a5-aaef-41fb-af68-2358e401d7ac" + }, + "m_Name": "_UnderlayColor", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_2F5FE804", + "m_OverrideReferenceName": "_UnderlayColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8e6ed600f6504f4083092f5b511e44c4", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "8ed907a2cc7949b68a283ae243ea1977", + "m_Guid": { + "m_GuidSerialized": "36803443-a9bc-4f3c-a4f2-7d66a5417ac1" + }, + "m_Name": "Outline Offset 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8f1b1d1e8ff24b3284993e52354e54fa", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9147636b0cfa466a9b37a013d8f693bf", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5421.99951171875, + "y": -3902.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a4f471e3221c4134b291bd9d2ba22db6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9178663316db43d582f1c4a127d307c6", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "91890fe48ebe4717aea61ecaf3ad4861", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2983.000244140625, + "y": -3468.0, + "width": 119.99999237060547, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "3dccd64e7f324bc1a75c1479d7a67c51" + }, + { + "m_Id": "e444f2c81d1e48329fa2c91005277e8d" + }, + { + "m_Id": "b2c26292b7434733878a9b042f44de89" + }, + { + "m_Id": "964fea1fd4b24f4daf5bef84c4b45118" + }, + { + "m_Id": "deac82280a2b43078e0e40863e2d974c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "91d6a9a5fbc04ea49075cb51835e7264", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "928621a3ca2d41c89a10336bbbc81ddc", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9327cb5f5e6b46f1bd79f91ef9dca3b7", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "93b161cce4504cb79c97b6d8db178de7", + "m_Id": 3, + "m_DisplayName": "TextureSize", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureSize", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "945b45993dd84a979755b98c48138f72", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "952d0fa5cd744df0b434cd38e9a90b93", + "m_Guid": { + "m_GuidSerialized": "ce395871-ddeb-47c3-a31d-07855800c197" + }, + "m_Name": "_UnderlaySoftness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_F2B9E3EF", + "m_OverrideReferenceName": "_UnderlaySoftness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "95928bcb6a284b8d88105a84c2e1d3ce", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4788.0, + "y": -2591.0, + "width": 155.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d880558893fb442b9320cf55885d1117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "964fea1fd4b24f4daf5bef84c4b45118", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "98934a69591249d5b8b92b39045359a3", + "m_Title": "Outline1 Texture", + "m_Position": { + "x": -4670.00048828125, + "y": -2474.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "998db5e5901e45b29040eb2099370071", + "m_Guid": { + "m_GuidSerialized": "6f383614-f2ad-4269-be8f-87b0ecb03cf0" + }, + "m_Name": "Bevel Clamp", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_5BD7E808", + "m_OverrideReferenceName": "_BevelClamp", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "9c228fac287d446296b91a4acf5cec59", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4600.0, + "y": -3498.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "582d6e289dbe4fdca7cf0307273eaa2f" + }, + { + "m_Id": "1db37082bf844442804487b4944352de" + }, + { + "m_Id": "8b66f4e6bc9d4662b3218ac33a69839f" + }, + { + "m_Id": "4a66dcbe712a4d40bd8f355b834594b5" + }, + { + "m_Id": "a0285c9c381a49cba194709efa0a7c85" + }, + { + "m_Id": "b2728d0dd3ce40678867c94a7d977916" + }, + { + "m_Id": "e141833aa78b4fd59ecad949beb43a78" + }, + { + "m_Id": "51f76f8a53ad43a4ad028426548ce9ba" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9c26fdddba244d36a854298c00473247", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "9d3c3383d5934a17bf9efbb7fd9e9043", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5443.0, + "y": -3315.0, + "width": 144.99998474121095, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "232b1aa09e67479abae141d3c76d3c5b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e6e50a71d9843b49b62ebe1cf7d3d59", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4486.0, + "y": -3865.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "3535ae87c6dd4769b52b20d9eca61069" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e87ce9607e14015a3790c528ca5dfda", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4635.0, + "y": -2239.0, + "width": 167.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "75c5657544c648058b20cea090f48dbf" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "9eb8137a6c2e41bbafdc8b0732dd47a3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "9eeec1a9713045af8845cea263d5ea48", + "m_Id": 6, + "m_DisplayName": "IsFront", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "IsFront", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "9f0de188085746d5a19073da1de85ddb", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4160.0, + "y": -2771.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "7c27ccb2c2dc4ca59c5438c3358630ca" + }, + { + "m_Id": "373f1de8db6c429c9d46c781f741d7a4" + }, + { + "m_Id": "fd0b096ed5b74f9e9ec51327be200731" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9f42c5a9bc2f45baa095a80e7b8b485a", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a0285c9c381a49cba194709efa0a7c85", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a03db80c558b4f87a330c5ae0a9443a5", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "a3f8b6e8ae7f48e2989a029904401502", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "a455bd79094c4413a7b7dd80ca8b9368", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4606.99951171875, + "y": -2689.0, + "width": 221.99998474121095, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "dcd51c93d3b64f05a938b3334f343654" + }, + { + "m_Id": "2c7a9460724b47daad8df1be144de7c6" + }, + { + "m_Id": "55ffa45ec3654d5e88089fb40d2b0465" + }, + { + "m_Id": "e495a9f7a11f4eb89334e83be154ceb9" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateShaderProperty", + "m_ObjectId": "a4ad98d8828c424384229c344ebe2ed0", + "m_Guid": { + "m_GuidSerialized": "f98fc1a2-bb81-4bd1-a207-23d3a90d518e" + }, + "m_Name": "SamplerState", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "SamplerState_a4ad98d8828c424384229c344ebe2ed0", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": false, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_filter": 0, + "m_wrap": 1, + "m_anisotropic": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a4f471e3221c4134b291bd9d2ba22db6", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "a535f3bcbeb14622bb177eb6f46e76f4", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4645.00048828125, + "y": -2285.0, + "width": 177.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "6dfc1177dd0541a7a780fbf911ad1956" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "a6bbb32e8d884be9bb36db91fe4b81b1", + "m_Guid": { + "m_GuidSerialized": "6aa76edf-7b80-46ac-add4-406cf1d85493" + }, + "m_Name": "_GradientScale", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_EAE27356", + "m_OverrideReferenceName": "_GradientScale", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 10.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "a6c38edd2e8743a9b057ba8452b9f129", + "m_Guid": { + "m_GuidSerialized": "9fc942ee-4a1d-4ced-a5a6-81893e3ddb63" + }, + "m_Name": "Light Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_a6c38edd2e8743a9b057ba8452b9f129", + "m_OverrideReferenceName": "_SpecularColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "a75f7ac601c446469802fe7754c1f279", + "m_Id": 0, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a7942746b5564dc7bbbae1deb2403022", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "a7c06457d7454693a8bc3dc95257b2c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "aa2794b8f0e24bf281d22e0fef0647be", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "aa3e347d733e48f7b65d8a8847370eec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "EvaluateLight (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3631.0, + "y": -3810.0, + "width": 230.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "0699eea947fc426cbfeb8744cf120222" + }, + { + "m_Id": "0c4dc51f26484c26ad88a3fe4002abcd" + }, + { + "m_Id": "d5173cc3c6cd4f1998550f3187a3e9c8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "EvaluateLight", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aa87c72ac0e64469acc34f936f00b3d0", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4225.0, + "width": 193.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "0d7878dd226d4cfb81a991dc312309fc" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "abd59150589b436cadf8c9e6f43ccb8e", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "aca823a8188948c782eddaf0f45e1868", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalOS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2542.0, + "y": -3404.000244140625, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "e386b183a18245a796b024022f7f3074" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalOS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "acd0cd5a177f4a97bf23db7219305e3f", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4348.0, + "y": -3905.99951171875, + "width": 185.33299255371095, + "height": 101.33324432373047 + } + }, + "m_Slots": [ + { + "m_Id": "945b45993dd84a979755b98c48138f72" + }, + { + "m_Id": "e51a636b2621440eb94cc802c1cf4bfc" + }, + { + "m_Id": "1bdde3efd3b7464b8934c555be0f8a48" + }, + { + "m_Id": "f1fb18f75405424884a776bfd24e79e9" + }, + { + "m_Id": "9f42c5a9bc2f45baa095a80e7b8b485a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ada023d617104472b8ab75a81558c0a1", + "m_Id": 0, + "m_DisplayName": "Outline Color 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aef5c44f84e04c3185e0b93e95e34204", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5264.99951171875, + "y": -3142.0, + "width": 159.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "84dc74cdbd8c45e1b189e4fd9a69942d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b000f852aa984e9dae25b125a4607f4e", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b015d1b7e4134c59baf6851e7649802c", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "b0b352c4503a43d083a64e57352b29a0", + "m_Guid": { + "m_GuidSerialized": "01cfcc78-60aa-4f71-a1e3-8d8df6dae253" + }, + "m_Name": "Reflectivity Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_b0b352c4503a43d083a64e57352b29a0", + "m_OverrideReferenceName": "_Reflectivity", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 5.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 5.0, + "y": 15.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "b1188549725543d485436c2e921ffbb2", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4146.0, + "y": -2869.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "281bcee4777040f8a31ee0e10344e98d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "b163c9f1666644b0bba62cf0e12df7bc", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4367.0, + "y": -2713.0, + "width": 180.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "cce40479b6284b6fa3174db9f09d0ac9" + }, + { + "m_Id": "80e665a5eeb64730a51742f698bf0d48" + }, + { + "m_Id": "1f46181633594ae0a1fb2adb76b42981" + }, + { + "m_Id": "8cbd81814903479ea1d3151c1f38183e" + }, + { + "m_Id": "cfaf3f3a5a1146e194cddad30c95aada" + }, + { + "m_Id": "b43489e37a5c4df88f15844292a55ec7" + }, + { + "m_Id": "cd7281fb41aa4e61ac0fdf71d4f4bd46" + }, + { + "m_Id": "f01d52cdcb1647aab35782b4af535efd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 1, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b224a1cf80604103ad085c799995f3c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b2728d0dd3ce40678867c94a7d977916", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b2baf44eae52473cb6cda7b1debece01", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b2c26292b7434733878a9b042f44de89", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b42e6dbfbc864097af182cbff5c0c1fb", + "m_Id": 0, + "m_DisplayName": "Outline Color 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b43489e37a5c4df88f15844292a55ec7", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "b4a40cb6acd441acb83cfe0240bf910d", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4750.99951171875, + "y": -4274.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "d0b10e52e21941b183f5f635894c76c8" + }, + { + "m_Id": "0d6a57754b824f6db9cefa6953bc06a9" + }, + { + "m_Id": "773b90134e894e429203c0c83e80b9de" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "b571db753a1948d5a6f1de4e7d0c7238", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5581.99951171875, + "y": -3867.0, + "width": 183.99998474121095, + "height": 100.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "5b3ff4ee364f4d7a923b530ad60d8762" + }, + { + "m_Id": "c183b5bd9bbe45089f93996e73110918" + }, + { + "m_Id": "1196ae398cc348349ab0c1a23fdab4bd" + }, + { + "m_Id": "9327cb5f5e6b46f1bd79f91ef9dca3b7" + }, + { + "m_Id": "d804b5a6c657409196addf2b39199a4f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b691728a389a417d9b4f2d02541209c2", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b7f9ac55517141868bfb9d2ad6429792", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b85d677872b44421bf5536f42ba0267c", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "bc9afcb18afa4ccc82d2cdc34d3f4641", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -5392.0, + "y": -3867.0, + "width": 125.99999237060547, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "5e42524569844befad16fda5a94eb9cb" + }, + { + "m_Id": "54d7a93ffec5490aa4591da23a21b693" + }, + { + "m_Id": "aa2794b8f0e24bf281d22e0fef0647be" + }, + { + "m_Id": "200245fc8bbe4826b209ab5f7ffe074c" + }, + { + "m_Id": "fc2e62201c5847e798fd939314413fcd" + }, + { + "m_Id": "fe11fa80cc1847a5a37f6757d521cf25" + }, + { + "m_Id": "de0c6f7f7af94defa6c3dbc6433de9d4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c183b5bd9bbe45089f93996e73110918", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "c234e5216678436195ee1a5914bc79da", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4446.0, + "y": -2347.0, + "width": 222.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "f68d9dee5cbc43cdb355d8fadae602d3" + }, + { + "m_Id": "3db1608e927e4102a3c3a88e9fcab39a" + }, + { + "m_Id": "0f7ffb6d2de4447f9736780cbcee8e07" + }, + { + "m_Id": "d4954b7bbbb0412cbc997bcbe7dfa808" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "c35312edaa2344788b1964ee2f63a236", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "c3e6d7c20c184bf39fd8822130e693e7", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "c422a9a9ff824176aad2241f58c44d0b", + "m_Id": 0, + "m_DisplayName": "Outline Offset 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "c478c32c45884c57a62f7b2aa8ddc3b0", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c52a1744a9a14989b0ae452ad6de6061", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c6bdb985bc16435fa72f5a3c81bb633c", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c7d4094601ac4bc1aead609c72b1f1c1", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c7ddee91dc5b48dc828309c77fdb0b88", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4266.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a7942746b5564dc7bbbae1deb2403022" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "c88fcbaeea954a5f9c68c339fa8b604d", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c9b722d107ce4cd6a748c883472b9b0f", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c9d7f0dbae7d422985a1cc87c025e76b", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4315.0, + "y": -3165.0, + "width": 144.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "79147f6986644769b58d9ed64fe771e1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "c9ec735d1a1046769e5601b2c97c849a", + "m_Guid": { + "m_GuidSerialized": "281a9526-c332-4471-a44e-ece4a1e95ef6" + }, + "m_Name": "Face Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_75569DEA", + "m_OverrideReferenceName": "_FaceTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ca2a1083dc014f39ab8af0cdf140866b", + "m_Id": 0, + "m_DisplayName": "_FaceTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "cb3c0c3f08654b068bea44c4ffb15f4a", + "m_Guid": { + "m_GuidSerialized": "21009d12-8d94-4273-b0d0-a8ee0608ddcf" + }, + "m_Name": "OutlineMode", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_cb3c0c3f08654b068bea44c4ffb15f4a", + "m_OverrideReferenceName": "_OutlineMode", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cb5e9f9567e84f8fa5463efc0e256e19", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "cb7117ecb1d047a8b2cb00ed552cb181", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3032.66650390625, + "y": -3029.33349609375, + "width": 200.0, + "height": 41.33349609375 + } + }, + "m_Slots": [ + { + "m_Id": "724e17584e97443e9e285dfa7253c8e3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cc88101667c9488f9c5a716e851c1b21", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cce40479b6284b6fa3174db9f09d0ac9", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "cd7281fb41aa4e61ac0fdf71d4f4bd46", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cda5e3b4c1054bf3a65c0b7ec6bc778a", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "cdddee3a537c464697357f11b966f9b8", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4420.0, + "y": -4483.0, + "width": 156.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "41b9b79b3859472882bcea393703eec0" + }, + { + "m_Id": "c7d4094601ac4bc1aead609c72b1f1c1" + }, + { + "m_Id": "767769f736d5478cba5f10a415e28e7f" + }, + { + "m_Id": "b691728a389a417d9b4f2d02541209c2" + }, + { + "m_Id": "045c4f6b050549c7a0efb208e6349779" + }, + { + "m_Id": "509e6f38505b4b0695b263706a55028f" + }, + { + "m_Id": "204dacb5a95b424facf11cb6f65bd188" + }, + { + "m_Id": "35cbea6373dd4e4f8d0fea36e8add392" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "ced40c943add479a86f25f7fb5ed59da", + "m_Guid": { + "m_GuidSerialized": "af17e4ab-54fe-4482-a9c5-4e4bc9076517" + }, + "m_Name": "_ScaleRatioA", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_ScaleRatioA", + "m_DefaultReferenceName": "_ScaleRatioA", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "cfaf3f3a5a1146e194cddad30c95aada", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d0a791a544614667962a9a9a9ce0c68a", + "m_Title": "Screen Space Ratio", + "m_Position": { + "x": -6179.99951171875, + "y": -3422.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d0b10e52e21941b183f5f635894c76c8", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d1a17e42e7a04dc38984e3c01149445b", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d219977210094c0082c517d8dc00c8bb", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d258902c6ec74942afdb9ebf8c1d07f8", + "m_Title": "Generate Normal", + "m_Position": { + "x": -4511.33349609375, + "y": -3999.3330078125 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "d30452ac6b244ecca03df4d7b4de9f81", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d48c3871e3064027a10ae9f4babd3be0", + "m_Id": 0, + "m_DisplayName": "_UnderlaySoftness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d4954b7bbbb0412cbc997bcbe7dfa808", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "d4df208fc23b42f2b52364124f1b661c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5268.0, + "y": -3261.0, + "width": 159.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "757174b6f25040fdbb20355a21752222" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "d5173cc3c6cd4f1998550f3187a3e9c8", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d6a6a119394e4082a11bc024a6e42ef8", + "m_Id": 0, + "m_DisplayName": "Outline Color 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d804b5a6c657409196addf2b39199a4f", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d880558893fb442b9320cf55885d1117", + "m_Id": 0, + "m_DisplayName": "_FaceUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d8edec16956c4f15b7d51d6ec10753f4", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d9bcb754db834583b6518c5ed5152114", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d9dc4839ee2847999110bdb234d6041a", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "da7a06d393a44089842070d51d2aa0a6", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "daaf032a109749a88c9b8ff8e1f8b541", + "m_Title": "Offset Scale", + "m_Position": { + "x": -5747.99951171875, + "y": -3961.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "dbcb748279484a4590e53518c49122b8", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4778.0, + "y": -2771.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "7a0f504e4175406dbd8134250f4e350b" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "dc75c4e3a1bc4bb0a128086c2b0679a5", + "m_Guid": { + "m_GuidSerialized": "85cd941f-2fd2-43a3-b0fa-9f728bfb4220" + }, + "m_Name": "Face Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_99AFBB3D", + "m_OverrideReferenceName": "_FaceColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "dcd51c93d3b64f05a938b3334f343654", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "de0c6f7f7af94defa6c3dbc6433de9d4", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "deac82280a2b43078e0e40863e2d974c", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "def8e0b9d8384982bc5b4c32d877e458", + "m_Id": 0, + "m_DisplayName": "Outline Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "dff7a66b353a4023b29c9d937da77960", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4602.0, + "y": -4298.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "7b8a19bd115e4167a25b59cb3218a817" + }, + { + "m_Id": "0b57f2d35157477ab2b29a5aac14ae8b" + }, + { + "m_Id": "e9e06fcb161e44ba8cc9f6f60264df78" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "e141833aa78b4fd59ecad949beb43a78", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e2d28f29bbac4983a401574480b5ca28", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "e386b183a18245a796b024022f7f3074", + "m_Id": 0, + "m_DisplayName": "Normal (Object Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalOS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e444f2c81d1e48329fa2c91005277e8d", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "e495a9f7a11f4eb89334e83be154ceb9", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e51a636b2621440eb94cc802c1cf4bfc", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e591df3a1eb94e259b762f2830b407e2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Emission", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "4590bfa2a0664b65b6f073bae33a071f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Emission" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e6e80c6b0db545cda26b079a9a78fbb3", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "e818605f8f5a4f01bf61caaa33693581", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "ComputeSDF44 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4144.0, + "y": -3369.0, + "width": 244.0, + "height": 214.0 + } + }, + "m_Slots": [ + { + "m_Id": "641eda269d7b4da9acb65f8d50035ea9" + }, + { + "m_Id": "f6823778a3cf42d5bbe8a83e5f9c9fa3" + }, + { + "m_Id": "9c26fdddba244d36a854298c00473247" + }, + { + "m_Id": "f684c5678e9e4f078157a3ab7ef5057b" + }, + { + "m_Id": "14ad19bf20a140dd88d58452d7df688b" + }, + { + "m_Id": "215a82c127204988b751de7d3a39b955" + }, + { + "m_Id": "c478c32c45884c57a62f7b2aa8ddc3b0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF44", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e9e06fcb161e44ba8cc9f6f60264df78", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebbd94a7102a4457a48ac492de3bff14", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebd6d75abcb84108bcadbfe7ee5f6244", + "m_Id": 7, + "m_DisplayName": "TextureHeight", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureHeight", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "ec184d6d9fb2494897774c9e7d279e6d", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4799.0, + "y": -2625.0, + "width": 165.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ca2a1083dc014f39ab8af0cdf140866b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "07946387933e416db576b677f0711e5f" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "ec1f2e8bc9fd4ae38b133c60ee6c49b8", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4957.99951171875, + "y": -3204.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "748c31bbcecc4b30bec2e42c0612175b" + }, + { + "m_Id": "4bda5c294e1949138d033640e1d385b4" + }, + { + "m_Id": "4e64dac49ddc47c3b5b1e27b17a08304" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "ec79eb447dfd47a9b3380344c6a60f43", + "m_Guid": { + "m_GuidSerialized": "54c77f8b-0534-4b35-a3f0-83ab2ebe6c1f" + }, + "m_Name": "_OutlineTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1774DE83", + "m_OverrideReferenceName": "_OutlineTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "ecf16c34d46f4502ac601f0c38c7576b", + "m_Title": "Vertex Color", + "m_Position": { + "x": -3448.000244140625, + "y": -3579.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ed1d1f1613334c3bb904dd08161cd7e5", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ed6c215a65584deeaefad1d2c7743044", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "edbee7a8952b46529ac5ad0365775774", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "ef0b93f78372439696f50711eaf57d90", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.7353569269180298, + "y": 0.7353569269180298, + "z": 0.7353569269180298 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "ef9738ec7e894772a14e9dce441c16c6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "f01d52cdcb1647aab35782b4af535efd", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f1fb18f75405424884a776bfd24e79e9", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "f23a8b2b7c85478388ff7a8c8a6de740", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Layer4 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3849.999755859375, + "y": -3286.0, + "width": 193.0, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "0fac35636fca4474a6afaefc3c757775" + }, + { + "m_Id": "cc88101667c9488f9c5a716e851c1b21" + }, + { + "m_Id": "68ec7c31365549d6a8ce883edfc02de2" + }, + { + "m_Id": "02559cbe5ad441a3904ccb75ded2b2c5" + }, + { + "m_Id": "34a67e0fef884f9399e674d9eeaf720c" + }, + { + "m_Id": "3802c81c3be24823aa1d7c9997a33c29" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer4", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f2903158b3624759bca1fcd843698078", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f2a351a5375c441b8d9ab7e2c9545a77", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "f383b24f0bc6434dafe44b3e3d338a63", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6012.99951171875, + "y": -3209.0, + "width": 183.99998474121095, + "height": 100.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "fb5e1e2a67c14602808358686bb75091" + }, + { + "m_Id": "712da461f71a454db59d349f752d41ee" + }, + { + "m_Id": "b000f852aa984e9dae25b125a4607f4e" + }, + { + "m_Id": "7b3b88c5975841d6b6d5c3c5515055a0" + }, + { + "m_Id": "8a39319405ad44cb8b7aae71c41dcd01" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "f3d31c1f18d8491a8ecf5cbc37e4b7db", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4321.99951171875, + "y": -3246.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ed1d1f1613334c3bb904dd08161cd7e5" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f42ad06b3c6a45d3ab33de904c063412", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f48f04ad45d046a8b88e71731ed506e7", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f4ecc442a2d246759f7c2c0412953d28", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a3f8b6e8ae7f48e2989a029904401502" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f6823778a3cf42d5bbe8a83e5f9c9fa3", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f684c5678e9e4f078157a3ab7ef5057b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": { + "x": 3.0, + "y": 2.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "f68d9dee5cbc43cdb355d8fadae602d3", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "f814deb543c24fbbafbcdb5071d96022", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4600.0, + "y": -3245.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "abd59150589b436cadf8c9e6f43ccb8e" + }, + { + "m_Id": "7acfafd73b8c4dfab8c55c18a887e087" + }, + { + "m_Id": "928621a3ca2d41c89a10336bbbc81ddc" + }, + { + "m_Id": "b7f9ac55517141868bfb9d2ad6429792" + }, + { + "m_Id": "09b1b86c1c074337a4c439d3a308dd2e" + }, + { + "m_Id": "1f247658c7ba45fb93c41f51e21acb0d" + }, + { + "m_Id": "d30452ac6b244ecca03df4d7b4de9f81" + }, + { + "m_Id": "215b30ae27784ec3a13360a9029af283" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f864c900600e427ba7793f00c715e971", + "m_Id": 0, + "m_DisplayName": "Outline Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fa6de3be9f5b4411b5081b49e645f424", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DivideNode", + "m_ObjectId": "faace8101df943d8956faa31728cb004", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Divide", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5254.99951171875, + "y": -3891.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "77e28f3e930b4c249145630ec961af95" + }, + { + "m_Id": "f2903158b3624759bca1fcd843698078" + }, + { + "m_Id": "30ca940fe2794c949f2a1d4d2caaa446" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "facc84930f544fd7a0205a6176b18ac0", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "fb15d0ba56d54a6192f11e107aeb5fa8", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fb5e1e2a67c14602808358686bb75091", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "fc2e62201c5847e798fd939314413fcd", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fd0b096ed5b74f9e9ec51327be200731", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "fdb77c3e92ee497b88ca5dc46dc45350", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4208.0, + "y": -2371.0, + "width": 180.0, + "height": 180.0 + } + }, + "m_Slots": [ + { + "m_Id": "4328cdbf78b94c038fd614c59bfe1cac" + }, + { + "m_Id": "04dfcc9ff13a4bf282ed46faec39d15c" + }, + { + "m_Id": "71dd947935b64ce38f0d25406dde447b" + }, + { + "m_Id": "61a6ac5f29344d109411f26850ab0a96" + }, + { + "m_Id": "44806230fa384c1e95f9c5918a14f056" + }, + { + "m_Id": "4eb3c00a1ca44e10be833b7ca61ff059" + }, + { + "m_Id": "57abc172afd449e2a4d567f93432507b" + }, + { + "m_Id": "cda5e3b4c1054bf3a65c0b7ec6bc778a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "fe11fa80cc1847a5a37f6757d521cf25", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph.meta b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph.meta new file mode 100644 index 00000000..a2f732a3 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f63d574838ccfb44f84acc05fed0af48 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader index 7019aaf4..603df2c7 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader @@ -6,14 +6,14 @@ Shader "TextMeshPro/Mobile/Distance Field - Masking" { Properties { - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayColor ("Border Color", Color) = (0,0,0,.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 @@ -99,35 +99,41 @@ SubShader { #include "UnityUI.cginc" #include "TMPro_Properties.cginc" - struct vertex_t { + struct vertex_t + { float4 vertex : POSITION; float3 normal : NORMAL; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - struct pixel_t { + struct pixel_t + { float4 vertex : SV_POSITION; fixed4 faceColor : COLOR; fixed4 outlineColor : COLOR1; float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) - #if (UNDERLAY_ON | UNDERLAY_INNER) + + #if (UNDERLAY_ON | UNDERLAY_INNER) float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) - #endif + #endif }; float _MaskWipeControl; float _MaskEdgeSoftness; fixed4 _MaskEdgeColor; bool _MaskInverse; + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; pixel_t VertShader(vertex_t input) { - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.vertex; vert.x += _VertexOffsetX; @@ -138,7 +144,7 @@ SubShader { pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); float scale = rsqrt(dot(pixelSize, pixelSize)); - scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; @@ -150,6 +156,10 @@ SubShader { float bias = (0.5 - weight) * scale - 0.5; float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } float opacity = input.color.a; #if (UNDERLAY_ON | UNDERLAY_INNER) opacity = 1.0; @@ -163,7 +173,7 @@ SubShader { outlineColor.rgb *= outlineColor.a; outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); - #if (UNDERLAY_ON | UNDERLAY_INNER) + #if (UNDERLAY_ON | UNDERLAY_INNER) layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); @@ -171,11 +181,12 @@ SubShader { float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; float2 layerOffset = float2(x, y); - #endif + #endif // Generate UV for the Masking Texture float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); // Structure for pixel shader pixel_t output = { @@ -184,11 +195,11 @@ SubShader { outlineColor, float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y), half4(scale, bias - outline, bias + outline, bias), - half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)), - #if (UNDERLAY_ON | UNDERLAY_INNER) + half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)), + #if (UNDERLAY_ON | UNDERLAY_INNER) float4(input.texcoord0 + layerOffset, input.color.a, 0), half2(layerScale, layerBias), - #endif + #endif }; return output; @@ -201,41 +212,41 @@ SubShader { half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; half4 c = input.faceColor * saturate(d - input.param.w); - #ifdef OUTLINE_ON + #ifdef OUTLINE_ON c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); c *= saturate(d - input.param.y); - #endif + #endif - #if UNDERLAY_ON + #if UNDERLAY_ON d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); - #endif + #endif - #if UNDERLAY_INNER + #if UNDERLAY_INNER half sd = saturate(d - input.param.z); d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); - #endif + #endif - // Alternative implementation to UnityGet2DClipping with support for softness. - //#if UNITY_UI_CLIP_RECT + // Alternative implementation to UnityGet2DClipping with support for softness. + //#if UNITY_UI_CLIP_RECT half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); c *= m.x * m.y; - //#endif + //#endif - float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); - float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; - a = saturate(t / _MaskEdgeSoftness); - c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a); - c *= a; + float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); + float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; + a = saturate(t / _MaskEdgeSoftness); + c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a); + c *= a; - #if (UNDERLAY_ON | UNDERLAY_INNER) + #if (UNDERLAY_ON | UNDERLAY_INNER) c *= input.texcoord1.z; - #endif + #endif - #if UNITY_UI_ALPHACLIP + #if UNITY_UI_ALPHACLIP clip(c.a - 0.001); - #endif + #endif return c; } diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader index ce82bed5..3edca76c 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader @@ -6,14 +6,14 @@ Shader "TextMeshPro/Mobile/Distance Field Overlay" { Properties { - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayColor ("Border Color", Color) = (0,0,0,.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 @@ -93,16 +93,18 @@ SubShader { #include "UnityUI.cginc" #include "TMPro_Properties.cginc" - struct vertex_t { + struct vertex_t + { UNITY_VERTEX_INPUT_INSTANCE_ID float4 vertex : POSITION; float3 normal : NORMAL; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - struct pixel_t { + struct pixel_t + { UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO float4 vertex : SV_POSITION; @@ -111,12 +113,17 @@ SubShader { float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) - #if (UNDERLAY_ON | UNDERLAY_INNER) + + #if (UNDERLAY_ON | UNDERLAY_INNER) float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) - #endif + #endif }; + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; + pixel_t VertShader(vertex_t input) { @@ -127,7 +134,7 @@ SubShader { UNITY_TRANSFER_INSTANCE_ID(input, output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.vertex; vert.x += _VertexOffsetX; @@ -138,7 +145,7 @@ SubShader { pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); float scale = rsqrt(dot(pixelSize, pixelSize)); - scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; @@ -150,10 +157,14 @@ SubShader { float bias = (0.5 - weight) * scale - 0.5; float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } float opacity = input.color.a; - #if (UNDERLAY_ON | UNDERLAY_INNER) + #if (UNDERLAY_ON | UNDERLAY_INNER) opacity = 1.0; - #endif + #endif fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; faceColor.rgb *= faceColor.a; @@ -163,14 +174,14 @@ SubShader { outlineColor.rgb *= outlineColor.a; outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2)))); - #if (UNDERLAY_ON | UNDERLAY_INNER) + #if (UNDERLAY_ON | UNDERLAY_INNER) layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; float2 layerOffset = float2(x, y); - #endif + #endif // Generate UV for the Masking Texture float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); @@ -182,7 +193,8 @@ SubShader { output.outlineColor = outlineColor; output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); output.param = half4(scale, bias - outline, bias + outline, bias); - output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); #if (UNDERLAY_ON || UNDERLAY_INNER) output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); output.underlayParam = half2(layerScale, layerBias); @@ -200,35 +212,35 @@ SubShader { half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; half4 c = input.faceColor * saturate(d - input.param.w); - #ifdef OUTLINE_ON + #ifdef OUTLINE_ON c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z)); c *= saturate(d - input.param.y); - #endif + #endif - #if UNDERLAY_ON + #if UNDERLAY_ON d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); - #endif + #endif - #if UNDERLAY_INNER + #if UNDERLAY_INNER half sd = saturate(d - input.param.z); d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); - #endif + #endif - // Alternative implementation to UnityGet2DClipping with support for softness. - #if UNITY_UI_CLIP_RECT + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); c *= m.x * m.y; - #endif + #endif - #if (UNDERLAY_ON | UNDERLAY_INNER) + #if (UNDERLAY_ON | UNDERLAY_INNER) c *= input.texcoord1.z; - #endif + #endif - #if UNITY_UI_ALPHACLIP + #if UNITY_UI_ALPHACLIP clip(c.a - 0.001); - #endif + #endif return c; } diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader index df4d5b0b..43b317d3 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader @@ -6,14 +6,14 @@ Shader "TextMeshPro/Mobile/Distance Field SSD" { Properties { - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayColor ("Border Color", Color) = (0,0,0,.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader new file mode 100644 index 00000000..2c8e8dad --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader @@ -0,0 +1,389 @@ +// Simplified SDF shader: +// - No Shading Option (bevel / bump / env map) +// - No Glow Option +// - Softness is applied on both side of the outline + +Shader "TextMeshPro/Mobile/Distance Field - 2 Pass" { + +Properties { + _FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceDilate ("Face Dilate", Range(-1,1)) = 0 + + _OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 + _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 + + _UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 + _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 + _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 + _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 + + _WeightNormal ("Weight Normal", float) = 0 + _WeightBold ("Weight Bold", float) = .5 + + _ShaderFlags ("Flags", float) = 0 + _ScaleRatioA ("Scale RatioA", float) = 1 + _ScaleRatioB ("Scale RatioB", float) = 1 + _ScaleRatioC ("Scale RatioC", float) = 1 + + _MainTex ("Font Atlas", 2D) = "white" {} + _TextureWidth ("Texture Width", float) = 512 + _TextureHeight ("Texture Height", float) = 512 + _GradientScale ("Gradient Scale", float) = 5 + _ScaleX ("Scale X", float) = 1 + _ScaleY ("Scale Y", float) = 1 + _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875 + _Sharpness ("Sharpness", Range(-1,1)) = 0 + + _VertexOffsetX ("Vertex OffsetX", float) = 0 + _VertexOffsetY ("Vertex OffsetY", float) = 0 + + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MaskSoftnessX ("Mask SoftnessX", float) = 0 + _MaskSoftnessY ("Mask SoftnessY", float) = 0 + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 +} + +SubShader { + + // Draw Outline and Underlay + Name "Outline" + + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest [unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + #pragma shader_feature __ OUTLINE_ON + #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 vertex : SV_POSITION; + fixed4 faceColor : COLOR; + fixed4 outlineColor : COLOR1; + float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV + half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) + half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) + #if (UNDERLAY_ON | UNDERLAY_INNER) + float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved + half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y) + #endif + }; + + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + const float bold = step(input.texcoord0.w, 0); + + float4 vert = input.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); + if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + float layerScale = scale; + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + float bias = (0.5 - weight) * scale - 0.5; + const float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; + + float opacity = input.color.a; + #if (UNDERLAY_ON | UNDERLAY_INNER) + opacity = 1.0; + #endif + + fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + fixed4 outlineColor = _OutlineColor; + outlineColor.a *= opacity; + outlineColor.rgb *= outlineColor.a; + //outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, outline * 2))); + + #if (UNDERLAY_ON | UNDERLAY_INNER) + layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale); + float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale); + + float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; + float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; + float2 layerOffset = float2(x, y); + #endif + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Populate structure for pixel shader + output.vertex = vPosition; + output.faceColor = faceColor; + output.outlineColor = outlineColor; + output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); + output.param = half4(scale, bias - outline, bias + outline, bias); + + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); + #if (UNDERLAY_ON || UNDERLAY_INNER) + output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); + output.underlayParam = half2(layerScale, layerBias); + #endif + + return output; + } + + + // PIXEL SHADER + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; + half4 c = half4(0, 0, 0, 0); + + #if OUTLINE_ON + c = input.outlineColor * saturate(d - input.param.y); + #endif + + #if UNDERLAY_ON + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a); + #endif + + #if UNDERLAY_INNER + half sd = saturate(d - input.param.z); + d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x; + c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a); + #endif + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + c *= m.x * m.y; + #endif + + #if (UNDERLAY_ON | UNDERLAY_INNER) + c *= input.texcoord1.z; + #endif + + #if UNITY_UI_ALPHACLIP + clip(c.a - 0.001); + #endif + + return c; + } + ENDCG + } + + + // Draw face + Name "Face" + + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull [_CullMode] + ZWrite Off + Lighting Off + Fog { Mode Off } + ZTest [unity_GUIZTestMode] + Blend One OneMinusSrcAlpha + ColorMask [_ColorMask] + + Pass { + CGPROGRAM + #pragma vertex VertShader + #pragma fragment PixShader + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + #include "TMPro_Properties.cginc" + + struct vertex_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + float4 vertex : POSITION; + float3 normal : NORMAL; + fixed4 color : COLOR; + float4 texcoord0 : TEXCOORD0; + float2 texcoord1 : TEXCOORD1; + }; + + struct pixel_t { + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + float4 vertex : SV_POSITION; + fixed4 faceColor : COLOR; + float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV + half2 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w) + half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw) + }; + + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; + + + pixel_t VertShader(vertex_t input) + { + pixel_t output; + + UNITY_INITIALIZE_OUTPUT(pixel_t, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_TRANSFER_INSTANCE_ID(input, output); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + + const float bold = step(input.texcoord0.w, 0); + + float4 vert = input.vertex; + vert.x += _VertexOffsetX; + vert.y += _VertexOffsetY; + float4 vPosition = UnityObjectToClipPos(vert); + + float2 pixelSize = vPosition.w; + pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + + float scale = rsqrt(dot(pixelSize, pixelSize)); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); + if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); + + float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; + weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5; + + scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale); + float bias = (0.5 - weight) * scale - 0.5; + + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } + float opacity = input.color.a; + + fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor; + faceColor.rgb *= faceColor.a; + + // Generate UV for the Masking Texture + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); + float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); + + // Populate structure for pixel shader + output.vertex = vPosition; + output.faceColor = faceColor; + output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); + output.param = half2(scale, bias); + + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); + + return output; + } + + + // PIXEL SHADER + fixed4 PixShader(pixel_t input) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(input); + + half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x; + half4 c = input.faceColor * saturate(d - input.param.y); + + // Alternative implementation to UnityGet2DClipping with support for softness. + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); + c *= m.x * m.y; + #endif + + #if UNITY_UI_ALPHACLIP + clip(c.a - 0.001); + #endif + + return c; + } + ENDCG + } + +} + +CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI" +} diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader.meta b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader.meta new file mode 100644 index 00000000..75bd98d8 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0178fcb869bafef4690d177d31d17db8 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader index d3f5866c..b899d6e9 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader @@ -6,14 +6,14 @@ Shader "TextMeshPro/Mobile/Distance Field" { Properties { - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineWidth ("Outline Thickness", Range(0,1)) = 0 _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5) + _UnderlayColor ("Border Color", Color) = (0,0,0,.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 @@ -81,6 +81,7 @@ SubShader { Pass { CGPROGRAM + #pragma enable_d3d11_debug_symbols #pragma vertex VertShader #pragma fragment PixShader #pragma shader_feature __ OUTLINE_ON @@ -98,7 +99,7 @@ SubShader { float4 vertex : POSITION; float3 normal : NORMAL; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; @@ -117,6 +118,9 @@ SubShader { #endif }; + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; pixel_t VertShader(vertex_t input) { @@ -127,7 +131,7 @@ SubShader { UNITY_TRANSFER_INSTANCE_ID(input, output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.vertex; vert.x += _VertexOffsetX; @@ -138,7 +142,7 @@ SubShader { pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); float scale = rsqrt(dot(pixelSize, pixelSize)); - scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; @@ -150,7 +154,11 @@ SubShader { float bias = (0.5 - weight) * scale - 0.5; float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale; - float opacity = input.color.a; + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } + float opacity = input.color.a; #if (UNDERLAY_ON | UNDERLAY_INNER) opacity = 1.0; #endif @@ -182,7 +190,9 @@ SubShader { output.outlineColor = outlineColor; output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y); output.param = half4(scale, bias - outline, bias + outline, bias); - output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); #if (UNDERLAY_ON || UNDERLAY_INNER) output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0); output.underlayParam = half2(layerScale, layerBias); diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader index be764aeb..68d0dfaa 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader @@ -7,15 +7,15 @@ Shader "TextMeshPro/Mobile/Distance Field (Surface)" { Properties { _FaceTex ("Fill Texture", 2D) = "white" {} - [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1) + _FaceColor ("Fill Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineTex ("Outline Texture", 2D) = "white" {} _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0 _OutlineSoftness ("Outline Softness", Range(0,1)) = 0 - [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowColor ("Color", Color) = (0, 1, 0, 0.5) _GlowOffset ("Offset", Range(-1,1)) = 0 _GlowInner ("Inner", Range(0,1)) = 0.05 _GlowOuter ("Outer", Range(0,1)) = 0.05 @@ -99,7 +99,8 @@ SubShader { #pragma multi_compile_shadowcaster #include "UnityCG.cginc" - struct v2f { + struct v2f + { V2F_SHADOW_CASTER; float2 uv : TEXCOORD1; float2 uv2 : TEXCOORD3; diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader index bcb2bb27..281e60db 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader @@ -4,10 +4,10 @@ Properties { _FaceTex ("Fill Texture", 2D) = "white" {} _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 - [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1) + _FaceColor ("Fill Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineTex ("Outline Texture", 2D) = "white" {} _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 @@ -28,12 +28,12 @@ Properties { _ReflectOutlineColor ("Outline Color", Color) = (0,0,0,1) _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ } _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) - [HDR]_SpecColor ("Specular Color", Color) = (0,0,0,1) + _SpecColor ("Specular Color", Color) = (0,0,0,1) _FaceShininess ("Face Shininess", Range(0,1)) = 0 _OutlineShininess ("Outline Shininess", Range(0,1)) = 0 - [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowColor ("Color", Color) = (0, 1, 0, 0.5) _GlowOffset ("Offset", Range(-1,1)) = 0 _GlowInner ("Inner", Range(0,1)) = 0.05 _GlowOuter ("Outer", Range(0,1)) = 0.05 @@ -118,7 +118,8 @@ SubShader { #pragma multi_compile_shadowcaster #include "UnityCG.cginc" - struct v2f { + struct v2f + { V2F_SHADOW_CASTER; float2 uv : TEXCOORD1; float2 uv2 : TEXCOORD3; diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph new file mode 100644 index 00000000..7922d393 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph @@ -0,0 +1,11932 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "386c36a1c4c34ea29deb680fb82cfe8b", + "m_Properties": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "59a09f50a7ca4cd3a0d248a0f3730b6a" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "7c73ccc923e744b98f19148b971a6090" + } + ], + "m_Nodes": [ + { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + }, + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + { + "m_Id": "86e21b7b6b7a44238607e41b8a9fb9a4" + }, + { + "m_Id": "0c10df95ee1d4b0a8a00558af49ec45f" + }, + { + "m_Id": "e591df3a1eb94e259b762f2830b407e2" + }, + { + "m_Id": "83c51d5b2f7b4eb785248f419181cb87" + }, + { + "m_Id": "ad3e1d26f4404555a8dd29223caaf1ef" + } + ], + "m_GroupDatas": [ + { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + } + ], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 5 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 7 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 6 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 1 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": -2506.000244140625, + "y": -3749.0 + }, + "m_Blocks": [ + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": -2506.000244140625, + "y": -3480.0 + }, + "m_Blocks": [ + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "86e21b7b6b7a44238607e41b8a9fb9a4" + }, + { + "m_Id": "0c10df95ee1d4b0a8a00558af49ec45f" + }, + { + "m_Id": "e591df3a1eb94e259b762f2830b407e2" + }, + { + "m_Id": "83c51d5b2f7b4eb785248f419181cb87" + }, + { + "m_Id": "ad3e1d26f4404555a8dd29223caaf1ef" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"fileID\":10210,\"guid\":\"0000000000000000e000000000000000\",\"type\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "TextMeshPro/SRP", + "m_GraphPrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "94300469581b4924ac7dda496811d45d" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "007c75c776ac4f1babe9cd7ae1fc4f14", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5722.99951171875, + "y": -3827.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1356dc7cbdfa4199a6535d3bbf4cd536" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "013228b0fdf1424097798f0973a9a4fb", + "m_Title": "Face Texture", + "m_Position": { + "x": -4813.0, + "y": -2949.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "02559cbe5ad441a3904ccb75ded2b2c5", + "m_Id": 5, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "03182b3263304258b265266325c21f65", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "045c4f6b050549c7a0efb208e6349779", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "04dc152dd2ba4d519391577eb1156235", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4536.00048828125, + "y": -2723.000244140625, + "width": 151.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "3d04f5ba6e7b40d281f22eb424145acd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "04dfcc9ff13a4bf282ed46faec39d15c", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "05805bc6fcc941fd889922555c6c86d7", + "m_Guid": { + "m_GuidSerialized": "fe84e680-4cee-4ca5-be86-2e293a9ba093" + }, + "m_Name": "Ambient Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_05805bc6fcc941fd889922555c6c86d7", + "m_OverrideReferenceName": "_Ambient", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "0580d4b7e3a049049569f4508643a724", + "m_Guid": { + "m_GuidSerialized": "eefb88c5-7665-45dc-b3c2-7cf98b9990d6" + }, + "m_Name": "Softness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_D64EC33D", + "m_OverrideReferenceName": "_Softness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "068ae649e00b40e198ec5a30ad741fab", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0699eea947fc426cbfeb8744cf120222", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "07946387933e416db576b677f0711e5f", + "m_Guid": { + "m_GuidSerialized": "21d612fb-8153-41f8-9e2f-9de044c19fbf" + }, + "m_Name": "_FaceTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1A08AD4A", + "m_OverrideReferenceName": "_FaceTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0801f576ce79452483b42e485405244d", + "m_Id": 0, + "m_DisplayName": "Smoothness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Smoothness", + "m_StageCapability": 2, + "m_Value": 0.5, + "m_DefaultValue": 0.5, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "082e9706dffc4c188270980d4e44ce0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0848ba750e0341198cf0bbd413e0efe4", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "09b1b86c1c074337a4c439d3a308dd2e", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0a67ca5280214bd794dc0ad66b5710a9", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0b57f2d35157477ab2b29a5aac14ae8b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0ba4932e164847878ddb7b7bcff96985", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "0c10df95ee1d4b0a8a00558af49ec45f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalTS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a0206f980dc6455f84f5a8442838c726" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalTS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0c4dc51f26484c26ad88a3fe4002abcd", + "m_Id": 2, + "m_DisplayName": "Color (1)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "0d6a57754b824f6db9cefa6953bc06a9", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0d7878dd226d4cfb81a991dc312309fc", + "m_Id": 0, + "m_DisplayName": "Underlay Dilate", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "0f7ffb6d2de4447f9736780cbcee8e07", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0fac35636fca4474a6afaefc3c757775", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "105b1ed1aa714e41bbe1ef5472bdb11f", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4923.99951171875, + "y": -4233.0, + "width": 158.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "8a08179f99d649d289b8053d5fa0ad22" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "109f638d1f9b49d4991d6d21a86d4eb7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5098.99951171875, + "y": -3182.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "880bb02c6c6b49b18aa6ebc66dc566a0" + }, + { + "m_Id": "1b9cd8f5f4004e2eaf8afbaab803bc04" + }, + { + "m_Id": "b224a1cf80604103ad085c799995f3c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "10a99c07aad742349d258db16838c129", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1196ae398cc348349ab0c1a23fdab4bd", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "129f271ebc77450994e18f0a30579bf5", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1356dc7cbdfa4199a6535d3bbf4cd536", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "14ad19bf20a140dd88d58452d7df688b", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "150533bad8e2424aaa2c74e253af8592", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4955.0, + "y": -3487.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "72fb5a0d7796446b9e2b929cb32facdc" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "163beb4431c34f538340bc0af0991e6f", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3284.0, + "y": -3516.0, + "width": 119.99999237060547, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c334de01ecd429baa7652fc6002536b" + }, + { + "m_Id": "e2d28f29bbac4983a401574480b5ca28" + }, + { + "m_Id": "6a7af6143e114a538663e71f56731a21" + }, + { + "m_Id": "3e25be96bb3747738c238cf3a741d5df" + }, + { + "m_Id": "4907352322c644ebacdf2ca30f2994fd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "19075add867e4757b9520d18fe8de1d0", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4292.0, + "y": -3213.000244140625, + "width": 124.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c28ee9109014fa086e5de7a3993341d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "0580d4b7e3a049049569f4508643a724" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1b9cd8f5f4004e2eaf8afbaab803bc04", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1bdde3efd3b7464b8934c555be0f8a48", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "1be90d4f96a841748b0c95219b12ad27", + "m_Guid": { + "m_GuidSerialized": "4c91c146-43bb-4de8-948a-fbf8b1da10e1" + }, + "m_Name": "Bevel Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_97690701", + "m_OverrideReferenceName": "_BevelOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": -0.5, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "1c4df61c2fea404eb3b87b270d7c59bc", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4316.0, + "y": -3247.000244140625, + "width": 148.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "f864c900600e427ba7793f00c715e971" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1d35fa1fb5004f96a65ace54fbe4f1ad", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1db37082bf844442804487b4944352de", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1df58cfa4dad4c449d01ee1c5ea05f2e", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "1e12726617b24675958e942eb62e4b09", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4772.0, + "y": -4404.0, + "width": 145.00001525878907, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "0848ba750e0341198cf0bbd413e0efe4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1f247658c7ba45fb93c41f51e21acb0d", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1f46181633594ae0a1fb2adb76b42981", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "200245fc8bbe4826b209ab5f7ffe074c", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "204dacb5a95b424facf11cb6f65bd188", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "215a82c127204988b751de7d3a39b955", + "m_Id": 6, + "m_DisplayName": "Outline", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Outline", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "215b30ae27784ec3a13360a9029af283", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "21a7a380e66d42e780e2a2a1baa630d5", + "m_Guid": { + "m_GuidSerialized": "b2d0099f-e605-49f5-9959-e7cacae37aa3" + }, + "m_Name": "Bevel Type", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_21a7a380e66d42e780e2a2a1baa630d5", + "m_OverrideReferenceName": "_BevelType", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e", + "m_Guid": { + "m_GuidSerialized": "cd167d3a-7465-4d5a-86fc-0f22dc0ef908" + }, + "m_Name": "Outline Color 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_5550EB71", + "m_OverrideReferenceName": "_OutlineColor1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "232b1aa09e67479abae141d3c76d3c5b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "256d41e89a204d22951450de1c38051d", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "26e48352a08441bfa694dcea54c06e36", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "281bcee4777040f8a31ee0e10344e98d", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "285f6a9863d54ed2a8150727ad749456", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4181.99951171875, + "y": -2415.0, + "width": 154.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "b42e6dbfbc864097af182cbff5c0c1fb" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.IsFrontFaceNode", + "m_ObjectId": "2a552a0b828f457c911aa19561e410ae", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Is Front Face", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4282.0, + "y": -3681.3330078125, + "width": 121.99999237060547, + "height": 77.33348846435547 + } + }, + "m_Slots": [ + { + "m_Id": "2ef1d888dc9d49e59d6a6950897ddc93" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "2ac79705aa9e415dbb74ec215233fd1b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Composite (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3350.0, + "y": -3810.0, + "width": 213.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "a75f7ac601c446469802fe7754c1f279" + }, + { + "m_Id": "8c38a5d8327f456e9783740c05382619" + }, + { + "m_Id": "facc84930f544fd7a0205a6176b18ac0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Composite", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2b01ea3023e34c94af1754e4dcea8f2e", + "m_Id": 0, + "m_DisplayName": "Face Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2bf5f2fdd2984599b7323d10cfb1d240", + "m_Id": 1, + "m_DisplayName": "Filter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Filter", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "2c10b97b92c947ceb307a93759c0228b", + "m_Guid": { + "m_GuidSerialized": "6be0b8ff-a766-4c6b-a6e4-3a72758ac95f" + }, + "m_Name": "Bevel Amount", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B01DD93E", + "m_OverrideReferenceName": "_BevelAmount", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2c7a9460724b47daad8df1be144de7c6", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "2d0a269511e34bd1ba9056d2c939dff2", + "m_Guid": { + "m_GuidSerialized": "edbe73dc-53ab-4bc1-9d64-ab36e0e05f03" + }, + "m_Name": "_FaceUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_3A8E0F13", + "m_OverrideReferenceName": "_FaceUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "2db15d90c2204143b225ec4ef08d0755", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4387.00048828125, + "y": -2381.0, + "width": 163.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "def8e0b9d8384982bc5b4c32d877e458" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "2e4eb1ef08bb44178c82e53872485e0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2ef1d888dc9d49e59d6a6950897ddc93", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": true, + "m_DefaultValue": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "30ca940fe2794c949f2a1d4d2caaa446", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "319916a5921343f7b7eef0e50dc93def", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4791.0, + "y": -3245.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "d219977210094c0082c517d8dc00c8bb" + }, + { + "m_Id": "f48f04ad45d046a8b88e71731ed506e7" + }, + { + "m_Id": "e6e80c6b0db545cda26b079a9a78fbb3" + }, + { + "m_Id": "c6bdb985bc16435fa72f5a3c81bb633c" + }, + { + "m_Id": "d1a17e42e7a04dc38984e3c01149445b" + }, + { + "m_Id": "fb15d0ba56d54a6192f11e107aeb5fa8" + }, + { + "m_Id": "c35312edaa2344788b1964ee2f63a236" + }, + { + "m_Id": "c88fcbaeea954a5f9c68c339fa8b604d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "34a67e0fef884f9399e674d9eeaf720c", + "m_Id": 6, + "m_DisplayName": "Color3", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color3", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "34a72a5ebb04402384a4fd3748111a37", + "m_Id": 0, + "m_DisplayName": "Alpha Clip Threshold", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AlphaClipThreshold", + "m_StageCapability": 2, + "m_Value": 0.0010000000474974514, + "m_DefaultValue": 0.5, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3535ae87c6dd4769b52b20d9eca61069", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "35cbea6373dd4e4f8d0fea36e8add392", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "36a0c473c4c04c3a930dd38f3920d410", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "36f1b4d96f2941c39e5cd95d9c1d2ce6", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6008.99951171875, + "y": -3341.0, + "width": 144.99998474121095, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "65b3dc13b2b6484283ffe5abfe87a06a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "373f1de8db6c429c9d46c781f741d7a4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3802c81c3be24823aa1d7c9997a33c29", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "3915c1927ffe49f8967304321cfbe497", + "m_Id": 4, + "m_DisplayName": "Atlas", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Atlas", + "m_StageCapability": 3, + "m_BareResource": true, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "39a382d661e2484da71f04c43f48e55f", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "39f2f84f30304d859fb07569e2695f60", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3423.000244140625, + "y": -3516.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "4b2d9ea03bf64fa19dcae1511d2581da" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3c50439118b2496f9e390021b0964606", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.AlphaClipThreshold", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3028.0, + "y": -3054.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "34a72a5ebb04402384a4fd3748111a37" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.AlphaClipThreshold" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3d04f5ba6e7b40d281f22eb424145acd", + "m_Id": 0, + "m_DisplayName": "Face Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3db1608e927e4102a3c3a88e9fcab39a", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3dccd64e7f324bc1a75c1479d7a67c51", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "3e231021af7b47ba97f2871e7f25d0fe", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2803.000244140625, + "y": -3520.0, + "width": 140.0, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "6ccaced3889e4503a9414d808ec33981" + }, + { + "m_Id": "7f3d71a6c96847c099da45f95aafbecb" + }, + { + "m_Id": "d8edec16956c4f15b7d51d6ec10753f4" + }, + { + "m_Id": "39a382d661e2484da71f04c43f48e55f" + }, + { + "m_Id": "8764669016f6442f8152593c18a649d7" + }, + { + "m_Id": "26e48352a08441bfa694dcea54c06e36" + }, + { + "m_Id": "3e94a0d106064bdb864c960512ef4026" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3e25be96bb3747738c238cf3a741d5df", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "3e372195f4bd4845852a37839e5b602d", + "m_Guid": { + "m_GuidSerialized": "60abd046-2a1a-48cd-a0af-2f702f7f53ab" + }, + "m_Name": "_MainTex", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_90CBF488", + "m_OverrideReferenceName": "_MainTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":28684132378477856,\"guid\":\"8f586378b4e144a9851e7b34d9b748ee\",\"type\":2}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "3e94a0d106064bdb864c960512ef4026", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "3ec4797e381747829ef4712c85fcf7a1", + "m_Guid": { + "m_GuidSerialized": "020d65cc-50a8-4b8a-a624-90d7b489f549" + }, + "m_Name": "Specular Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_3ec4797e381747829ef4712c85fcf7a1", + "m_OverrideReferenceName": "_SpecularPower", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 4.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "3fdf4b7bc5d4426492dcc057603ef4a6", + "m_Guid": { + "m_GuidSerialized": "675d2567-3fca-4da6-9462-dfa4924950f1" + }, + "m_Name": "_OutlineUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_D66D89E6", + "m_OverrideReferenceName": "_OutlineUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3ffa095f304e42d2827aa230e2ae3887", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "400d0b6c95dd4540ad3da3e8cb7e50b2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "41986ac6400d46709d0ef043a67f6b34", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "41b9b79b3859472882bcea393703eec0", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "424dbeeb009344efa29c304c4979e3d6", + "m_Guid": { + "m_GuidSerialized": "314c37de-c6f2-4463-866d-8588f6fc119e" + }, + "m_Name": "Diffuse Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_424dbeeb009344efa29c304c4979e3d6", + "m_OverrideReferenceName": "_Diffuse", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "42a586e4f6ec40eeaba891b7fd133864", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4934.0, + "y": -4442.99951171875, + "width": 133.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "da7a06d393a44089842070d51d2aa0a6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "42cadae0923e4969b50bbc3f78185934", + "m_Title": "Face + 3 Outlines + Underlay", + "m_Position": { + "x": -5468.0, + "y": -3558.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4328cdbf78b94c038fd614c59bfe1cac", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "44317f2e371447e2a8d894f8a021a235", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Layer1 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4004.999755859375, + "y": -4173.0, + "width": 191.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "10a99c07aad742349d258db16838c129" + }, + { + "m_Id": "b85d677872b44421bf5536f42ba0267c" + }, + { + "m_Id": "75aba700d74d4b2687bf3166cf1da3e2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer1", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "44806230fa384c1e95f9c5918a14f056", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4488af8ff6a7421298a7e827f567263b", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4109.0, + "width": 158.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "66f69ef16eac4eb48357bde804cf3c39" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "4590bfa2a0664b65b6f073bae33a071f", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 1, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "4648b46ad29a4008a80de4f8a5a5b813", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4615.00048828125, + "y": -2415.000244140625, + "width": 145.0, + "height": 130.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "b2baf44eae52473cb6cda7b1debece01" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "46fbf3eeb0ea4470869cba7443249295", + "m_Guid": { + "m_GuidSerialized": "be87c5a3-e361-4b95-89c8-911c39a51c0d" + }, + "m_Name": "Outline Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_A0B54237", + "m_OverrideReferenceName": "_OutlineTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "47d020251e9841a5b1f0fd64396026a1", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "48390d02257d41bf98eace1deaa4c539", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "8036d0e6090b456e9b4ea87227868236" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "484b51c50485473b819c4f05087b32d7", + "m_Title": "Underlay", + "m_Position": { + "x": -5253.0, + "y": -4542.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4907352322c644ebacdf2ca30f2994fd", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "49e7c3ad55ce458797f0e60c950cb965", + "m_Guid": { + "m_GuidSerialized": "31b55db9-0da1-4ec4-af2b-d83747ed5bc4" + }, + "m_Name": "Underlay Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_CE9DEDB3", + "m_OverrideReferenceName": "_UnderlayOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4a66dcbe712a4d40bd8f355b834594b5", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "4abff6ff92fa4a05b203f10580988335", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4308.0, + "y": -3498.000244140625, + "width": 140.0, + "height": 166.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "b015d1b7e4134c59baf6851e7649802c" + }, + { + "m_Id": "d9dc4839ee2847999110bdb234d6041a" + }, + { + "m_Id": "91d6a9a5fbc04ea49075cb51835e7264" + }, + { + "m_Id": "f42ad06b3c6a45d3ab33de904c063412" + }, + { + "m_Id": "ed6c215a65584deeaefad1d2c7743044" + }, + { + "m_Id": "edbee7a8952b46529ac5ad0365775774" + }, + { + "m_Id": "70337a74f6ad4b7bb6befc825219bab1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4b2d9ea03bf64fa19dcae1511d2581da", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4bda5c294e1949138d033640e1d385b4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4c28ee9109014fa086e5de7a3993341d", + "m_Id": 0, + "m_DisplayName": "Softness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4c334de01ecd429baa7652fc6002536b", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4d1cb1a475df49f9a148195a65f5453a", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4d9ce48719d143748f9f8e22da6f9ddc", + "m_Id": 5, + "m_DisplayName": "TextureWidth", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureWidth", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4e64dac49ddc47c3b5b1e27b17a08304", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "4eb3c00a1ca44e10be833b7ca61ff059", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4f194ff591484e908fc2bcdacbcf2570", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4303.00048828125, + "y": -2771.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "2b01ea3023e34c94af1754e4dcea8f2e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "509e6f38505b4b0695b263706a55028f", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "51378bae98a94c309785d14cd5cbb453", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "GetSurfaceNormal (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4067.333251953125, + "y": -3881.99951171875, + "width": 263.9999694824219, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "5b0077c23eae443887872f84227deccc" + }, + { + "m_Id": "3915c1927ffe49f8967304321cfbe497" + }, + { + "m_Id": "4d9ce48719d143748f9f8e22da6f9ddc" + }, + { + "m_Id": "ebd6d75abcb84108bcadbfe7ee5f6244" + }, + { + "m_Id": "ef9738ec7e894772a14e9dce441c16c6" + }, + { + "m_Id": "9eeec1a9713045af8845cea263d5ea48" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GetSurfaceNormal", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "51f76f8a53ad43a4ad028426548ce9ba", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "52798bdb86f6400e86489a7a368e9f8b", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6154.99951171875, + "y": -3169.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1df58cfa4dad4c449d01ee1c5ea05f2e" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "53073e5ea924459fa6681a4943e9f947", + "m_Guid": { + "m_GuidSerialized": "5fdac24e-2d58-4471-80ce-79c3ab9a2564" + }, + "m_Name": "Outline Color 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_DBAB5AEC", + "m_OverrideReferenceName": "_OutlineColor2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.009433984756469727, + "g": 0.02534518577158451, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "54d7a93ffec5490aa4591da23a21b693", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "55a3403c16184e63b4e78607a6a20cd8", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "55ffa45ec3654d5e88089fb40d2b0465", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "56c25395796e4d2fbe5c892d428d1620", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5102.99951171875, + "y": -3427.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "9eb8137a6c2e41bbafdc8b0732dd47a3" + }, + { + "m_Id": "36a0c473c4c04c3a930dd38f3920d410" + }, + { + "m_Id": "068ae649e00b40e198ec5a30ad741fab" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "57abc172afd449e2a4d567f93432507b", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "582d6e289dbe4fdca7cf0307273eaa2f", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "59a09f50a7ca4cd3a0d248a0f3730b6a", + "m_Guid": { + "m_GuidSerialized": "3f9e6596-fd53-48cc-96a5-4c4f0cfbb2ba" + }, + "m_Name": "_ScaleRatioA", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_ScaleRatioA", + "m_DefaultReferenceName": "_ScaleRatioA", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "59bd90a849624124bae6464ee3669aa6", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4008.999755859375, + "y": -2394.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "2e4eb1ef08bb44178c82e53872485e0f" + }, + { + "m_Id": "8695190a5e614f2d90081871a8a06fc2" + }, + { + "m_Id": "81bdb47901ef48e5a588c6724b1b0142" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "5b0077c23eae443887872f84227deccc", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5b3ff4ee364f4d7a923b530ad60d8762", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5bd258837c514ff7ab0bf7027e762c18", + "m_Guid": { + "m_GuidSerialized": "2d8f3ee9-1307-4b58-a60d-526e86b07109" + }, + "m_Name": "Bevel Roundness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_AB6A015F", + "m_OverrideReferenceName": "_BevelRoundness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5da82bf481f8489ebd05e997f617f51b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": 4.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5e42524569844befad16fda5a94eb9cb", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5fbe253f3e444f2aa8ac717f9c856619", + "m_Guid": { + "m_GuidSerialized": "0a61c93f-6430-4aa6-af07-79bc3b411ccd" + }, + "m_Name": "Bevel Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B50BBFCC", + "m_OverrideReferenceName": "_BevelWidth", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.5, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61133d79a89048c195f54939b2a1d30a", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61a6ac5f29344d109411f26850ab0a96", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6271438664e74b3fbf723bd6a1f50f8b", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "62bc551cea604e88b7858cc37d96a98a", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "636180f6e0504f2baaa5cc086980cb47", + "m_Guid": { + "m_GuidSerialized": "c1223e37-093d-4d5a-b2b0-cd9cc3e4f88e" + }, + "m_Name": "Outline Offset 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_636180f6e0504f2baaa5cc086980cb47", + "m_OverrideReferenceName": "_OutlineOffset1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "63c7cd57fc3c45a9a97b514fdae32693", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5266.99951171875, + "y": -3387.0, + "width": 156.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "c422a9a9ff824176aad2241f58c44d0b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "641eda269d7b4da9acb65f8d50035ea9", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "65b3dc13b2b6484283ffe5abfe87a06a", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "65c8e64a7535466e933eed08a2f77532", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4791.0, + "y": -3499.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "256d41e89a204d22951450de1c38051d" + }, + { + "m_Id": "0a67ca5280214bd794dc0ad66b5710a9" + }, + { + "m_Id": "ebbd94a7102a4457a48ac492de3bff14" + }, + { + "m_Id": "6271438664e74b3fbf723bd6a1f50f8b" + }, + { + "m_Id": "c9b722d107ce4cd6a748c883472b9b0f" + }, + { + "m_Id": "74cf69e61bef44589521f1bf2bf3c59a" + }, + { + "m_Id": "6e532f83d1c44e839bcfc5845d3b01d6" + }, + { + "m_Id": "cb5e9f9567e84f8fa5463efc0e256e19" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "66f69ef16eac4eb48357bde804cf3c39", + "m_Id": 0, + "m_DisplayName": "_UnderlayColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "67a519f507384ff1861df5d8d5b486be", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4278.0, + "y": -3939.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "c3e6d7c20c184bf39fd8822130e693e7" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "68ec7c31365549d6a8ce883edfc02de2", + "m_Id": 4, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6a7af6143e114a538663e71f56731a21", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "6b2f65c1463f4f7bad16c54a95d2fe75", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5101.0, + "y": -3301.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "1d35fa1fb5004f96a65ace54fbe4f1ad" + }, + { + "m_Id": "fa6de3be9f5b4411b5081b49e645f424" + }, + { + "m_Id": "400d0b6c95dd4540ad3da3e8cb7e50b2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6ccaced3889e4503a9414d808ec33981", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6dfc1177dd0541a7a780fbf911ad1956", + "m_Id": 0, + "m_DisplayName": "_OutlineTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6e13f3cd573c467a94379f45d96cb690", + "m_Id": 2, + "m_DisplayName": "SSR", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "6e532f83d1c44e839bcfc5845d3b01d6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6e8946a245e842b38231d4a241bfb3ef", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3026.0, + "y": -3110.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "ef0b93f78372439696f50711eaf57d90" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6fbdcc5a972b4fa883dc5f21e525a376", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "7027aaab25924266a063a05df0aa39b3", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "70337a74f6ad4b7bb6befc825219bab1", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "712da461f71a454db59d349f752d41ee", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "71dd947935b64ce38f0d25406dde447b", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "724e17584e97443e9e285dfa7253c8e3", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 0.15000000596046449, + "m_DefaultValue": 1.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "72fb5a0d7796446b9e2b929cb32facdc", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "7444469eb9884253819add9ef96baa25", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4298.0, + "y": -3809.99951171875, + "width": 144.66648864746095, + "height": 129.33323669433595 + } + }, + "m_Slots": [ + { + "m_Id": "03182b3263304258b265266325c21f65" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "748c31bbcecc4b30bec2e42c0612175b", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "74b41464cbed4e9e8e23af5ab9be40cf", + "m_Guid": { + "m_GuidSerialized": "41afbdcb-f3ae-4340-8973-1c1998c992a2" + }, + "m_Name": "Outline Offset 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "74cf69e61bef44589521f1bf2bf3c59a", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "757174b6f25040fdbb20355a21752222", + "m_Id": 0, + "m_DisplayName": "Outline Offset 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "75aba700d74d4b2687bf3166cf1da3e2", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "75c5657544c648058b20cea090f48dbf", + "m_Id": 0, + "m_DisplayName": "_OutlineUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "767769f736d5478cba5f10a415e28e7f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "773b90134e894e429203c0c83e80b9de", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "77e28f3e930b4c249145630ec961af95", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "79147f6986644769b58d9ed64fe771e1", + "m_Id": 0, + "m_DisplayName": "OutlineMode", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7984fd094e1147bdabb4e26fbd3d31c8", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3113.000244140625, + "y": -3468.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "082e9706dffc4c188270980d4e44ce0f" + }, + { + "m_Id": "f2a351a5375c441b8d9ab7e2c9545a77" + }, + { + "m_Id": "41986ac6400d46709d0ef043a67f6b34" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "7a046f410ce64aa88438b0bfd412c045", + "m_Guid": { + "m_GuidSerialized": "d47271f5-5a84-47bf-a09e-c825d2aeb013" + }, + "m_Name": "Outline Color 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_551702C5", + "m_OverrideReferenceName": "_OutlineColor3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "7a0f504e4175406dbd8134250f4e350b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7a80e8839f0e4a1d9a6c0814f8793ee6", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4961.99951171875, + "y": -3452.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "6fbdcc5a972b4fa883dc5f21e525a376" + }, + { + "m_Id": "0ba4932e164847878ddb7b7bcff96985" + }, + { + "m_Id": "9178663316db43d582f1c4a127d307c6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7acfafd73b8c4dfab8c55c18a887e087", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7b144a976914480baf430c0f6f7f4def", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7b8a19bd115e4167a25b59cb3218a817", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "7c27ccb2c2dc4ca59c5438c3358630ca", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "7c73ccc923e744b98f19148b971a6090", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "59a09f50a7ca4cd3a0d248a0f3730b6a" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7d7696aa6d184b4fb9c316a9dec37aee", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4959.0, + "y": -3326.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "4d1cb1a475df49f9a148195a65f5453a" + }, + { + "m_Id": "47d020251e9841a5b1f0fd64396026a1" + }, + { + "m_Id": "62bc551cea604e88b7858cc37d96a98a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7d78a616c2754cc28d1f32cf66ade611", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4006.999755859375, + "y": -2796.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "d9bcb754db834583b6518c5ed5152114" + }, + { + "m_Id": "861d4258049a4a3e8164f7297090f88e" + }, + { + "m_Id": "a7c06457d7454693a8bc3dc95257b2c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "7e0fadb2533f496192c1ad3e78642010", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4188.0, + "width": 173.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d48c3871e3064027a10ae9f4babd3be0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "7f2e6b5f15364ed9835d67d0cf4f8f65", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2586.0, + "y": -3592.0, + "width": 200.0, + "height": 41.0 + } + }, + "m_Slots": [ + { + "m_Id": "85ff8667d72947edada4e9fb4ff60559" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7f3d71a6c96847c099da45f95aafbecb", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "8036d0e6090b456e9b4ea87227868236", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "80e665a5eeb64730a51742f698bf0d48", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "8135ca333f8f4ea78163743e6ec1f55c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4081.999755859375, + "y": -3140.0, + "width": 156.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d6a6a119394e4082a11bc024a6e42ef8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "81bdb47901ef48e5a588c6724b1b0142", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "81e8ed0534534674a74263e6161a2a1a", + "m_Guid": { + "m_GuidSerialized": "78aab961-c4a8-41f3-b203-1239c3b33b13" + }, + "m_Name": "Underlay Dilate", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_D48690B9", + "m_OverrideReferenceName": "_UnderlayDilate", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "82af2db1018543d7832af96c1cfc981f", + "m_Guid": { + "m_GuidSerialized": "37906c7b-9a3a-454b-a62a-9aa097e64bde" + }, + "m_Name": "Light Angle", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_82af2db1018543d7832af96c1cfc981f", + "m_OverrideReferenceName": "_LightAngle", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 6.28000020980835 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "82d5443fe54d4a3b9420f8745d00a632", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": 8.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "836f639bd89d42f9b3a0470c3094815e", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "83c51d5b2f7b4eb785248f419181cb87", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Occlusion", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "944ebbc49c8a4cddb5834e3beab965a2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Occlusion" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "84dc74cdbd8c45e1b189e4fd9a69942d", + "m_Id": 0, + "m_DisplayName": "Outline Offset 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "85a1ad8e741e41759002e8cdc8cd0b96", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "ScreenSpaceRatio (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5800.99951171875, + "y": -3363.0, + "width": 258.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "6e13f3cd573c467a94379f45d96cb690" + }, + { + "m_Id": "8e6ed600f6504f4083092f5b511e44c4" + }, + { + "m_Id": "93b161cce4504cb79c97b6d8db178de7" + }, + { + "m_Id": "2bf5f2fdd2984599b7323d10cfb1d240" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ScreenSpaceRatio", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "85b5940eb77e4625812ded7215bab8d7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4081.999755859375, + "y": -3096.0, + "width": 156.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ada023d617104472b8ab75a81558c0a1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "85ff8667d72947edada4e9fb4ff60559", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "861d4258049a4a3e8164f7297090f88e", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "867a4ae13c0d4a028c71bc1063824c14", + "m_Guid": { + "m_GuidSerialized": "d483c212-0a30-4f6d-b94d-9abbc83a6522" + }, + "m_Name": "Outline Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_C68C9E14", + "m_OverrideReferenceName": "_IsoPerimeter", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 2, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "8695190a5e614f2d90081871a8a06fc2", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "86e21b7b6b7a44238607e41b8a9fb9a4", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Smoothness", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "0801f576ce79452483b42e485405244d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Smoothness" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8764669016f6442f8152593c18a649d7", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "880bb02c6c6b49b18aa6ebc66dc566a0", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "88253223d2c34ecfab92b0c344048f94", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "ComputeSDF (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4323.0, + "width": 227.99998474121095, + "height": 190.0 + } + }, + "m_Slots": [ + { + "m_Id": "c52a1744a9a14989b0ae452ad6de6061" + }, + { + "m_Id": "a03db80c558b4f87a330c5ae0a9443a5" + }, + { + "m_Id": "8f1b1d1e8ff24b3284993e52354e54fa" + }, + { + "m_Id": "5da82bf481f8489ebd05e997f617f51b" + }, + { + "m_Id": "82d5443fe54d4a3b9420f8745d00a632" + }, + { + "m_Id": "61133d79a89048c195f54939b2a1d30a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8a08179f99d649d289b8053d5fa0ad22", + "m_Id": 0, + "m_DisplayName": "Underlay Offset", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8b66f4e6bc9d4662b3218ac33a69839f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8c38a5d8327f456e9783740c05382619", + "m_Id": 3, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8cbd81814903479ea1d3151c1f38183e", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "8cf8aae64c1d443f9303126886b40f17", + "m_Guid": { + "m_GuidSerialized": "8d78c9a5-aaef-41fb-af68-2358e401d7ac" + }, + "m_Name": "_UnderlayColor", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_2F5FE804", + "m_OverrideReferenceName": "_UnderlayColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8e6aee1173864e58be589084897a3f35", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8e6ed600f6504f4083092f5b511e44c4", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "8ed907a2cc7949b68a283ae243ea1977", + "m_Guid": { + "m_GuidSerialized": "36803443-a9bc-4f3c-a4f2-7d66a5417ac1" + }, + "m_Name": "Outline Offset 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8f1b1d1e8ff24b3284993e52354e54fa", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9147636b0cfa466a9b37a013d8f693bf", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5421.99951171875, + "y": -3902.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a4f471e3221c4134b291bd9d2ba22db6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9178663316db43d582f1c4a127d307c6", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "91890fe48ebe4717aea61ecaf3ad4861", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2983.000244140625, + "y": -3468.0, + "width": 119.99999237060547, + "height": 149.0 + } + }, + "m_Slots": [ + { + "m_Id": "3dccd64e7f324bc1a75c1479d7a67c51" + }, + { + "m_Id": "e444f2c81d1e48329fa2c91005277e8d" + }, + { + "m_Id": "b2c26292b7434733878a9b042f44de89" + }, + { + "m_Id": "964fea1fd4b24f4daf5bef84c4b45118" + }, + { + "m_Id": "deac82280a2b43078e0e40863e2d974c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "91d6a9a5fbc04ea49075cb51835e7264", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "928621a3ca2d41c89a10336bbbc81ddc", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "93b161cce4504cb79c97b6d8db178de7", + "m_Id": 3, + "m_DisplayName": "TextureSize", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureSize", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "94300469581b4924ac7dda496811d45d", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "a0b9274619da48a59f26fe58997479ee" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 1, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 0, + "m_AlphaClip": true, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_AdditionalMotionVectorMode": 0, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "TMPro.EditorUtilities.TMP_SDFShaderGUI", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "944ebbc49c8a4cddb5834e3beab965a2", + "m_Id": 0, + "m_DisplayName": "Ambient Occlusion", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Occlusion", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "945b45993dd84a979755b98c48138f72", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "952d0fa5cd744df0b434cd38e9a90b93", + "m_Guid": { + "m_GuidSerialized": "ce395871-ddeb-47c3-a31d-07855800c197" + }, + "m_Name": "_UnderlaySoftness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_F2B9E3EF", + "m_OverrideReferenceName": "_UnderlaySoftness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "95928bcb6a284b8d88105a84c2e1d3ce", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4778.00048828125, + "y": -2581.000244140625, + "width": 155.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d880558893fb442b9320cf55885d1117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "964fea1fd4b24f4daf5bef84c4b45118", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "98934a69591249d5b8b92b39045359a3", + "m_Title": "Outline1 Texture", + "m_Position": { + "x": -4670.00048828125, + "y": -2474.000244140625 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "998db5e5901e45b29040eb2099370071", + "m_Guid": { + "m_GuidSerialized": "6f383614-f2ad-4269-be8f-87b0ecb03cf0" + }, + "m_Name": "Bevel Clamp", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_5BD7E808", + "m_OverrideReferenceName": "_BevelClamp", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "9c228fac287d446296b91a4acf5cec59", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4600.0, + "y": -3498.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "582d6e289dbe4fdca7cf0307273eaa2f" + }, + { + "m_Id": "1db37082bf844442804487b4944352de" + }, + { + "m_Id": "8b66f4e6bc9d4662b3218ac33a69839f" + }, + { + "m_Id": "4a66dcbe712a4d40bd8f355b834594b5" + }, + { + "m_Id": "a0285c9c381a49cba194709efa0a7c85" + }, + { + "m_Id": "b2728d0dd3ce40678867c94a7d977916" + }, + { + "m_Id": "e141833aa78b4fd59ecad949beb43a78" + }, + { + "m_Id": "51f76f8a53ad43a4ad028426548ce9ba" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9c26fdddba244d36a854298c00473247", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "9d3c3383d5934a17bf9efbb7fd9e9043", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5443.0, + "y": -3315.0, + "width": 144.99998474121095, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "232b1aa09e67479abae141d3c76d3c5b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e6e50a71d9843b49b62ebe1cf7d3d59", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4486.0, + "y": -3865.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "3535ae87c6dd4769b52b20d9eca61069" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e87ce9607e14015a3790c528ca5dfda", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4635.00048828125, + "y": -2239.0, + "width": 167.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "75c5657544c648058b20cea090f48dbf" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "9eb8137a6c2e41bbafdc8b0732dd47a3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "9eeec1a9713045af8845cea263d5ea48", + "m_Id": 6, + "m_DisplayName": "IsFront", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "IsFront", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "9f0de188085746d5a19073da1de85ddb", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4152.0, + "y": -2771.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "7c27ccb2c2dc4ca59c5438c3358630ca" + }, + { + "m_Id": "373f1de8db6c429c9d46c781f741d7a4" + }, + { + "m_Id": "fd0b096ed5b74f9e9ec51327be200731" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "a0206f980dc6455f84f5a8442838c726", + "m_Id": 0, + "m_DisplayName": "Normal (Tangent Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalTS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a0285c9c381a49cba194709efa0a7c85", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a03db80c558b4f87a330c5ae0a9443a5", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalLitSubTarget", + "m_ObjectId": "a0b9274619da48a59f26fe58997479ee", + "m_WorkflowMode": 1, + "m_NormalDropOffSpace": 0, + "m_ClearCoat": false, + "m_BlendModePreserveSpecular": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "a3f8b6e8ae7f48e2989a029904401502", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "a455bd79094c4413a7b7dd80ca8b9368", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4606.99951171875, + "y": -2689.0, + "width": 221.99998474121095, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "7027aaab25924266a063a05df0aa39b3" + }, + { + "m_Id": "2c7a9460724b47daad8df1be144de7c6" + }, + { + "m_Id": "55ffa45ec3654d5e88089fb40d2b0465" + }, + { + "m_Id": "e495a9f7a11f4eb89334e83be154ceb9" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateShaderProperty", + "m_ObjectId": "a4ad98d8828c424384229c344ebe2ed0", + "m_Guid": { + "m_GuidSerialized": "f98fc1a2-bb81-4bd1-a207-23d3a90d518e" + }, + "m_Name": "SamplerState", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "SamplerState_a4ad98d8828c424384229c344ebe2ed0", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": false, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_filter": 0, + "m_wrap": 1, + "m_anisotropic": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a4f471e3221c4134b291bd9d2ba22db6", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "a535f3bcbeb14622bb177eb6f46e76f4", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4628.00048828125, + "y": -2283.0, + "width": 157.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "6dfc1177dd0541a7a780fbf911ad1956" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "a6bbb32e8d884be9bb36db91fe4b81b1", + "m_Guid": { + "m_GuidSerialized": "6aa76edf-7b80-46ac-add4-406cf1d85493" + }, + "m_Name": "_GradientScale", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_EAE27356", + "m_OverrideReferenceName": "_GradientScale", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 10.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "a6c38edd2e8743a9b057ba8452b9f129", + "m_Guid": { + "m_GuidSerialized": "9fc942ee-4a1d-4ced-a5a6-81893e3ddb63" + }, + "m_Name": "Light Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_a6c38edd2e8743a9b057ba8452b9f129", + "m_OverrideReferenceName": "_SpecularColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "a75f7ac601c446469802fe7754c1f279", + "m_Id": 0, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a7942746b5564dc7bbbae1deb2403022", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "a7c06457d7454693a8bc3dc95257b2c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "aa2794b8f0e24bf281d22e0fef0647be", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "aa3e347d733e48f7b65d8a8847370eec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "EvaluateLight (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3631.0, + "y": -3810.0, + "width": 230.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "0699eea947fc426cbfeb8744cf120222" + }, + { + "m_Id": "0c4dc51f26484c26ad88a3fe4002abcd" + }, + { + "m_Id": "d5173cc3c6cd4f1998550f3187a3e9c8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "EvaluateLight", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aa87c72ac0e64469acc34f936f00b3d0", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4225.0, + "width": 193.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "0d7878dd226d4cfb81a991dc312309fc" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "abd59150589b436cadf8c9e6f43ccb8e", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "aca823a8188948c782eddaf0f45e1868", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalOS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2542.0, + "y": -3404.000244140625, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "e386b183a18245a796b024022f7f3074" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalOS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "acd0cd5a177f4a97bf23db7219305e3f", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4348.0, + "y": -3905.99951171875, + "width": 185.33299255371095, + "height": 101.33324432373047 + } + }, + "m_Slots": [ + { + "m_Id": "945b45993dd84a979755b98c48138f72" + }, + { + "m_Id": "e51a636b2621440eb94cc802c1cf4bfc" + }, + { + "m_Id": "1bdde3efd3b7464b8934c555be0f8a48" + }, + { + "m_Id": "129f271ebc77450994e18f0a30579bf5" + }, + { + "m_Id": "3ffa095f304e42d2827aa230e2ae3887" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "ad3e1d26f4404555a8dd29223caaf1ef", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Metallic", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "b46afdad84944599b00e887d2ce29cc3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Metallic" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ada023d617104472b8ab75a81558c0a1", + "m_Id": 0, + "m_DisplayName": "Outline Color 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aef5c44f84e04c3185e0b93e95e34204", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5264.99951171875, + "y": -3142.0, + "width": 159.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "84dc74cdbd8c45e1b189e4fd9a69942d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b000f852aa984e9dae25b125a4607f4e", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b015d1b7e4134c59baf6851e7649802c", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "b0b352c4503a43d083a64e57352b29a0", + "m_Guid": { + "m_GuidSerialized": "01cfcc78-60aa-4f71-a1e3-8d8df6dae253" + }, + "m_Name": "Reflectivity Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_b0b352c4503a43d083a64e57352b29a0", + "m_OverrideReferenceName": "_Reflectivity", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 5.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 5.0, + "y": 15.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "b1188549725543d485436c2e921ffbb2", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4142.0, + "y": -2890.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "281bcee4777040f8a31ee0e10344e98d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "b163c9f1666644b0bba62cf0e12df7bc", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4367.0, + "y": -2713.0, + "width": 180.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "cce40479b6284b6fa3174db9f09d0ac9" + }, + { + "m_Id": "80e665a5eeb64730a51742f698bf0d48" + }, + { + "m_Id": "1f46181633594ae0a1fb2adb76b42981" + }, + { + "m_Id": "8cbd81814903479ea1d3151c1f38183e" + }, + { + "m_Id": "cfaf3f3a5a1146e194cddad30c95aada" + }, + { + "m_Id": "b43489e37a5c4df88f15844292a55ec7" + }, + { + "m_Id": "cd7281fb41aa4e61ac0fdf71d4f4bd46" + }, + { + "m_Id": "f01d52cdcb1647aab35782b4af535efd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 1, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b224a1cf80604103ad085c799995f3c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b2728d0dd3ce40678867c94a7d977916", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b2baf44eae52473cb6cda7b1debece01", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b2c26292b7434733878a9b042f44de89", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b42e6dbfbc864097af182cbff5c0c1fb", + "m_Id": 0, + "m_DisplayName": "Outline Color 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b43489e37a5c4df88f15844292a55ec7", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b467be738d0e454995e380cbf526efe3", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b46afdad84944599b00e887d2ce29cc3", + "m_Id": 0, + "m_DisplayName": "Metallic", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Metallic", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "b4a40cb6acd441acb83cfe0240bf910d", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4750.99951171875, + "y": -4274.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "d0b10e52e21941b183f5f635894c76c8" + }, + { + "m_Id": "0d6a57754b824f6db9cefa6953bc06a9" + }, + { + "m_Id": "773b90134e894e429203c0c83e80b9de" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "b571db753a1948d5a6f1de4e7d0c7238", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5581.99951171875, + "y": -3867.0, + "width": 183.99998474121095, + "height": 100.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "5b3ff4ee364f4d7a923b530ad60d8762" + }, + { + "m_Id": "c183b5bd9bbe45089f93996e73110918" + }, + { + "m_Id": "1196ae398cc348349ab0c1a23fdab4bd" + }, + { + "m_Id": "7b144a976914480baf430c0f6f7f4def" + }, + { + "m_Id": "836f639bd89d42f9b3a0470c3094815e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b691728a389a417d9b4f2d02541209c2", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b7f9ac55517141868bfb9d2ad6429792", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b85d677872b44421bf5536f42ba0267c", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "bc9afcb18afa4ccc82d2cdc34d3f4641", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -5392.0, + "y": -3867.0, + "width": 125.99999237060547, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "5e42524569844befad16fda5a94eb9cb" + }, + { + "m_Id": "54d7a93ffec5490aa4591da23a21b693" + }, + { + "m_Id": "aa2794b8f0e24bf281d22e0fef0647be" + }, + { + "m_Id": "200245fc8bbe4826b209ab5f7ffe074c" + }, + { + "m_Id": "fc2e62201c5847e798fd939314413fcd" + }, + { + "m_Id": "fe11fa80cc1847a5a37f6757d521cf25" + }, + { + "m_Id": "de0c6f7f7af94defa6c3dbc6433de9d4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c183b5bd9bbe45089f93996e73110918", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "c234e5216678436195ee1a5914bc79da", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4446.0, + "y": -2347.0, + "width": 221.99998474121095, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "8e6aee1173864e58be589084897a3f35" + }, + { + "m_Id": "3db1608e927e4102a3c3a88e9fcab39a" + }, + { + "m_Id": "0f7ffb6d2de4447f9736780cbcee8e07" + }, + { + "m_Id": "d4954b7bbbb0412cbc997bcbe7dfa808" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "c35312edaa2344788b1964ee2f63a236", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "c3e6d7c20c184bf39fd8822130e693e7", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "c422a9a9ff824176aad2241f58c44d0b", + "m_Id": 0, + "m_DisplayName": "Outline Offset 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "c478c32c45884c57a62f7b2aa8ddc3b0", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c52a1744a9a14989b0ae452ad6de6061", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c6bdb985bc16435fa72f5a3c81bb633c", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c7d4094601ac4bc1aead609c72b1f1c1", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c7ddee91dc5b48dc828309c77fdb0b88", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4266.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a7942746b5564dc7bbbae1deb2403022" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "c88fcbaeea954a5f9c68c339fa8b604d", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c9b722d107ce4cd6a748c883472b9b0f", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c9d7f0dbae7d422985a1cc87c025e76b", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4312.0, + "y": -3179.000244140625, + "width": 144.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "79147f6986644769b58d9ed64fe771e1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "c9ec735d1a1046769e5601b2c97c849a", + "m_Guid": { + "m_GuidSerialized": "281a9526-c332-4471-a44e-ece4a1e95ef6" + }, + "m_Name": "Face Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_75569DEA", + "m_OverrideReferenceName": "_FaceTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ca2a1083dc014f39ab8af0cdf140866b", + "m_Id": 0, + "m_DisplayName": "_FaceTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "cb3c0c3f08654b068bea44c4ffb15f4a", + "m_Guid": { + "m_GuidSerialized": "21009d12-8d94-4273-b0d0-a8ee0608ddcf" + }, + "m_Name": "OutlineMode", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_cb3c0c3f08654b068bea44c4ffb15f4a", + "m_OverrideReferenceName": "_OutlineMode", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cb5e9f9567e84f8fa5463efc0e256e19", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "cb7117ecb1d047a8b2cb00ed552cb181", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3032.66650390625, + "y": -3029.33349609375, + "width": 200.0, + "height": 41.33349609375 + } + }, + "m_Slots": [ + { + "m_Id": "724e17584e97443e9e285dfa7253c8e3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cc88101667c9488f9c5a716e851c1b21", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cce40479b6284b6fa3174db9f09d0ac9", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "cd7281fb41aa4e61ac0fdf71d4f4bd46", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cda5e3b4c1054bf3a65c0b7ec6bc778a", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "cdddee3a537c464697357f11b966f9b8", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4420.0, + "y": -4483.0, + "width": 156.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "41b9b79b3859472882bcea393703eec0" + }, + { + "m_Id": "c7d4094601ac4bc1aead609c72b1f1c1" + }, + { + "m_Id": "767769f736d5478cba5f10a415e28e7f" + }, + { + "m_Id": "b691728a389a417d9b4f2d02541209c2" + }, + { + "m_Id": "045c4f6b050549c7a0efb208e6349779" + }, + { + "m_Id": "509e6f38505b4b0695b263706a55028f" + }, + { + "m_Id": "204dacb5a95b424facf11cb6f65bd188" + }, + { + "m_Id": "35cbea6373dd4e4f8d0fea36e8add392" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "cfaf3f3a5a1146e194cddad30c95aada", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d0a791a544614667962a9a9a9ce0c68a", + "m_Title": "Screen Space Ratio", + "m_Position": { + "x": -6179.99951171875, + "y": -3422.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d0b10e52e21941b183f5f635894c76c8", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d1a17e42e7a04dc38984e3c01149445b", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d219977210094c0082c517d8dc00c8bb", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d258902c6ec74942afdb9ebf8c1d07f8", + "m_Title": "Generate Normal", + "m_Position": { + "x": -4511.33349609375, + "y": -3999.3330078125 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "d30452ac6b244ecca03df4d7b4de9f81", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d48c3871e3064027a10ae9f4babd3be0", + "m_Id": 0, + "m_DisplayName": "_UnderlaySoftness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d4954b7bbbb0412cbc997bcbe7dfa808", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "d4df208fc23b42f2b52364124f1b661c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5268.0, + "y": -3261.0, + "width": 159.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "757174b6f25040fdbb20355a21752222" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "d5173cc3c6cd4f1998550f3187a3e9c8", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d6a6a119394e4082a11bc024a6e42ef8", + "m_Id": 0, + "m_DisplayName": "Outline Color 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d880558893fb442b9320cf55885d1117", + "m_Id": 0, + "m_DisplayName": "_FaceUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d8edec16956c4f15b7d51d6ec10753f4", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d9bcb754db834583b6518c5ed5152114", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d9dc4839ee2847999110bdb234d6041a", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "da7a06d393a44089842070d51d2aa0a6", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "daaf032a109749a88c9b8ff8e1f8b541", + "m_Title": "Offset Scale", + "m_Position": { + "x": -5747.99951171875, + "y": -3961.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "dbcb748279484a4590e53518c49122b8", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4776.00048828125, + "y": -2757.000244140625, + "width": 145.0, + "height": 130.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "7a0f504e4175406dbd8134250f4e350b" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "dc75c4e3a1bc4bb0a128086c2b0679a5", + "m_Guid": { + "m_GuidSerialized": "85cd941f-2fd2-43a3-b0fa-9f728bfb4220" + }, + "m_Name": "Face Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_99AFBB3D", + "m_OverrideReferenceName": "_FaceColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "de0c6f7f7af94defa6c3dbc6433de9d4", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "deac82280a2b43078e0e40863e2d974c", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "def8e0b9d8384982bc5b4c32d877e458", + "m_Id": 0, + "m_DisplayName": "Outline Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "dff7a66b353a4023b29c9d937da77960", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4602.0, + "y": -4298.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "7b8a19bd115e4167a25b59cb3218a817" + }, + { + "m_Id": "0b57f2d35157477ab2b29a5aac14ae8b" + }, + { + "m_Id": "e9e06fcb161e44ba8cc9f6f60264df78" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "e141833aa78b4fd59ecad949beb43a78", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e2d28f29bbac4983a401574480b5ca28", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "e386b183a18245a796b024022f7f3074", + "m_Id": 0, + "m_DisplayName": "Normal (Object Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalOS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e444f2c81d1e48329fa2c91005277e8d", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "e495a9f7a11f4eb89334e83be154ceb9", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e51a636b2621440eb94cc802c1cf4bfc", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e591df3a1eb94e259b762f2830b407e2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Emission", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "4590bfa2a0664b65b6f073bae33a071f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Emission" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e6e80c6b0db545cda26b079a9a78fbb3", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "e818605f8f5a4f01bf61caaa33693581", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "ComputeSDF44 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4144.0, + "y": -3369.0, + "width": 244.0, + "height": 214.0 + } + }, + "m_Slots": [ + { + "m_Id": "641eda269d7b4da9acb65f8d50035ea9" + }, + { + "m_Id": "f6823778a3cf42d5bbe8a83e5f9c9fa3" + }, + { + "m_Id": "9c26fdddba244d36a854298c00473247" + }, + { + "m_Id": "f684c5678e9e4f078157a3ab7ef5057b" + }, + { + "m_Id": "14ad19bf20a140dd88d58452d7df688b" + }, + { + "m_Id": "215a82c127204988b751de7d3a39b955" + }, + { + "m_Id": "c478c32c45884c57a62f7b2aa8ddc3b0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF44", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e9e06fcb161e44ba8cc9f6f60264df78", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebbd94a7102a4457a48ac492de3bff14", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebd6d75abcb84108bcadbfe7ee5f6244", + "m_Id": 7, + "m_DisplayName": "TextureHeight", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureHeight", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "ec184d6d9fb2494897774c9e7d279e6d", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4778.00048828125, + "y": -2626.0, + "width": 145.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ca2a1083dc014f39ab8af0cdf140866b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "07946387933e416db576b677f0711e5f" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "ec1f2e8bc9fd4ae38b133c60ee6c49b8", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4957.99951171875, + "y": -3204.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "748c31bbcecc4b30bec2e42c0612175b" + }, + { + "m_Id": "4bda5c294e1949138d033640e1d385b4" + }, + { + "m_Id": "4e64dac49ddc47c3b5b1e27b17a08304" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "ec79eb447dfd47a9b3380344c6a60f43", + "m_Guid": { + "m_GuidSerialized": "54c77f8b-0534-4b35-a3f0-83ab2ebe6c1f" + }, + "m_Name": "_OutlineTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1774DE83", + "m_OverrideReferenceName": "_OutlineTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "ecf16c34d46f4502ac601f0c38c7576b", + "m_Title": "Vertex Color", + "m_Position": { + "x": -3448.000244140625, + "y": -3579.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ed1d1f1613334c3bb904dd08161cd7e5", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ed6c215a65584deeaefad1d2c7743044", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "edbee7a8952b46529ac5ad0365775774", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "ef0b93f78372439696f50711eaf57d90", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.7353569269180298, + "y": 0.7353569269180298, + "z": 0.7353569269180298 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "ef9738ec7e894772a14e9dce441c16c6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "f01d52cdcb1647aab35782b4af535efd", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "f23a8b2b7c85478388ff7a8c8a6de740", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Layer4 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3849.999755859375, + "y": -3286.0, + "width": 193.0, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "0fac35636fca4474a6afaefc3c757775" + }, + { + "m_Id": "cc88101667c9488f9c5a716e851c1b21" + }, + { + "m_Id": "68ec7c31365549d6a8ce883edfc02de2" + }, + { + "m_Id": "02559cbe5ad441a3904ccb75ded2b2c5" + }, + { + "m_Id": "34a67e0fef884f9399e674d9eeaf720c" + }, + { + "m_Id": "3802c81c3be24823aa1d7c9997a33c29" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer4", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f2903158b3624759bca1fcd843698078", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f2a351a5375c441b8d9ab7e2c9545a77", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "f383b24f0bc6434dafe44b3e3d338a63", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6012.99951171875, + "y": -3209.0, + "width": 183.99998474121095, + "height": 100.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "fb5e1e2a67c14602808358686bb75091" + }, + { + "m_Id": "712da461f71a454db59d349f752d41ee" + }, + { + "m_Id": "b000f852aa984e9dae25b125a4607f4e" + }, + { + "m_Id": "55a3403c16184e63b4e78607a6a20cd8" + }, + { + "m_Id": "b467be738d0e454995e380cbf526efe3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "f3d31c1f18d8491a8ecf5cbc37e4b7db", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4321.0, + "y": -3281.000244140625, + "width": 153.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ed1d1f1613334c3bb904dd08161cd7e5" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f42ad06b3c6a45d3ab33de904c063412", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f48f04ad45d046a8b88e71731ed506e7", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f4ecc442a2d246759f7c2c0412953d28", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a3f8b6e8ae7f48e2989a029904401502" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f6823778a3cf42d5bbe8a83e5f9c9fa3", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f684c5678e9e4f078157a3ab7ef5057b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": { + "x": 3.0, + "y": 2.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "f814deb543c24fbbafbcdb5071d96022", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4600.0, + "y": -3245.0, + "width": 183.99998474121095, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "abd59150589b436cadf8c9e6f43ccb8e" + }, + { + "m_Id": "7acfafd73b8c4dfab8c55c18a887e087" + }, + { + "m_Id": "928621a3ca2d41c89a10336bbbc81ddc" + }, + { + "m_Id": "b7f9ac55517141868bfb9d2ad6429792" + }, + { + "m_Id": "09b1b86c1c074337a4c439d3a308dd2e" + }, + { + "m_Id": "1f247658c7ba45fb93c41f51e21acb0d" + }, + { + "m_Id": "d30452ac6b244ecca03df4d7b4de9f81" + }, + { + "m_Id": "215b30ae27784ec3a13360a9029af283" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f864c900600e427ba7793f00c715e971", + "m_Id": 0, + "m_DisplayName": "Outline Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fa6de3be9f5b4411b5081b49e645f424", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DivideNode", + "m_ObjectId": "faace8101df943d8956faa31728cb004", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Divide", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5254.99951171875, + "y": -3891.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "77e28f3e930b4c249145630ec961af95" + }, + { + "m_Id": "f2903158b3624759bca1fcd843698078" + }, + { + "m_Id": "30ca940fe2794c949f2a1d4d2caaa446" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "facc84930f544fd7a0205a6176b18ac0", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "fb15d0ba56d54a6192f11e107aeb5fa8", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fb5e1e2a67c14602808358686bb75091", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "fc2e62201c5847e798fd939314413fcd", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fd0b096ed5b74f9e9ec51327be200731", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "fdb77c3e92ee497b88ca5dc46dc45350", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4208.0, + "y": -2371.0, + "width": 180.0, + "height": 180.0 + } + }, + "m_Slots": [ + { + "m_Id": "4328cdbf78b94c038fd614c59bfe1cac" + }, + { + "m_Id": "04dfcc9ff13a4bf282ed46faec39d15c" + }, + { + "m_Id": "71dd947935b64ce38f0d25406dde447b" + }, + { + "m_Id": "61a6ac5f29344d109411f26850ab0a96" + }, + { + "m_Id": "44806230fa384c1e95f9c5918a14f056" + }, + { + "m_Id": "4eb3c00a1ca44e10be833b7ca61ff059" + }, + { + "m_Id": "57abc172afd449e2a4d567f93432507b" + }, + { + "m_Id": "cda5e3b4c1054bf3a65c0b7ec6bc778a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "fe11fa80cc1847a5a37f6757d521cf25", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph.meta b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph.meta new file mode 100644 index 00000000..54c945eb --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a3d800b099a06e0478fb790c5e79057a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph new file mode 100644 index 00000000..d7d31de8 --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph @@ -0,0 +1,11629 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "386c36a1c4c34ea29deb680fb82cfe8b", + "m_Properties": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "4a0041116f73406db7a62ae80ff54ef4" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "bafc3d388c1e444e820897b9a3d6029a" + } + ], + "m_Nodes": [ + { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + }, + { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + }, + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + } + ], + "m_GroupDatas": [ + { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + } + ], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "007c75c776ac4f1babe9cd7ae1fc4f14" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "04dc152dd2ba4d519391577eb1156235" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "105b1ed1aa714e41bbe1ef5472bdb11f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "150533bad8e2424aaa2c74e253af8592" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "19075add867e4757b9520d18fe8de1d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1c4df61c2fea404eb3b87b270d7c59bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1e12726617b24675958e942eb62e4b09" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "285f6a9863d54ed2a8150727ad749456" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2a552a0b828f457c911aa19561e410ae" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2db15d90c2204143b225ec4ef08d0755" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "36f1b4d96f2941c39e5cd95d9c1d2ce6" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "39f2f84f30304d859fb07569e2695f60" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "163beb4431c34f538340bc0af0991e6f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 5 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "42a586e4f6ec40eeaba891b7fd133864" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4488af8ff6a7421298a7e827f567263b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4648b46ad29a4008a80de4f8a5a5b813" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "4f194ff591484e908fc2bcdacbcf2570" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "52798bdb86f6400e86489a7a368e9f8b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "63c7cd57fc3c45a9a97b514fdae32693" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "67a519f507384ff1861df5d8d5b486be" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7444469eb9884253819add9ef96baa25" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7984fd094e1147bdabb4e26fbd3d31c8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c8e64a7535466e933eed08a2f77532" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "319916a5921343f7b7eef0e50dc93def" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7e0fadb2533f496192c1ad3e78642010" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8135ca333f8f4ea78163743e6ec1f55c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "85b5940eb77e4625812ded7215bab8d7" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "44317f2e371447e2a8d894f8a021a235" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9147636b0cfa466a9b37a013d8f693bf" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e231021af7b47ba97f2871e7f25d0fe" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "91890fe48ebe4717aea61ecaf3ad4861" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "95928bcb6a284b8d88105a84c2e1d3ce" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9c228fac287d446296b91a4acf5cec59" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7a80e8839f0e4a1d9a6c0814f8793ee6" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d7696aa6d184b4fb9c316a9dec37aee" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9d3c3383d5934a17bf9efbb7fd9e9043" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e6e50a71d9843b49b62ebe1cf7d3d59" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9e87ce9607e14015a3790c528ca5dfda" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a535f3bcbeb14622bb177eb6f46e76f4" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2ac79705aa9e415dbb74ec215233fd1b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa87c72ac0e64469acc34f936f00b3d0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 4 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 5 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "acd0cd5a177f4a97bf23db7219305e3f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51378bae98a94c309785d14cd5cbb453" + }, + "m_SlotId": 7 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aef5c44f84e04c3185e0b93e95e34204" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b1188549725543d485436c2e921ffbb2" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d78a616c2754cc28d1f32cf66ade611" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b163c9f1666644b0bba62cf0e12df7bc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9f0de188085746d5a19073da1de85ddb" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b571db753a1948d5a6f1de4e7d0c7238" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bc9afcb18afa4ccc82d2cdc34d3f4641" + }, + "m_SlotId": 6 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c234e5216678436195ee1a5914bc79da" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c7ddee91dc5b48dc828309c77fdb0b88" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c9d7f0dbae7d422985a1cc87c025e76b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88253223d2c34ecfab92b0c344048f94" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d4df208fc23b42f2b52364124f1b661c" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dbcb748279484a4590e53518c49122b8" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "dff7a66b353a4023b29c9d937da77960" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cdddee3a537c464697357f11b966f9b8" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec184d6d9fb2494897774c9e7d279e6d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a455bd79094c4413a7b7dd80ca8b9368" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ec1f2e8bc9fd4ae38b133c60ee6c49b8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f23a8b2b7c85478388ff7a8c8a6de740" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa3e347d733e48f7b65d8a8847370eec" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f383b24f0bc6434dafe44b3e3d338a63" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "85a1ad8e741e41759002e8cdc8cd0b96" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f3d31c1f18d8491a8ecf5cbc37e4b7db" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e818605f8f5a4f01bf61caaa33693581" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f814deb543c24fbbafbcdb5071d96022" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "4abff6ff92fa4a05b203f10580988335" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "109f638d1f9b49d4991d6d21a86d4eb7" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "56c25395796e4d2fbe5c892d428d1620" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b2f65c1463f4f7bad16c54a95d2fe75" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "faace8101df943d8956faa31728cb004" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b4a40cb6acd441acb83cfe0240bf910d" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fdb77c3e92ee497b88ca5dc46dc45350" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "59bd90a849624124bae6464ee3669aa6" + }, + "m_SlotId": 1 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": -2624.000244140625, + "y": -3709.000244140625 + }, + "m_Blocks": [ + { + "m_Id": "48390d02257d41bf98eace1deaa4c539" + }, + { + "m_Id": "f4ecc442a2d246759f7c2c0412953d28" + }, + { + "m_Id": "7f2e6b5f15364ed9835d67d0cf4f8f65" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": -2624.000244140625, + "y": -3424.000244140625 + }, + "m_Blocks": [ + { + "m_Id": "aca823a8188948c782eddaf0f45e1868" + }, + { + "m_Id": "6e8946a245e842b38231d4a241bfb3ef" + }, + { + "m_Id": "cb7117ecb1d047a8b2cb00ed552cb181" + }, + { + "m_Id": "3c50439118b2496f9e390021b0964606" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"fileID\":10210,\"guid\":\"0000000000000000e000000000000000\",\"type\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "TextMeshPro/SRP", + "m_GraphPrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_ActiveTargets": [ + { + "m_Id": "94300469581b4924ac7dda496811d45d" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "007c75c776ac4f1babe9cd7ae1fc4f14", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5868.0, + "y": -3787.000244140625, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "1356dc7cbdfa4199a6535d3bbf4cd536" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "013228b0fdf1424097798f0973a9a4fb", + "m_Title": "Face Texture", + "m_Position": { + "x": -4779.494140625, + "y": -2948.97265625 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "02559cbe5ad441a3904ccb75ded2b2c5", + "m_Id": 5, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "03182b3263304258b265266325c21f65", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "045c4f6b050549c7a0efb208e6349779", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "04dc152dd2ba4d519391577eb1156235", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4500.0, + "y": -2747.0, + "width": 151.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "3d04f5ba6e7b40d281f22eb424145acd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "04dfcc9ff13a4bf282ed46faec39d15c", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "05805bc6fcc941fd889922555c6c86d7", + "m_Guid": { + "m_GuidSerialized": "fe84e680-4cee-4ca5-be86-2e293a9ba093" + }, + "m_Name": "Ambient Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_05805bc6fcc941fd889922555c6c86d7", + "m_OverrideReferenceName": "_Ambient", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "0580d4b7e3a049049569f4508643a724", + "m_Guid": { + "m_GuidSerialized": "eefb88c5-7665-45dc-b3c2-7cf98b9990d6" + }, + "m_Name": "Softness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_D64EC33D", + "m_OverrideReferenceName": "_Softness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "068ae649e00b40e198ec5a30ad741fab", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0699eea947fc426cbfeb8744cf120222", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "07946387933e416db576b677f0711e5f", + "m_Guid": { + "m_GuidSerialized": "21d612fb-8153-41f8-9e2f-9de044c19fbf" + }, + "m_Name": "_FaceTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1A08AD4A", + "m_OverrideReferenceName": "_FaceTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "082e9706dffc4c188270980d4e44ce0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0848ba750e0341198cf0bbd413e0efe4", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "09b1b86c1c074337a4c439d3a308dd2e", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0a67ca5280214bd794dc0ad66b5710a9", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0b57f2d35157477ab2b29a5aac14ae8b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0ba4932e164847878ddb7b7bcff96985", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0c4dc51f26484c26ad88a3fe4002abcd", + "m_Id": 2, + "m_DisplayName": "Color (1)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "0d6a57754b824f6db9cefa6953bc06a9", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0d7878dd226d4cfb81a991dc312309fc", + "m_Id": 0, + "m_DisplayName": "Underlay Dilate", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "0eeb5490760e492f8c9691086fa00929" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "0f7ffb6d2de4447f9736780cbcee8e07", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "0fac35636fca4474a6afaefc3c757775", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "105b1ed1aa714e41bbe1ef5472bdb11f", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4923.99951171875, + "y": -4233.0, + "width": 158.99998474121095, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "8a08179f99d649d289b8053d5fa0ad22" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "109f638d1f9b49d4991d6d21a86d4eb7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5068.0, + "y": -3182.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "880bb02c6c6b49b18aa6ebc66dc566a0" + }, + { + "m_Id": "1b9cd8f5f4004e2eaf8afbaab803bc04" + }, + { + "m_Id": "b224a1cf80604103ad085c799995f3c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "10a99c07aad742349d258db16838c129", + "m_Id": 1, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1196ae398cc348349ab0c1a23fdab4bd", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1356dc7cbdfa4199a6535d3bbf4cd536", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "14ad19bf20a140dd88d58452d7df688b", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "150533bad8e2424aaa2c74e253af8592", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4923.99951171875, + "y": -3486.666259765625, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "72fb5a0d7796446b9e2b929cb32facdc" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "163beb4431c34f538340bc0af0991e6f", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3415.000244140625, + "y": -3462.0, + "width": 120.00000762939453, + "height": 149.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "4c334de01ecd429baa7652fc6002536b" + }, + { + "m_Id": "e2d28f29bbac4983a401574480b5ca28" + }, + { + "m_Id": "6a7af6143e114a538663e71f56731a21" + }, + { + "m_Id": "3e25be96bb3747738c238cf3a741d5df" + }, + { + "m_Id": "4907352322c644ebacdf2ca30f2994fd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "19075add867e4757b9520d18fe8de1d0", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4261.33349609375, + "y": -3197.33349609375, + "width": 124.66650390625, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "4c28ee9109014fa086e5de7a3993341d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "0580d4b7e3a049049569f4508643a724" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1b9cd8f5f4004e2eaf8afbaab803bc04", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1bdde3efd3b7464b8934c555be0f8a48", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "1be90d4f96a841748b0c95219b12ad27", + "m_Guid": { + "m_GuidSerialized": "4c91c146-43bb-4de8-948a-fbf8b1da10e1" + }, + "m_Name": "Bevel Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_97690701", + "m_OverrideReferenceName": "_BevelOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": -0.5, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "1c4df61c2fea404eb3b87b270d7c59bc", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4280.0, + "y": -3221.33349609375, + "width": 145.3330078125, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "f864c900600e427ba7793f00c715e971" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1d35fa1fb5004f96a65ace54fbe4f1ad", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1d7d96a5770b4f8ebb162bdbde020bca", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1db37082bf844442804487b4944352de", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "1df58cfa4dad4c449d01ee1c5ea05f2e", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "1e12726617b24675958e942eb62e4b09", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4772.0, + "y": -4404.0, + "width": 145.00001525878907, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "0848ba750e0341198cf0bbd413e0efe4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "1f247658c7ba45fb93c41f51e21acb0d", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1f46181633594ae0a1fb2adb76b42981", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "200245fc8bbe4826b209ab5f7ffe074c", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "204dacb5a95b424facf11cb6f65bd188", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "215a82c127204988b751de7d3a39b955", + "m_Id": 6, + "m_DisplayName": "Outline", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Outline", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "215b30ae27784ec3a13360a9029af283", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "21a7a380e66d42e780e2a2a1baa630d5", + "m_Guid": { + "m_GuidSerialized": "b2d0099f-e605-49f5-9959-e7cacae37aa3" + }, + "m_Name": "Bevel Type", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_21a7a380e66d42e780e2a2a1baa630d5", + "m_OverrideReferenceName": "_BevelType", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e", + "m_Guid": { + "m_GuidSerialized": "cd167d3a-7465-4d5a-86fc-0f22dc0ef908" + }, + "m_Name": "Outline Color 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_5550EB71", + "m_OverrideReferenceName": "_OutlineColor1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "232b1aa09e67479abae141d3c76d3c5b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "256d41e89a204d22951450de1c38051d", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "26e48352a08441bfa694dcea54c06e36", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "281bcee4777040f8a31ee0e10344e98d", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "285f6a9863d54ed2a8150727ad749456", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4145.0, + "y": -2406.0, + "width": 154.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "b42e6dbfbc864097af182cbff5c0c1fb" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.IsFrontFaceNode", + "m_ObjectId": "2a552a0b828f457c911aa19561e410ae", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Is Front Face", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4282.0, + "y": -3681.3330078125, + "width": 121.99999237060547, + "height": 77.33348846435547 + } + }, + "m_Slots": [ + { + "m_Id": "2ef1d888dc9d49e59d6a6950897ddc93" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "2ac79705aa9e415dbb74ec215233fd1b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Composite (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3277.3330078125, + "y": -3841.33349609375, + "width": 218.666748046875, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "a75f7ac601c446469802fe7754c1f279" + }, + { + "m_Id": "8c38a5d8327f456e9783740c05382619" + }, + { + "m_Id": "facc84930f544fd7a0205a6176b18ac0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Composite", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2b01ea3023e34c94af1754e4dcea8f2e", + "m_Id": 0, + "m_DisplayName": "Face Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2bf5f2fdd2984599b7323d10cfb1d240", + "m_Id": 1, + "m_DisplayName": "Filter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Filter", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "2c10b97b92c947ceb307a93759c0228b", + "m_Guid": { + "m_GuidSerialized": "6be0b8ff-a766-4c6b-a6e4-3a72758ac95f" + }, + "m_Name": "Bevel Amount", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B01DD93E", + "m_OverrideReferenceName": "_BevelAmount", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "2c7a9460724b47daad8df1be144de7c6", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "2d0a269511e34bd1ba9056d2c939dff2", + "m_Guid": { + "m_GuidSerialized": "edbe73dc-53ab-4bc1-9d64-ab36e0e05f03" + }, + "m_Name": "_FaceUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_3A8E0F13", + "m_OverrideReferenceName": "_FaceUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "2db15d90c2204143b225ec4ef08d0755", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4350.0, + "y": -2396.0, + "width": 163.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "def8e0b9d8384982bc5b4c32d877e458" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "2e4eb1ef08bb44178c82e53872485e0f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "2ef1d888dc9d49e59d6a6950897ddc93", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 2, + "m_Value": true, + "m_DefaultValue": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "30ca940fe2794c949f2a1d4d2caaa446", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "319916a5921343f7b7eef0e50dc93def", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4760.0, + "y": -3245.000244140625, + "width": 184.0, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "d219977210094c0082c517d8dc00c8bb" + }, + { + "m_Id": "f48f04ad45d046a8b88e71731ed506e7" + }, + { + "m_Id": "e6e80c6b0db545cda26b079a9a78fbb3" + }, + { + "m_Id": "c6bdb985bc16435fa72f5a3c81bb633c" + }, + { + "m_Id": "d1a17e42e7a04dc38984e3c01149445b" + }, + { + "m_Id": "fb15d0ba56d54a6192f11e107aeb5fa8" + }, + { + "m_Id": "c35312edaa2344788b1964ee2f63a236" + }, + { + "m_Id": "c88fcbaeea954a5f9c68c339fa8b604d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "34a67e0fef884f9399e674d9eeaf720c", + "m_Id": 6, + "m_DisplayName": "Color3", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color3", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "34a72a5ebb04402384a4fd3748111a37", + "m_Id": 0, + "m_DisplayName": "Alpha Clip Threshold", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AlphaClipThreshold", + "m_StageCapability": 2, + "m_Value": 0.0010000000474974514, + "m_DefaultValue": 0.5, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3535ae87c6dd4769b52b20d9eca61069", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "35cbea6373dd4e4f8d0fea36e8add392", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "36a0c473c4c04c3a930dd38f3920d410", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "36f1b4d96f2941c39e5cd95d9c1d2ce6", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6314.6669921875, + "y": -3285.3330078125, + "width": 144.6669921875, + "height": 129.33348083496095 + } + }, + "m_Slots": [ + { + "m_Id": "65b3dc13b2b6484283ffe5abfe87a06a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "373f1de8db6c429c9d46c781f741d7a4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3802c81c3be24823aa1d7c9997a33c29", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "3915c1927ffe49f8967304321cfbe497", + "m_Id": 4, + "m_DisplayName": "Atlas", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Atlas", + "m_StageCapability": 3, + "m_BareResource": true, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "39a382d661e2484da71f04c43f48e55f", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "39f2f84f30304d859fb07569e2695f60", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3554.000244140625, + "y": -3462.0, + "width": 116.00000762939453, + "height": 94.00000762939453 + } + }, + "m_Slots": [ + { + "m_Id": "4b2d9ea03bf64fa19dcae1511d2581da" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3c50439118b2496f9e390021b0964606", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.AlphaClipThreshold", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3028.0, + "y": -3054.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "34a72a5ebb04402384a4fd3748111a37" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.AlphaClipThreshold" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "3d04f5ba6e7b40d281f22eb424145acd", + "m_Id": 0, + "m_DisplayName": "Face Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3db1608e927e4102a3c3a88e9fcab39a", + "m_Id": 3, + "m_DisplayName": "Transform", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Transform", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3dccd64e7f324bc1a75c1479d7a67c51", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "3e231021af7b47ba97f2871e7f25d0fe", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2934.000244140625, + "y": -3466.0, + "width": 141.33349609375, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "6ccaced3889e4503a9414d808ec33981" + }, + { + "m_Id": "7f3d71a6c96847c099da45f95aafbecb" + }, + { + "m_Id": "d8edec16956c4f15b7d51d6ec10753f4" + }, + { + "m_Id": "39a382d661e2484da71f04c43f48e55f" + }, + { + "m_Id": "8764669016f6442f8152593c18a649d7" + }, + { + "m_Id": "26e48352a08441bfa694dcea54c06e36" + }, + { + "m_Id": "3e94a0d106064bdb864c960512ef4026" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3e25be96bb3747738c238cf3a741d5df", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "3e372195f4bd4845852a37839e5b602d", + "m_Guid": { + "m_GuidSerialized": "60abd046-2a1a-48cd-a0af-2f702f7f53ab" + }, + "m_Name": "_MainTex", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_90CBF488", + "m_OverrideReferenceName": "_MainTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":28684132378477856,\"guid\":\"8f586378b4e144a9851e7b34d9b748ee\",\"type\":2}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "3e94a0d106064bdb864c960512ef4026", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "3ec4797e381747829ef4712c85fcf7a1", + "m_Guid": { + "m_GuidSerialized": "020d65cc-50a8-4b8a-a624-90d7b489f549" + }, + "m_Name": "Specular Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_3ec4797e381747829ef4712c85fcf7a1", + "m_OverrideReferenceName": "_SpecularPower", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 4.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "3fdf4b7bc5d4426492dcc057603ef4a6", + "m_Guid": { + "m_GuidSerialized": "675d2567-3fca-4da6-9462-dfa4924950f1" + }, + "m_Name": "_OutlineUVSpeed", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_D66D89E6", + "m_OverrideReferenceName": "_OutlineUVSpeed", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "400d0b6c95dd4540ad3da3e8cb7e50b2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "41986ac6400d46709d0ef043a67f6b34", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "41b9b79b3859472882bcea393703eec0", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "424dbeeb009344efa29c304c4979e3d6", + "m_Guid": { + "m_GuidSerialized": "314c37de-c6f2-4463-866d-8588f6fc119e" + }, + "m_Name": "Diffuse Shadow", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_424dbeeb009344efa29c304c4979e3d6", + "m_OverrideReferenceName": "_Diffuse", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.30000001192092898, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "42a586e4f6ec40eeaba891b7fd133864", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4934.0, + "y": -4442.99951171875, + "width": 133.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "da7a06d393a44089842070d51d2aa0a6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "42cadae0923e4969b50bbc3f78185934", + "m_Title": "Face + 3 Outlines + Underlay", + "m_Position": { + "x": -5437.0, + "y": -3558.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4328cdbf78b94c038fd614c59bfe1cac", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "44317f2e371447e2a8d894f8a021a235", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Layer1 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4004.999755859375, + "y": -4173.0, + "width": 191.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "10a99c07aad742349d258db16838c129" + }, + { + "m_Id": "b85d677872b44421bf5536f42ba0267c" + }, + { + "m_Id": "75aba700d74d4b2687bf3166cf1da3e2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer1", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "44806230fa384c1e95f9c5918a14f056", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4488af8ff6a7421298a7e827f567263b", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4109.0, + "width": 158.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "66f69ef16eac4eb48357bde804cf3c39" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "4648b46ad29a4008a80de4f8a5a5b813", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4576.0, + "y": -2437.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "b2baf44eae52473cb6cda7b1debece01" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "46fbf3eeb0ea4470869cba7443249295", + "m_Guid": { + "m_GuidSerialized": "be87c5a3-e361-4b95-89c8-911c39a51c0d" + }, + "m_Name": "Outline Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_A0B54237", + "m_OverrideReferenceName": "_OutlineTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "47d020251e9841a5b1f0fd64396026a1", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "48390d02257d41bf98eace1deaa4c539", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "8036d0e6090b456e9b4ea87227868236" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "484b51c50485473b819c4f05087b32d7", + "m_Title": "Underlay", + "m_Position": { + "x": -5253.0, + "y": -4542.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4907352322c644ebacdf2ca30f2994fd", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "49dabfd48a78475882e664526b483ce1", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "49e7c3ad55ce458797f0e60c950cb965", + "m_Guid": { + "m_GuidSerialized": "31b55db9-0da1-4ec4-af2b-d83747ed5bc4" + }, + "m_Name": "Underlay Offset", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_CE9DEDB3", + "m_OverrideReferenceName": "_UnderlayOffset", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "4a0041116f73406db7a62ae80ff54ef4", + "m_Guid": { + "m_GuidSerialized": "a2d96028-f92f-4076-8376-42249ca40935" + }, + "m_Name": "_ScaleRatioA", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "_ScaleRatioA", + "m_DefaultReferenceName": "_ScaleRatioA", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4a66dcbe712a4d40bd8f355b834594b5", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "4abff6ff92fa4a05b203f10580988335", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4293.3330078125, + "y": -3497.99951171875, + "width": 140.66648864746095, + "height": 166.0 + } + }, + "m_Slots": [ + { + "m_Id": "b015d1b7e4134c59baf6851e7649802c" + }, + { + "m_Id": "d9dc4839ee2847999110bdb234d6041a" + }, + { + "m_Id": "91d6a9a5fbc04ea49075cb51835e7264" + }, + { + "m_Id": "f42ad06b3c6a45d3ab33de904c063412" + }, + { + "m_Id": "ed6c215a65584deeaefad1d2c7743044" + }, + { + "m_Id": "edbee7a8952b46529ac5ad0365775774" + }, + { + "m_Id": "70337a74f6ad4b7bb6befc825219bab1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4b2d9ea03bf64fa19dcae1511d2581da", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4bda5c294e1949138d033640e1d385b4", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "4c28ee9109014fa086e5de7a3993341d", + "m_Id": 0, + "m_DisplayName": "Softness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4c334de01ecd429baa7652fc6002536b", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4d1cb1a475df49f9a148195a65f5453a", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4d9ce48719d143748f9f8e22da6f9ddc", + "m_Id": 5, + "m_DisplayName": "TextureWidth", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureWidth", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4e64dac49ddc47c3b5b1e27b17a08304", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "4e90ca54c0cc46a18ea600be7c80413a", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "4eb3c00a1ca44e10be833b7ca61ff059", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "4f194ff591484e908fc2bcdacbcf2570", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4255.0, + "y": -2771.0, + "width": 134.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "2b01ea3023e34c94af1754e4dcea8f2e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "509e6f38505b4b0695b263706a55028f", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "51378bae98a94c309785d14cd5cbb453", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "GetSurfaceNormal (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4067.333251953125, + "y": -3881.99951171875, + "width": 263.9999694824219, + "height": 189.99998474121095 + } + }, + "m_Slots": [ + { + "m_Id": "5b0077c23eae443887872f84227deccc" + }, + { + "m_Id": "3915c1927ffe49f8967304321cfbe497" + }, + { + "m_Id": "4d9ce48719d143748f9f8e22da6f9ddc" + }, + { + "m_Id": "ebd6d75abcb84108bcadbfe7ee5f6244" + }, + { + "m_Id": "ef9738ec7e894772a14e9dce441c16c6" + }, + { + "m_Id": "9eeec1a9713045af8845cea263d5ea48" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GetSurfaceNormal", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "51f76f8a53ad43a4ad028426548ce9ba", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "52798bdb86f6400e86489a7a368e9f8b", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6460.6669921875, + "y": -3113.333251953125, + "width": 135.33349609375, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "1df58cfa4dad4c449d01ee1c5ea05f2e" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "53073e5ea924459fa6681a4943e9f947", + "m_Guid": { + "m_GuidSerialized": "5fdac24e-2d58-4471-80ce-79c3ab9a2564" + }, + "m_Name": "Outline Color 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_DBAB5AEC", + "m_OverrideReferenceName": "_OutlineColor2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.009433984756469727, + "g": 0.02534518577158451, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "54d7a93ffec5490aa4591da23a21b693", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "55ffa45ec3654d5e88089fb40d2b0465", + "m_Id": 4, + "m_DisplayName": "AnimSpeed", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "AnimSpeed", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "56c25395796e4d2fbe5c892d428d1620", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5071.99951171875, + "y": -3427.0, + "width": 129.99998474121095, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "9eb8137a6c2e41bbafdc8b0732dd47a3" + }, + { + "m_Id": "36a0c473c4c04c3a930dd38f3920d410" + }, + { + "m_Id": "068ae649e00b40e198ec5a30ad741fab" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "57abc172afd449e2a4d567f93432507b", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "582d6e289dbe4fdca7cf0307273eaa2f", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "59bd90a849624124bae6464ee3669aa6", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3972.0, + "y": -2385.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "2e4eb1ef08bb44178c82e53872485e0f" + }, + { + "m_Id": "8695190a5e614f2d90081871a8a06fc2" + }, + { + "m_Id": "81bdb47901ef48e5a588c6724b1b0142" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "59cea37675824d99995b370f09cef20a", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "5b0077c23eae443887872f84227deccc", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5b3ff4ee364f4d7a923b530ad60d8762", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5bd258837c514ff7ab0bf7027e762c18", + "m_Guid": { + "m_GuidSerialized": "2d8f3ee9-1307-4b58-a60d-526e86b07109" + }, + "m_Name": "Bevel Roundness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_AB6A015F", + "m_OverrideReferenceName": "_BevelRoundness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5da82bf481f8489ebd05e997f617f51b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": 4.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "5e42524569844befad16fda5a94eb9cb", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "5fbe253f3e444f2aa8ac717f9c856619", + "m_Guid": { + "m_GuidSerialized": "0a61c93f-6430-4aa6-af07-79bc3b411ccd" + }, + "m_Name": "Bevel Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_B50BBFCC", + "m_OverrideReferenceName": "_BevelWidth", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 0.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61133d79a89048c195f54939b2a1d30a", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "61a6ac5f29344d109411f26850ab0a96", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6271438664e74b3fbf723bd6a1f50f8b", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "62bc551cea604e88b7858cc37d96a98a", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "636180f6e0504f2baaa5cc086980cb47", + "m_Guid": { + "m_GuidSerialized": "c1223e37-093d-4d5a-b2b0-cd9cc3e4f88e" + }, + "m_Name": "Outline Offset 1", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector2_636180f6e0504f2baaa5cc086980cb47", + "m_OverrideReferenceName": "_OutlineOffset1", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "63c7cd57fc3c45a9a97b514fdae32693", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5235.99951171875, + "y": -3386.999755859375, + "width": 141.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "c422a9a9ff824176aad2241f58c44d0b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "641eda269d7b4da9acb65f8d50035ea9", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "65b3dc13b2b6484283ffe5abfe87a06a", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "65c8e64a7535466e933eed08a2f77532", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4759.99951171875, + "y": -3498.666259765625, + "width": 186.0, + "height": 251.33323669433595 + } + }, + "m_Slots": [ + { + "m_Id": "256d41e89a204d22951450de1c38051d" + }, + { + "m_Id": "0a67ca5280214bd794dc0ad66b5710a9" + }, + { + "m_Id": "ebbd94a7102a4457a48ac492de3bff14" + }, + { + "m_Id": "6271438664e74b3fbf723bd6a1f50f8b" + }, + { + "m_Id": "c9b722d107ce4cd6a748c883472b9b0f" + }, + { + "m_Id": "74cf69e61bef44589521f1bf2bf3c59a" + }, + { + "m_Id": "6e532f83d1c44e839bcfc5845d3b01d6" + }, + { + "m_Id": "cb5e9f9567e84f8fa5463efc0e256e19" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "66f69ef16eac4eb48357bde804cf3c39", + "m_Id": 0, + "m_DisplayName": "_UnderlayColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "67a519f507384ff1861df5d8d5b486be", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4278.0, + "y": -3939.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "c3e6d7c20c184bf39fd8822130e693e7" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "68ec7c31365549d6a8ce883edfc02de2", + "m_Id": 4, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6a7af6143e114a538663e71f56731a21", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "6b2f65c1463f4f7bad16c54a95d2fe75", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5070.0, + "y": -3301.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "1d35fa1fb5004f96a65ace54fbe4f1ad" + }, + { + "m_Id": "fa6de3be9f5b4411b5081b49e645f424" + }, + { + "m_Id": "400d0b6c95dd4540ad3da3e8cb7e50b2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6ccaced3889e4503a9414d808ec33981", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6dfc1177dd0541a7a780fbf911ad1956", + "m_Id": 0, + "m_DisplayName": "_OutlineTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6e13f3cd573c467a94379f45d96cb690", + "m_Id": 2, + "m_DisplayName": "SSR", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "6e532f83d1c44e839bcfc5845d3b01d6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "6e8946a245e842b38231d4a241bfb3ef", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3026.0, + "y": -3110.0, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "ef0b93f78372439696f50711eaf57d90" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6fbdcc5a972b4fa883dc5f21e525a376", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "70337a74f6ad4b7bb6befc825219bab1", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "712da461f71a454db59d349f752d41ee", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "71dd947935b64ce38f0d25406dde447b", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "724e17584e97443e9e285dfa7253c8e3", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 0.15000000596046449, + "m_DefaultValue": 1.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "72fb5a0d7796446b9e2b929cb32facdc", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "7444469eb9884253819add9ef96baa25", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4298.0, + "y": -3809.99951171875, + "width": 144.66648864746095, + "height": 129.33323669433595 + } + }, + "m_Slots": [ + { + "m_Id": "03182b3263304258b265266325c21f65" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "748c31bbcecc4b30bec2e42c0612175b", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "74b41464cbed4e9e8e23af5ab9be40cf", + "m_Guid": { + "m_GuidSerialized": "41afbdcb-f3ae-4340-8973-1c1998c992a2" + }, + "m_Name": "Outline Offset 2", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset2", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "74cf69e61bef44589521f1bf2bf3c59a", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "757174b6f25040fdbb20355a21752222", + "m_Id": 0, + "m_DisplayName": "Outline Offset 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "75aba700d74d4b2687bf3166cf1da3e2", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "75c5657544c648058b20cea090f48dbf", + "m_Id": 0, + "m_DisplayName": "_OutlineUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "767769f736d5478cba5f10a415e28e7f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "773b90134e894e429203c0c83e80b9de", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "77e28f3e930b4c249145630ec961af95", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "79147f6986644769b58d9ed64fe771e1", + "m_Id": 0, + "m_DisplayName": "OutlineMode", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7984fd094e1147bdabb4e26fbd3d31c8", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3244.000244140625, + "y": -3414.0, + "width": 130.0, + "height": 118.00000762939453 + } + }, + "m_Slots": [ + { + "m_Id": "082e9706dffc4c188270980d4e44ce0f" + }, + { + "m_Id": "f2a351a5375c441b8d9ab7e2c9545a77" + }, + { + "m_Id": "41986ac6400d46709d0ef043a67f6b34" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "7a046f410ce64aa88438b0bfd412c045", + "m_Guid": { + "m_GuidSerialized": "d47271f5-5a84-47bf-a09e-c825d2aeb013" + }, + "m_Name": "Outline Color 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_551702C5", + "m_OverrideReferenceName": "_OutlineColor3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "7a0f504e4175406dbd8134250f4e350b", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7a80e8839f0e4a1d9a6c0814f8793ee6", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4931.0, + "y": -3452.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "6fbdcc5a972b4fa883dc5f21e525a376" + }, + { + "m_Id": "0ba4932e164847878ddb7b7bcff96985" + }, + { + "m_Id": "9178663316db43d582f1c4a127d307c6" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7acfafd73b8c4dfab8c55c18a887e087", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7b8a19bd115e4167a25b59cb3218a817", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "7c27ccb2c2dc4ca59c5438c3358630ca", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "7d7696aa6d184b4fb9c316a9dec37aee", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4928.0, + "y": -3326.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "4d1cb1a475df49f9a148195a65f5453a" + }, + { + "m_Id": "47d020251e9841a5b1f0fd64396026a1" + }, + { + "m_Id": "62bc551cea604e88b7858cc37d96a98a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "7d78a616c2754cc28d1f32cf66ade611", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3973.0, + "y": -2796.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "d9bcb754db834583b6518c5ed5152114" + }, + { + "m_Id": "861d4258049a4a3e8164f7297090f88e" + }, + { + "m_Id": "a7c06457d7454693a8bc3dc95257b2c2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "7e0fadb2533f496192c1ad3e78642010", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4188.0, + "width": 173.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d48c3871e3064027a10ae9f4babd3be0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "7f2e6b5f15364ed9835d67d0cf4f8f65", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2586.0, + "y": -3592.0, + "width": 200.0, + "height": 41.0 + } + }, + "m_Slots": [ + { + "m_Id": "85ff8667d72947edada4e9fb4ff60559" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7f3d71a6c96847c099da45f95aafbecb", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "8036d0e6090b456e9b4ea87227868236", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "80e665a5eeb64730a51742f698bf0d48", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "8135ca333f8f4ea78163743e6ec1f55c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4050.666259765625, + "y": -3139.99951171875, + "width": 121.99999237060547, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "d6a6a119394e4082a11bc024a6e42ef8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "81bdb47901ef48e5a588c6724b1b0142", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "81e8ed0534534674a74263e6161a2a1a", + "m_Guid": { + "m_GuidSerialized": "78aab961-c4a8-41f3-b203-1239c3b33b13" + }, + "m_Name": "Underlay Dilate", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_D48690B9", + "m_OverrideReferenceName": "_UnderlayDilate", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "82af2db1018543d7832af96c1cfc981f", + "m_Guid": { + "m_GuidSerialized": "37906c7b-9a3a-454b-a62a-9aa097e64bde" + }, + "m_Name": "Light Angle", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_82af2db1018543d7832af96c1cfc981f", + "m_OverrideReferenceName": "_LightAngle", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 6.28000020980835 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "82d5443fe54d4a3b9420f8745d00a632", + "m_Id": 5, + "m_DisplayName": "Softness", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Softness", + "m_StageCapability": 3, + "m_Value": 8.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "849275cac05e4ca8bd0b38ab7ae43bf8", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "84dc74cdbd8c45e1b189e4fd9a69942d", + "m_Id": 0, + "m_DisplayName": "Outline Offset 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "85a1ad8e741e41759002e8cdc8cd0b96", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "ScreenSpaceRatio (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6112.0, + "y": -3308.0, + "width": 258.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "6e13f3cd573c467a94379f45d96cb690" + }, + { + "m_Id": "8e6ed600f6504f4083092f5b511e44c4" + }, + { + "m_Id": "93b161cce4504cb79c97b6d8db178de7" + }, + { + "m_Id": "2bf5f2fdd2984599b7323d10cfb1d240" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ScreenSpaceRatio", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "85b5940eb77e4625812ded7215bab8d7", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4050.666259765625, + "y": -3095.99951171875, + "width": 121.99999237060547, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "ada023d617104472b8ab75a81558c0a1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "85ff8667d72947edada4e9fb4ff60559", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "861d4258049a4a3e8164f7297090f88e", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "867a4ae13c0d4a028c71bc1063824c14", + "m_Guid": { + "m_GuidSerialized": "d483c212-0a30-4f6d-b94d-9abbc83a6522" + }, + "m_Name": "Outline Width", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_C68C9E14", + "m_OverrideReferenceName": "_IsoPerimeter", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 2, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "8695190a5e614f2d90081871a8a06fc2", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8764669016f6442f8152593c18a649d7", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "880bb02c6c6b49b18aa6ebc66dc566a0", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "88253223d2c34ecfab92b0c344048f94", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "ComputeSDF (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4226.0, + "y": -4323.0, + "width": 227.99998474121095, + "height": 190.0 + } + }, + "m_Slots": [ + { + "m_Id": "c52a1744a9a14989b0ae452ad6de6061" + }, + { + "m_Id": "a03db80c558b4f87a330c5ae0a9443a5" + }, + { + "m_Id": "8f1b1d1e8ff24b3284993e52354e54fa" + }, + { + "m_Id": "5da82bf481f8489ebd05e997f617f51b" + }, + { + "m_Id": "82d5443fe54d4a3b9420f8745d00a632" + }, + { + "m_Id": "61133d79a89048c195f54939b2a1d30a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8902cb30b1684db8b996562e0140cb18", + "m_Id": 0, + "m_DisplayName": "UV_1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV_1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8a08179f99d649d289b8053d5fa0ad22", + "m_Id": 0, + "m_DisplayName": "Underlay Offset", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8a5d204e1abd4f6894607d1a497f6e69", + "m_Id": 3, + "m_DisplayName": "Texel Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8b66f4e6bc9d4662b3218ac33a69839f", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "8c38a5d8327f456e9783740c05382619", + "m_Id": 3, + "m_DisplayName": "Color2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color2", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8cbd81814903479ea1d3151c1f38183e", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "8cf8aae64c1d443f9303126886b40f17", + "m_Guid": { + "m_GuidSerialized": "8d78c9a5-aaef-41fb-af68-2358e401d7ac" + }, + "m_Name": "_UnderlayColor", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_2F5FE804", + "m_OverrideReferenceName": "_UnderlayColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "8e6ed600f6504f4083092f5b511e44c4", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector2ShaderProperty", + "m_ObjectId": "8ed907a2cc7949b68a283ae243ea1977", + "m_Guid": { + "m_GuidSerialized": "36803443-a9bc-4f3c-a4f2-7d66a5417ac1" + }, + "m_Name": "Outline Offset 3", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "", + "m_OverrideReferenceName": "_OutlineOffset3", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8f1b1d1e8ff24b3284993e52354e54fa", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9147636b0cfa466a9b37a013d8f693bf", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5567.0, + "y": -3862.000244140625, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a4f471e3221c4134b291bd9d2ba22db6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9178663316db43d582f1c4a127d307c6", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "91890fe48ebe4717aea61ecaf3ad4861", + "m_Group": { + "m_Id": "ecf16c34d46f4502ac601f0c38c7576b" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3114.000244140625, + "y": -3414.0, + "width": 120.00000762939453, + "height": 149.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "3dccd64e7f324bc1a75c1479d7a67c51" + }, + { + "m_Id": "e444f2c81d1e48329fa2c91005277e8d" + }, + { + "m_Id": "b2c26292b7434733878a9b042f44de89" + }, + { + "m_Id": "964fea1fd4b24f4daf5bef84c4b45118" + }, + { + "m_Id": "deac82280a2b43078e0e40863e2d974c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "91d6a9a5fbc04ea49075cb51835e7264", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "928621a3ca2d41c89a10336bbbc81ddc", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "93b161cce4504cb79c97b6d8db178de7", + "m_Id": 3, + "m_DisplayName": "TextureSize", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureSize", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "94300469581b4924ac7dda496811d45d", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "0eeb5490760e492f8c9691086fa00929" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 1, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 0, + "m_RenderFace": 0, + "m_AlphaClip": true, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_AdditionalMotionVectorMode": 0, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "TMPro.EditorUtilities.TMP_SDFShaderGUI", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "945b45993dd84a979755b98c48138f72", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "952d0fa5cd744df0b434cd38e9a90b93", + "m_Guid": { + "m_GuidSerialized": "ce395871-ddeb-47c3-a31d-07855800c197" + }, + "m_Name": "_UnderlaySoftness", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_F2B9E3EF", + "m_OverrideReferenceName": "_UnderlaySoftness", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "95928bcb6a284b8d88105a84c2e1d3ce", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4744.0, + "y": -2591.0, + "width": 155.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "d880558893fb442b9320cf55885d1117" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "964fea1fd4b24f4daf5bef84c4b45118", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "98934a69591249d5b8b92b39045359a3", + "m_Title": "Outline1 Texture", + "m_Position": { + "x": -4746.0, + "y": -2497.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "998db5e5901e45b29040eb2099370071", + "m_Guid": { + "m_GuidSerialized": "6f383614-f2ad-4269-be8f-87b0ecb03cf0" + }, + "m_Name": "Bevel Clamp", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_5BD7E808", + "m_OverrideReferenceName": "_BevelClamp", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 0.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "9c228fac287d446296b91a4acf5cec59", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4569.0, + "y": -3498.000244140625, + "width": 184.0, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "582d6e289dbe4fdca7cf0307273eaa2f" + }, + { + "m_Id": "1db37082bf844442804487b4944352de" + }, + { + "m_Id": "8b66f4e6bc9d4662b3218ac33a69839f" + }, + { + "m_Id": "4a66dcbe712a4d40bd8f355b834594b5" + }, + { + "m_Id": "a0285c9c381a49cba194709efa0a7c85" + }, + { + "m_Id": "b2728d0dd3ce40678867c94a7d977916" + }, + { + "m_Id": "e141833aa78b4fd59ecad949beb43a78" + }, + { + "m_Id": "51f76f8a53ad43a4ad028426548ce9ba" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "9c26fdddba244d36a854298c00473247", + "m_Id": 3, + "m_DisplayName": "SDR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SDR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "9d3c3383d5934a17bf9efbb7fd9e9043", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5412.0, + "y": -3315.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "232b1aa09e67479abae141d3c76d3c5b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e6e50a71d9843b49b62ebe1cf7d3d59", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4486.0, + "y": -3865.99951171875, + "width": 135.3330078125, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "3535ae87c6dd4769b52b20d9eca61069" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "9e87ce9607e14015a3790c528ca5dfda", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4598.0, + "y": -2251.0, + "width": 167.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "75c5657544c648058b20cea090f48dbf" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "9eb8137a6c2e41bbafdc8b0732dd47a3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", + "m_ObjectId": "9eeec1a9713045af8845cea263d5ea48", + "m_Id": 6, + "m_DisplayName": "IsFront", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "IsFront", + "m_StageCapability": 3, + "m_Value": false, + "m_DefaultValue": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "9f0de188085746d5a19073da1de85ddb", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4118.0, + "y": -2771.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "7c27ccb2c2dc4ca59c5438c3358630ca" + }, + { + "m_Id": "373f1de8db6c429c9d46c781f741d7a4" + }, + { + "m_Id": "fd0b096ed5b74f9e9ec51327be200731" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a0285c9c381a49cba194709efa0a7c85", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a03db80c558b4f87a330c5ae0a9443a5", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a161b772c7564eee804e3d58f6cb9944", + "m_Id": 4, + "m_DisplayName": "Texel Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Texel Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "a3f8b6e8ae7f48e2989a029904401502", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "a455bd79094c4413a7b7dd80ca8b9368", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4573.0, + "y": -2689.0, + "width": 222.0, + "height": 142.0 + } + }, + "m_Slots": [ + { + "m_Id": "4e90ca54c0cc46a18ea600be7c80413a" + }, + { + "m_Id": "2c7a9460724b47daad8df1be144de7c6" + }, + { + "m_Id": "55ffa45ec3654d5e88089fb40d2b0465" + }, + { + "m_Id": "e495a9f7a11f4eb89334e83be154ceb9" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateShaderProperty", + "m_ObjectId": "a4ad98d8828c424384229c344ebe2ed0", + "m_Guid": { + "m_GuidSerialized": "f98fc1a2-bb81-4bd1-a207-23d3a90d518e" + }, + "m_Name": "SamplerState", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "SamplerState_a4ad98d8828c424384229c344ebe2ed0", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": false, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_filter": 0, + "m_wrap": 1, + "m_anisotropic": 0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a4f471e3221c4134b291bd9d2ba22db6", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "a535f3bcbeb14622bb177eb6f46e76f4", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4608.0, + "y": -2293.0, + "width": 177.00001525878907, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "6dfc1177dd0541a7a780fbf911ad1956" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "a6bbb32e8d884be9bb36db91fe4b81b1", + "m_Guid": { + "m_GuidSerialized": "6aa76edf-7b80-46ac-add4-406cf1d85493" + }, + "m_Name": "_GradientScale", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_EAE27356", + "m_OverrideReferenceName": "_GradientScale", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 1, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 10.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "a6c38edd2e8743a9b057ba8452b9f129", + "m_Guid": { + "m_GuidSerialized": "9fc942ee-4a1d-4ced-a5a6-81893e3ddb63" + }, + "m_Name": "Light Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_a6c38edd2e8743a9b057ba8452b9f129", + "m_OverrideReferenceName": "_SpecularColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "a75f7ac601c446469802fe7754c1f279", + "m_Id": 0, + "m_DisplayName": "Color1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a7942746b5564dc7bbbae1deb2403022", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "a7c06457d7454693a8bc3dc95257b2c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "aa2794b8f0e24bf281d22e0fef0647be", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "aa3e347d733e48f7b65d8a8847370eec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "EvaluateLight (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3633.000244140625, + "y": -3805.000244140625, + "width": 179.00001525878907, + "height": 118.00000762939453 + } + }, + "m_Slots": [ + { + "m_Id": "0699eea947fc426cbfeb8744cf120222" + }, + { + "m_Id": "0c4dc51f26484c26ad88a3fe4002abcd" + }, + { + "m_Id": "d5173cc3c6cd4f1998550f3187a3e9c8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "EvaluateLight", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aa87c72ac0e64469acc34f936f00b3d0", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4225.0, + "width": 193.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "0d7878dd226d4cfb81a991dc312309fc" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "abd59150589b436cadf8c9e6f43ccb8e", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "aca823a8188948c782eddaf0f45e1868", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalOS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -2542.0, + "y": -3404.000244140625, + "width": 200.0, + "height": 40.66650390625 + } + }, + "m_Slots": [ + { + "m_Id": "e386b183a18245a796b024022f7f3074" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalOS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "acd0cd5a177f4a97bf23db7219305e3f", + "m_Group": { + "m_Id": "d258902c6ec74942afdb9ebf8c1d07f8" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4348.0, + "y": -3905.99951171875, + "width": 185.33299255371095, + "height": 101.33324432373047 + } + }, + "m_Slots": [ + { + "m_Id": "945b45993dd84a979755b98c48138f72" + }, + { + "m_Id": "e51a636b2621440eb94cc802c1cf4bfc" + }, + { + "m_Id": "1bdde3efd3b7464b8934c555be0f8a48" + }, + { + "m_Id": "8a5d204e1abd4f6894607d1a497f6e69" + }, + { + "m_Id": "a161b772c7564eee804e3d58f6cb9944" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ada023d617104472b8ab75a81558c0a1", + "m_Id": 0, + "m_DisplayName": "Outline Color 3", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "aef5c44f84e04c3185e0b93e95e34204", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5233.99951171875, + "y": -3141.999755859375, + "width": 143.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "84dc74cdbd8c45e1b189e4fd9a69942d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b000f852aa984e9dae25b125a4607f4e", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b015d1b7e4134c59baf6851e7649802c", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "b0b352c4503a43d083a64e57352b29a0", + "m_Guid": { + "m_GuidSerialized": "01cfcc78-60aa-4f71-a1e3-8d8df6dae253" + }, + "m_Name": "Reflectivity Power", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_b0b352c4503a43d083a64e57352b29a0", + "m_OverrideReferenceName": "_Reflectivity", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 5.0, + "m_FloatType": 1, + "m_RangeValues": { + "x": 5.0, + "y": 15.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.VertexColorNode", + "m_ObjectId": "b1188549725543d485436c2e921ffbb2", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Vertex Color", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4108.0, + "y": -2890.0, + "width": 116.0, + "height": 94.0 + } + }, + "m_Slots": [ + { + "m_Id": "281bcee4777040f8a31ee0e10344e98d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "b163c9f1666644b0bba62cf0e12df7bc", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4333.0, + "y": -2713.0, + "width": 180.0, + "height": 180.0 + } + }, + "m_Slots": [ + { + "m_Id": "cce40479b6284b6fa3174db9f09d0ac9" + }, + { + "m_Id": "80e665a5eeb64730a51742f698bf0d48" + }, + { + "m_Id": "1f46181633594ae0a1fb2adb76b42981" + }, + { + "m_Id": "8cbd81814903479ea1d3151c1f38183e" + }, + { + "m_Id": "cfaf3f3a5a1146e194cddad30c95aada" + }, + { + "m_Id": "b43489e37a5c4df88f15844292a55ec7" + }, + { + "m_Id": "cd7281fb41aa4e61ac0fdf71d4f4bd46" + }, + { + "m_Id": "f01d52cdcb1647aab35782b4af535efd" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 1, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b224a1cf80604103ad085c799995f3c2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b2728d0dd3ce40678867c94a7d977916", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b2baf44eae52473cb6cda7b1debece01", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b2c26292b7434733878a9b042f44de89", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b42e6dbfbc864097af182cbff5c0c1fb", + "m_Id": 0, + "m_DisplayName": "Outline Color 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "b43489e37a5c4df88f15844292a55ec7", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"fileID\":-2362172177983852347,\"guid\":\"dda5bcb0d1e9515498f6e4e038bbefe6\",\"type\":2}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "b4a40cb6acd441acb83cfe0240bf910d", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4750.99951171875, + "y": -4274.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "d0b10e52e21941b183f5f635894c76c8" + }, + { + "m_Id": "0d6a57754b824f6db9cefa6953bc06a9" + }, + { + "m_Id": "773b90134e894e429203c0c83e80b9de" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "b571db753a1948d5a6f1de4e7d0c7238", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5727.0, + "y": -3827.000244140625, + "width": 184.0, + "height": 101.0 + } + }, + "m_Slots": [ + { + "m_Id": "5b3ff4ee364f4d7a923b530ad60d8762" + }, + { + "m_Id": "c183b5bd9bbe45089f93996e73110918" + }, + { + "m_Id": "1196ae398cc348349ab0c1a23fdab4bd" + }, + { + "m_Id": "1d7d96a5770b4f8ebb162bdbde020bca" + }, + { + "m_Id": "49dabfd48a78475882e664526b483ce1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b691728a389a417d9b4f2d02541209c2", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "b7f9ac55517141868bfb9d2ad6429792", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "b85d677872b44421bf5536f42ba0267c", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "bafc3d388c1e444e820897b9a3d6029a", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "dc75c4e3a1bc4bb0a128086c2b0679a5" + }, + { + "m_Id": "867a4ae13c0d4a028c71bc1063824c14" + }, + { + "m_Id": "22b7f3c2bb7b48c0a7fdeb50e33e7d5e" + }, + { + "m_Id": "53073e5ea924459fa6681a4943e9f947" + }, + { + "m_Id": "7a046f410ce64aa88438b0bfd412c045" + }, + { + "m_Id": "636180f6e0504f2baaa5cc086980cb47" + }, + { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + }, + { + "m_Id": "8ed907a2cc7949b68a283ae243ea1977" + }, + { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + }, + { + "m_Id": "0580d4b7e3a049049569f4508643a724" + }, + { + "m_Id": "c9ec735d1a1046769e5601b2c97c849a" + }, + { + "m_Id": "2d0a269511e34bd1ba9056d2c939dff2" + }, + { + "m_Id": "07946387933e416db576b677f0711e5f" + }, + { + "m_Id": "46fbf3eeb0ea4470869cba7443249295" + }, + { + "m_Id": "ec79eb447dfd47a9b3380344c6a60f43" + }, + { + "m_Id": "3fdf4b7bc5d4426492dcc057603ef4a6" + }, + { + "m_Id": "8cf8aae64c1d443f9303126886b40f17" + }, + { + "m_Id": "49e7c3ad55ce458797f0e60c950cb965" + }, + { + "m_Id": "81e8ed0534534674a74263e6161a2a1a" + }, + { + "m_Id": "952d0fa5cd744df0b434cd38e9a90b93" + }, + { + "m_Id": "21a7a380e66d42e780e2a2a1baa630d5" + }, + { + "m_Id": "2c10b97b92c947ceb307a93759c0228b" + }, + { + "m_Id": "1be90d4f96a841748b0c95219b12ad27" + }, + { + "m_Id": "5fbe253f3e444f2aa8ac717f9c856619" + }, + { + "m_Id": "5bd258837c514ff7ab0bf7027e762c18" + }, + { + "m_Id": "998db5e5901e45b29040eb2099370071" + }, + { + "m_Id": "a6c38edd2e8743a9b057ba8452b9f129" + }, + { + "m_Id": "82af2db1018543d7832af96c1cfc981f" + }, + { + "m_Id": "3ec4797e381747829ef4712c85fcf7a1" + }, + { + "m_Id": "b0b352c4503a43d083a64e57352b29a0" + }, + { + "m_Id": "424dbeeb009344efa29c304c4979e3d6" + }, + { + "m_Id": "05805bc6fcc941fd889922555c6c86d7" + }, + { + "m_Id": "a4ad98d8828c424384229c344ebe2ed0" + }, + { + "m_Id": "3e372195f4bd4845852a37839e5b602d" + }, + { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + }, + { + "m_Id": "4a0041116f73406db7a62ae80ff54ef4" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "bc9afcb18afa4ccc82d2cdc34d3f4641", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -5537.0, + "y": -3827.000244140625, + "width": 126.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "5e42524569844befad16fda5a94eb9cb" + }, + { + "m_Id": "54d7a93ffec5490aa4591da23a21b693" + }, + { + "m_Id": "aa2794b8f0e24bf281d22e0fef0647be" + }, + { + "m_Id": "200245fc8bbe4826b209ab5f7ffe074c" + }, + { + "m_Id": "fc2e62201c5847e798fd939314413fcd" + }, + { + "m_Id": "fe11fa80cc1847a5a37f6757d521cf25" + }, + { + "m_Id": "de0c6f7f7af94defa6c3dbc6433de9d4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c183b5bd9bbe45089f93996e73110918", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "c234e5216678436195ee1a5914bc79da", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "GenerateUV (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4409.0, + "y": -2338.0, + "width": 222.0, + "height": 142.00001525878907 + } + }, + "m_Slots": [ + { + "m_Id": "8902cb30b1684db8b996562e0140cb18" + }, + { + "m_Id": "3db1608e927e4102a3c3a88e9fcab39a" + }, + { + "m_Id": "0f7ffb6d2de4447f9736780cbcee8e07" + }, + { + "m_Id": "d4954b7bbbb0412cbc997bcbe7dfa808" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "GenerateUV", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "c35312edaa2344788b1964ee2f63a236", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "c3e6d7c20c184bf39fd8822130e693e7", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "c422a9a9ff824176aad2241f58c44d0b", + "m_Id": 0, + "m_DisplayName": "Outline Offset 1", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "c478c32c45884c57a62f7b2aa8ddc3b0", + "m_Id": 2, + "m_DisplayName": "Alpha", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c52a1744a9a14989b0ae452ad6de6061", + "m_Id": 0, + "m_DisplayName": "SSR", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SSR", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c6bdb985bc16435fa72f5a3c81bb633c", + "m_Id": 6, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c7d4094601ac4bc1aead609c72b1f1c1", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c7ddee91dc5b48dc828309c77fdb0b88", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4444.0, + "y": -4266.0, + "width": 153.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a7942746b5564dc7bbbae1deb2403022" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "c88fcbaeea954a5f9c68c339fa8b604d", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c9b722d107ce4cd6a748c883472b9b0f", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "c9d7f0dbae7d422985a1cc87c025e76b", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4284.0, + "y": -3165.0, + "width": 144.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "79147f6986644769b58d9ed64fe771e1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "cb3c0c3f08654b068bea44c4ffb15f4a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", + "m_ObjectId": "c9ec735d1a1046769e5601b2c97c849a", + "m_Guid": { + "m_GuidSerialized": "281a9526-c332-4471-a44e-ece4a1e95ef6" + }, + "m_Name": "Face Texture", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Texture2D_75569DEA", + "m_OverrideReferenceName": "_FaceTex", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "isMainTexture": false, + "useTilingAndOffset": false, + "m_Modifiable": true, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ca2a1083dc014f39ab8af0cdf140866b", + "m_Id": 0, + "m_DisplayName": "_FaceTex_ST", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Internal.BooleanShaderProperty", + "m_ObjectId": "cb3c0c3f08654b068bea44c4ffb15f4a", + "m_Guid": { + "m_GuidSerialized": "21009d12-8d94-4273-b0d0-a8ee0608ddcf" + }, + "m_Name": "OutlineMode", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Boolean_cb3c0c3f08654b068bea44c4ffb15f4a", + "m_OverrideReferenceName": "_OutlineMode", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cb5e9f9567e84f8fa5463efc0e256e19", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "cb7117ecb1d047a8b2cb00ed552cb181", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3032.66650390625, + "y": -3029.33349609375, + "width": 200.0, + "height": 41.33349609375 + } + }, + "m_Slots": [ + { + "m_Id": "724e17584e97443e9e285dfa7253c8e3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cc88101667c9488f9c5a716e851c1b21", + "m_Id": 3, + "m_DisplayName": "Color0", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color0", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "cce40479b6284b6fa3174db9f09d0ac9", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "cd7281fb41aa4e61ac0fdf71d4f4bd46", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "cda5e3b4c1054bf3a65c0b7ec6bc778a", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "cdddee3a537c464697357f11b966f9b8", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4420.0, + "y": -4483.0, + "width": 156.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "41b9b79b3859472882bcea393703eec0" + }, + { + "m_Id": "c7d4094601ac4bc1aead609c72b1f1c1" + }, + { + "m_Id": "767769f736d5478cba5f10a415e28e7f" + }, + { + "m_Id": "b691728a389a417d9b4f2d02541209c2" + }, + { + "m_Id": "045c4f6b050549c7a0efb208e6349779" + }, + { + "m_Id": "509e6f38505b4b0695b263706a55028f" + }, + { + "m_Id": "204dacb5a95b424facf11cb6f65bd188" + }, + { + "m_Id": "35cbea6373dd4e4f8d0fea36e8add392" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "cfaf3f3a5a1146e194cddad30c95aada", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d0a791a544614667962a9a9a9ce0c68a", + "m_Title": "Screen Space Ratio", + "m_Position": { + "x": -6485.591796875, + "y": -3365.3779296875 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d0b10e52e21941b183f5f635894c76c8", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d1a17e42e7a04dc38984e3c01149445b", + "m_Id": 7, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d219977210094c0082c517d8dc00c8bb", + "m_Id": 0, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "d258902c6ec74942afdb9ebf8c1d07f8", + "m_Title": "Generate Normal", + "m_Position": { + "x": -4511.33349609375, + "y": -3999.3330078125 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "d30452ac6b244ecca03df4d7b4de9f81", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d48c3871e3064027a10ae9f4babd3be0", + "m_Id": 0, + "m_DisplayName": "_UnderlaySoftness", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d4954b7bbbb0412cbc997bcbe7dfa808", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "d4df208fc23b42f2b52364124f1b661c", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5236.99951171875, + "y": -3260.999755859375, + "width": 143.99998474121095, + "height": 33.999996185302737 + } + }, + "m_Slots": [ + { + "m_Id": "757174b6f25040fdbb20355a21752222" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "74b41464cbed4e9e8e23af5ab9be40cf" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "d5173cc3c6cd4f1998550f3187a3e9c8", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "d6a6a119394e4082a11bc024a6e42ef8", + "m_Id": 0, + "m_DisplayName": "Outline Color 2", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "d880558893fb442b9320cf55885d1117", + "m_Id": 0, + "m_DisplayName": "_FaceUVSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d8edec16956c4f15b7d51d6ec10753f4", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d9bcb754db834583b6518c5ed5152114", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d9dc4839ee2847999110bdb234d6041a", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "da7a06d393a44089842070d51d2aa0a6", + "m_Id": 0, + "m_DisplayName": "_MainTex", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "daaf032a109749a88c9b8ff8e1f8b541", + "m_Title": "Offset Scale", + "m_Position": { + "x": -5893.0, + "y": -3921.000244140625 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "dbcb748279484a4590e53518c49122b8", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4744.0, + "y": -2762.0, + "width": 145.0, + "height": 130.0 + } + }, + "m_Slots": [ + { + "m_Id": "7a0f504e4175406dbd8134250f4e350b" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 1 +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "dc75c4e3a1bc4bb0a128086c2b0679a5", + "m_Guid": { + "m_GuidSerialized": "85cd941f-2fd2-43a3-b0fa-9f728bfb4220" + }, + "m_Name": "Face Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_99AFBB3D", + "m_OverrideReferenceName": "_FaceColor", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "de0c6f7f7af94defa6c3dbc6433de9d4", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "deac82280a2b43078e0e40863e2d974c", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DMaterialSlot", + "m_ObjectId": "def8e0b9d8384982bc5b4c32d877e458", + "m_Id": 0, + "m_DisplayName": "Outline Texture", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "dff7a66b353a4023b29c9d937da77960", + "m_Group": { + "m_Id": "484b51c50485473b819c4f05087b32d7" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4602.0, + "y": -4298.0, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "7b8a19bd115e4167a25b59cb3218a817" + }, + { + "m_Id": "0b57f2d35157477ab2b29a5aac14ae8b" + }, + { + "m_Id": "e9e06fcb161e44ba8cc9f6f60264df78" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "e141833aa78b4fd59ecad949beb43a78", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e2d28f29bbac4983a401574480b5ca28", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "e386b183a18245a796b024022f7f3074", + "m_Id": 0, + "m_DisplayName": "Normal (Object Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalOS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e444f2c81d1e48329fa2c91005277e8d", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "e495a9f7a11f4eb89334e83be154ceb9", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e51a636b2621440eb94cc802c1cf4bfc", + "m_Id": 2, + "m_DisplayName": "Height", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Height", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "e6e80c6b0db545cda26b079a9a78fbb3", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "e818605f8f5a4f01bf61caaa33693581", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "ComputeSDF44 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4113.0, + "y": -3368.999755859375, + "width": 243.99998474121095, + "height": 214.0 + } + }, + "m_Slots": [ + { + "m_Id": "641eda269d7b4da9acb65f8d50035ea9" + }, + { + "m_Id": "f6823778a3cf42d5bbe8a83e5f9c9fa3" + }, + { + "m_Id": "9c26fdddba244d36a854298c00473247" + }, + { + "m_Id": "f684c5678e9e4f078157a3ab7ef5057b" + }, + { + "m_Id": "14ad19bf20a140dd88d58452d7df688b" + }, + { + "m_Id": "215a82c127204988b751de7d3a39b955" + }, + { + "m_Id": "c478c32c45884c57a62f7b2aa8ddc3b0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "ComputeSDF44", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e9e06fcb161e44ba8cc9f6f60264df78", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebbd94a7102a4457a48ac492de3bff14", + "m_Id": 5, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ebd6d75abcb84108bcadbfe7ee5f6244", + "m_Id": 7, + "m_DisplayName": "TextureHeight", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "TextureHeight", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "ec184d6d9fb2494897774c9e7d279e6d", + "m_Group": { + "m_Id": "013228b0fdf1424097798f0973a9a4fb" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4754.0, + "y": -2625.0, + "width": 145.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ca2a1083dc014f39ab8af0cdf140866b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "07946387933e416db576b677f0711e5f" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "ec1f2e8bc9fd4ae38b133c60ee6c49b8", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4927.0, + "y": -3204.0, + "width": 130.0, + "height": 117.99999237060547 + } + }, + "m_Slots": [ + { + "m_Id": "748c31bbcecc4b30bec2e42c0612175b" + }, + { + "m_Id": "4bda5c294e1949138d033640e1d385b4" + }, + { + "m_Id": "4e64dac49ddc47c3b5b1e27b17a08304" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector4ShaderProperty", + "m_ObjectId": "ec79eb447dfd47a9b3380344c6a60f43", + "m_Guid": { + "m_GuidSerialized": "54c77f8b-0534-4b35-a3f0-83ab2ebe6c1f" + }, + "m_Name": "_OutlineTex_ST", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector4_1774DE83", + "m_OverrideReferenceName": "_OutlineTex_ST", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "ecf16c34d46f4502ac601f0c38c7576b", + "m_Title": "Vertex Color", + "m_Position": { + "x": -3614.000244140625, + "y": -3549.000244140625 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ed1d1f1613334c3bb904dd08161cd7e5", + "m_Id": 0, + "m_DisplayName": "_GradientScale", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "ed6c215a65584deeaefad1d2c7743044", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "edbee7a8952b46529ac5ad0365775774", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "ef0b93f78372439696f50711eaf57d90", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.7353569269180298, + "y": 0.7353569269180298, + "z": 0.7353569269180298 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [ + "X", + "Y", + "Z" + ], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "ef9738ec7e894772a14e9dce441c16c6", + "m_Id": 2, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [ + "X", + "Y" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", + "m_ObjectId": "f01d52cdcb1647aab35782b4af535efd", + "m_Id": 3, + "m_DisplayName": "Sampler", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Sampler", + "m_StageCapability": 3, + "m_BareResource": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "f23a8b2b7c85478388ff7a8c8a6de740", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Layer4 (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -3819.0, + "y": -3286.0, + "width": 193.0, + "height": 190.0 + } + }, + "m_Slots": [ + { + "m_Id": "0fac35636fca4474a6afaefc3c757775" + }, + { + "m_Id": "cc88101667c9488f9c5a716e851c1b21" + }, + { + "m_Id": "68ec7c31365549d6a8ce883edfc02de2" + }, + { + "m_Id": "02559cbe5ad441a3904ccb75ded2b2c5" + }, + { + "m_Id": "34a67e0fef884f9399e674d9eeaf720c" + }, + { + "m_Id": "3802c81c3be24823aa1d7c9997a33c29" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "Layer4", + "m_FunctionSource": "96de908384869cd409c75efa351d5edf", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f2903158b3624759bca1fcd843698078", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f2a351a5375c441b8d9ab7e2c9545a77", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DPropertiesNode", + "m_ObjectId": "f383b24f0bc6434dafe44b3e3d338a63", + "m_Group": { + "m_Id": "d0a791a544614667962a9a9a9ce0c68a" + }, + "m_Name": "Texel Size", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -6318.6669921875, + "y": -3153.3330078125, + "width": 185.33348083496095, + "height": 101.33348846435547 + } + }, + "m_Slots": [ + { + "m_Id": "fb5e1e2a67c14602808358686bb75091" + }, + { + "m_Id": "712da461f71a454db59d349f752d41ee" + }, + { + "m_Id": "b000f852aa984e9dae25b125a4607f4e" + }, + { + "m_Id": "849275cac05e4ca8bd0b38ab7ae43bf8" + }, + { + "m_Id": "59cea37675824d99995b370f09cef20a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "f3d31c1f18d8491a8ecf5cbc37e4b7db", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4291.33349609375, + "y": -3246.0, + "width": 154.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "ed1d1f1613334c3bb904dd08161cd7e5" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a6bbb32e8d884be9bb36db91fe4b81b1" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f42ad06b3c6a45d3ab33de904c063412", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f48f04ad45d046a8b88e71731ed506e7", + "m_Id": 4, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "f4ecc442a2d246759f7c2c0412953d28", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "a3f8b6e8ae7f48e2989a029904401502" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f6823778a3cf42d5bbe8a83e5f9c9fa3", + "m_Id": 1, + "m_DisplayName": "SD", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "SD", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f684c5678e9e4f078157a3ab7ef5057b", + "m_Id": 4, + "m_DisplayName": "Isoperimeter", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Isoperimeter", + "m_StageCapability": 3, + "m_Value": { + "x": 3.0, + "y": 2.0, + "z": 1.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "f814deb543c24fbbafbcdb5071d96022", + "m_Group": { + "m_Id": "42cadae0923e4969b50bbc3f78185934" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -4569.0, + "y": -3245.000244140625, + "width": 184.0, + "height": 253.0 + } + }, + "m_Slots": [ + { + "m_Id": "abd59150589b436cadf8c9e6f43ccb8e" + }, + { + "m_Id": "7acfafd73b8c4dfab8c55c18a887e087" + }, + { + "m_Id": "928621a3ca2d41c89a10336bbbc81ddc" + }, + { + "m_Id": "b7f9ac55517141868bfb9d2ad6429792" + }, + { + "m_Id": "09b1b86c1c074337a4c439d3a308dd2e" + }, + { + "m_Id": "1f247658c7ba45fb93c41f51e21acb0d" + }, + { + "m_Id": "d30452ac6b244ecca03df4d7b4de9f81" + }, + { + "m_Id": "215b30ae27784ec3a13360a9029af283" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "f864c900600e427ba7793f00c715e971", + "m_Id": 0, + "m_DisplayName": "Outline Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fa6de3be9f5b4411b5081b49e645f424", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DivideNode", + "m_ObjectId": "faace8101df943d8956faa31728cb004", + "m_Group": { + "m_Id": "daaf032a109749a88c9b8ff8e1f8b541" + }, + "m_Name": "Divide", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -5400.0, + "y": -3851.000244140625, + "width": 130.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "77e28f3e930b4c249145630ec961af95" + }, + { + "m_Id": "f2903158b3624759bca1fcd843698078" + }, + { + "m_Id": "30ca940fe2794c949f2a1d4d2caaa446" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "facc84930f544fd7a0205a6176b18ac0", + "m_Id": 2, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", + "m_ObjectId": "fb15d0ba56d54a6192f11e107aeb5fa8", + "m_Id": 1, + "m_DisplayName": "Texture", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Texture", + "m_StageCapability": 3, + "m_BareResource": false, + "m_Texture": { + "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "m_DefaultType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fb5e1e2a67c14602808358686bb75091", + "m_Id": 0, + "m_DisplayName": "Width", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Width", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [ + "X" + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "fc2e62201c5847e798fd939314413fcd", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fd0b096ed5b74f9e9ec51327be200731", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode", + "m_ObjectId": "fdb77c3e92ee497b88ca5dc46dc45350", + "m_Group": { + "m_Id": "98934a69591249d5b8b92b39045359a3" + }, + "m_Name": "Sample Texture 2D", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -4171.0, + "y": -2362.0, + "width": 180.0, + "height": 181.0 + } + }, + "m_Slots": [ + { + "m_Id": "4328cdbf78b94c038fd614c59bfe1cac" + }, + { + "m_Id": "04dfcc9ff13a4bf282ed46faec39d15c" + }, + { + "m_Id": "71dd947935b64ce38f0d25406dde447b" + }, + { + "m_Id": "61a6ac5f29344d109411f26850ab0a96" + }, + { + "m_Id": "44806230fa384c1e95f9c5918a14f056" + }, + { + "m_Id": "4eb3c00a1ca44e10be833b7ca61ff059" + }, + { + "m_Id": "57abc172afd449e2a4d567f93432507b" + }, + { + "m_Id": "cda5e3b4c1054bf3a65c0b7ec6bc778a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_TextureType": 0, + "m_NormalMapSpace": 0, + "m_EnableGlobalMipBias": true, + "m_MipSamplingMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "fe11fa80cc1847a5a37f6757d521cf25", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph.meta b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph.meta new file mode 100644 index 00000000..248825ca --- /dev/null +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 124c112a6e8f1a54e8b0870e881b56d8 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF.shader index 011ee199..bbcfd119 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_SDF.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_SDF.shader @@ -4,10 +4,10 @@ Properties { _FaceTex ("Face Texture", 2D) = "white" {} _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0 _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0 - [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1) + _FaceColor ("Face Color", Color) = (1,1,1,1) _FaceDilate ("Face Dilate", Range(-1,1)) = 0 - [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1) + _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineTex ("Outline Texture", 2D) = "white" {} _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0 _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0 @@ -21,7 +21,7 @@ Properties { _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0 _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416 - [HDR]_SpecularColor ("Specular", Color) = (1,1,1,1) + _SpecularColor ("Specular", Color) = (1,1,1,1) _SpecularPower ("Specular", Range(0,4)) = 2.0 _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10 _Diffuse ("Diffuse", Range(0,1)) = 0.5 @@ -37,13 +37,13 @@ Properties { _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0) - [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) + _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5) _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0 _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0 _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0 _UnderlaySoftness ("Border Softness", Range(0,1)) = 0 - [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5) + _GlowColor ("Color", Color) = (0, 1, 0, 0.5) _GlowOffset ("Offset", Range(-1,1)) = 0 _GlowInner ("Inner", Range(0,1)) = 0.05 _GlowOuter ("Outer", Range(0,1)) = 0.05 @@ -127,17 +127,18 @@ SubShader { #include "TMPro_Properties.cginc" #include "TMPro.cginc" - struct vertex_t { + struct vertex_t + { UNITY_VERTEX_INPUT_INSTANCE_ID float4 position : POSITION; float3 normal : NORMAL; fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; - - struct pixel_t { + struct pixel_t + { UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO float4 position : SV_POSITION; @@ -147,16 +148,20 @@ SubShader { float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw) float3 viewDir : TEXCOORD3; - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float4 texcoord2 : TEXCOORD4; // u,v, scale, bias fixed4 underlayColor : COLOR1; - #endif - float4 textures : TEXCOORD5; + #endif + + float4 textures : TEXCOORD5; }; // Used by Unity internally to handle Texture Tiling and Offset. float4 _FaceTex_ST; float4 _OutlineTex_ST; + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; pixel_t VertShader(vertex_t input) { @@ -167,7 +172,7 @@ SubShader { UNITY_TRANSFER_INSTANCE_ID(input,output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.position; vert.x += _VertexOffsetX; @@ -178,7 +183,7 @@ SubShader { float2 pixelSize = vPosition.w; pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); float scale = rsqrt(dot(pixelSize, pixelSize)); - scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1); if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert))))); float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0; @@ -188,13 +193,13 @@ SubShader { float alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _OutlineSoftness * _ScaleRatioA); - #if GLOW_ON + #if GLOW_ON alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB); - #endif + #endif alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight; - #if (UNDERLAY_ON || UNDERLAY_INNER) + #if (UNDERLAY_ON || UNDERLAY_INNER) float4 underlayColor = _UnderlayColor; underlayColor.rgb *= underlayColor.a; @@ -205,23 +210,28 @@ SubShader { float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth; float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight; float2 bOffset = float2(x, y); - #endif + #endif // Generate UV for the Masking Texture float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy); // Support for texture tiling and offset - float2 textureUV = UnpackUV(input.texcoord1.x); + float2 textureUV = input.texcoord1; float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex); float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex); + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + input.color.rgb = UIGammaToLinear(input.color.rgb); + } output.position = vPosition; output.color = input.color; output.atlas = input.texcoord0; output.param = float4(alphaClip, scale, bias, weight); - output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); + const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz); #if (UNDERLAY_ON || UNDERLAY_INNER) output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias); @@ -239,9 +249,9 @@ SubShader { float c = tex2D(_MainTex, input.atlas).a; - #ifndef UNDERLAY_ON + #ifndef UNDERLAY_ON clip(c - input.param.x); - #endif + #endif float scale = input.param.y; float bias = input.param.z; @@ -261,7 +271,7 @@ SubShader { faceColor = GetColor(sd, faceColor, outlineColor, outline, softness); - #if BEVEL_ON + #if BEVEL_ON float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0); float3 n = GetSurfaceNormal(input.atlas, weight, dxy); @@ -278,36 +288,35 @@ SubShader { fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n)); faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a; - #endif + #endif - #if UNDERLAY_ON + #if UNDERLAY_ON float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a); - #endif + #endif - #if UNDERLAY_INNER + #if UNDERLAY_INNER float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z; faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a); - #endif + #endif - #if GLOW_ON + #if GLOW_ON float4 glowColor = GetGlowColor(sd, scale); faceColor.rgb += glowColor.rgb * glowColor.a; - #endif + #endif // Alternative implementation to UnityGet2DClipping with support for softness. - #if UNITY_UI_CLIP_RECT + #if UNITY_UI_CLIP_RECT half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw); faceColor *= m.x * m.y; - #endif + #endif - #if UNITY_UI_ALPHACLIP + #if UNITY_UI_ALPHACLIP clip(faceColor.a - 0.001); - #endif + #endif - return faceColor * input.color.a; + return faceColor * input.color.a; } - ENDCG } } diff --git a/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader b/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader index e8283a78..4012a081 100644 --- a/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader +++ b/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader @@ -2,18 +2,18 @@ Shader "TextMeshPro/Sprite" { Properties { - [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} - _Color ("Tint", Color) = (1,1,1,1) - - _StencilComp ("Stencil Comparison", Float) = 8 - _Stencil ("Stencil ID", Float) = 0 - _StencilOp ("Stencil Operation", Float) = 0 - _StencilWriteMask ("Stencil Write Mask", Float) = 255 - _StencilReadMask ("Stencil Read Mask", Float) = 255 - - _CullMode ("Cull Mode", Float) = 0 - _ColorMask ("Color Mask", Float) = 15 - _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) + _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _CullMode ("Cull Mode", Float) = 0 + _ColorMask ("Color Mask", Float) = 15 + _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 } @@ -21,19 +21,19 @@ Shader "TextMeshPro/Sprite" SubShader { Tags - { - "Queue"="Transparent" - "IgnoreProjector"="True" - "RenderType"="Transparent" + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } - + Stencil { Ref [_Stencil] Comp [_StencilComp] - Pass [_StencilOp] + Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } @@ -58,7 +58,7 @@ Shader "TextMeshPro/Sprite" #pragma multi_compile __ UNITY_UI_CLIP_RECT #pragma multi_compile __ UNITY_UI_ALPHACLIP - + struct appdata_t { float4 vertex : POSITION; @@ -69,29 +69,43 @@ Shader "TextMeshPro/Sprite" struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - float4 worldPosition : TEXCOORD1; + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 worldPosition : TEXCOORD1; + float4 mask : TEXCOORD2; UNITY_VERTEX_OUTPUT_STEREO }; - + sampler2D _MainTex; fixed4 _Color; fixed4 _TextureSampleAdd; float4 _ClipRect; float4 _MainTex_ST; + float _UIMaskSoftnessX; + float _UIMaskSoftnessY; + int _UIVertexColorAlwaysGammaSpace; v2f vert(appdata_t v) { v2f OUT; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); - OUT.worldPosition = v.vertex; - OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); + float4 vPosition = UnityObjectToClipPos(v.vertex); + OUT.worldPosition = v.vertex; + OUT.vertex = vPosition; + + float2 pixelSize = vPosition.w; + pixelSize /= abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy)); + float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); - + OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy))); + + if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) + { + v.color.rgb = UIGammaToLinear(v.color.rgb); + } OUT.color = v.color * _Color; return OUT; } @@ -99,9 +113,10 @@ Shader "TextMeshPro/Sprite" fixed4 frag(v2f IN) : SV_Target { half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; - - #ifdef UNITY_UI_CLIP_RECT - color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + + #if UNITY_UI_CLIP_RECT + half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); + color *= m.x * m.y; #endif #ifdef UNITY_UI_ALPHACLIP @@ -110,7 +125,7 @@ Shader "TextMeshPro/Sprite" return color; } - ENDCG + ENDCG } } } diff --git a/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta b/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta index 0d6eb56c..f21163e2 100644 --- a/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta +++ b/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta @@ -4,6 +4,6 @@ ShaderImporter: externalObjects: {} defaultTextures: [] nonModifiableTextures: [] - userData: + userData: Version 2.0 assetBundleName: assetBundleVariant: diff --git a/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc b/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc index 5969fec1..d145a773 100644 --- a/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc +++ b/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc @@ -1,20 +1,22 @@ -struct vertex_t { +struct vertex_t +{ UNITY_VERTEX_INPUT_INSTANCE_ID float4 position : POSITION; float3 normal : NORMAL; float4 color : COLOR; - float2 texcoord0 : TEXCOORD0; + float4 texcoord0 : TEXCOORD0; float2 texcoord1 : TEXCOORD1; }; -struct pixel_t { +struct pixel_t +{ UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO float4 position : SV_POSITION; float4 faceColor : COLOR; float4 outlineColor : COLOR1; float4 texcoord0 : TEXCOORD0; - float4 param : TEXCOORD1; // weight, scaleRatio + float4 param : TEXCOORD1; // x = weight, y = no longer used float2 mask : TEXCOORD2; #if (UNDERLAY_ON || UNDERLAY_INNER) float4 texcoord2 : TEXCOORD3; @@ -22,10 +24,14 @@ struct pixel_t { #endif }; -float4 SRGBToLinear(float4 rgba) { +float4 SRGBToLinear(float4 rgba) +{ return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a); } +float _UIMaskSoftnessX; +float _UIMaskSoftnessY; + pixel_t VertShader(vertex_t input) { pixel_t output; @@ -35,7 +41,7 @@ pixel_t VertShader(vertex_t input) UNITY_TRANSFER_INSTANCE_ID(input, output); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - float bold = step(input.texcoord1.y, 0); + float bold = step(input.texcoord0.w, 0); float4 vert = input.position; vert.x += _VertexOffsetX; @@ -71,7 +77,7 @@ pixel_t VertShader(vertex_t input) output.faceColor = faceColor; output.outlineColor = outlineColor; output.texcoord0 = float4(input.texcoord0.xy, maskUV.xy); - output.param = float4(0.5 - weight, 1.3333 * _GradientScale * (_Sharpness + 1) / _TextureWidth, _OutlineWidth * _ScaleRatioA * 0.5, 0); + output.param = float4(0.5 - weight, 0, _OutlineWidth * _ScaleRatioA * 0.5, 0); float2 mask = float2(0, 0); #if UNITY_UI_CLIP_RECT @@ -99,8 +105,9 @@ float4 PixShader(pixel_t input) : SV_Target float d = tex2D(_MainTex, input.texcoord0.xy).a; - float2 UV = input.texcoord0.xy; - float scale = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y))) * input.param.y; + float pixelSize = abs(ddx(input.texcoord0.y)) + abs(ddy(input.texcoord0.y)); + pixelSize *= _TextureHeight * 0.75; + float scale = 1 / pixelSize * _GradientScale * (_Sharpness + 1); #if (UNDERLAY_ON | UNDERLAY_INNER) float layerScale = scale; @@ -112,7 +119,7 @@ float4 PixShader(pixel_t input) : SV_Target float4 faceColor = input.faceColor * saturate((d - input.param.x) * scale + 0.5); - #ifdef OUTLINE_ON + #if OUTLINE_ON float4 outlineColor = lerp(input.faceColor, input.outlineColor, sqrt(min(1.0, input.param.z * scale * 2))); faceColor = lerp(outlineColor, input.faceColor, saturate((d - input.param.x - input.param.z) * scale + 0.5)); faceColor *= saturate((d - input.param.x + input.param.z) * scale + 0.5); @@ -130,7 +137,7 @@ float4 PixShader(pixel_t input) : SV_Target faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd * (1 - faceColor.a); #endif - #ifdef MASKING + #if MASKING float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a); float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl; a = saturate(t / _MaskEdgeSoftness); @@ -140,7 +147,8 @@ float4 PixShader(pixel_t input) : SV_Target // Alternative implementation to UnityGet2DClipping with support for softness #if UNITY_UI_CLIP_RECT - float2 maskZW = 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + (1 / scale)); + half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); + float2 maskZW = 0.25 / (0.25 * maskSoftness + 1 / scale); float2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW); faceColor *= m.x * m.y; #endif diff --git a/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc b/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc index 2e962588..b806b4f9 100644 --- a/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc +++ b/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc @@ -66,11 +66,6 @@ uniform float _MaskID; uniform sampler2D _MaskTex; uniform float4 _MaskCoord; uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w) -//uniform float _MaskWipeControl; -//uniform float _MaskEdgeSoftness; -//uniform fixed4 _MaskEdgeColor; -//uniform bool _MaskInverse; - uniform float _MaskSoftnessX; uniform float _MaskSoftnessY; diff --git a/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc b/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc index 622ae875..2153a9a7 100644 --- a/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc +++ b/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc @@ -5,7 +5,7 @@ void VertShader(inout appdata_full v, out Input data) UNITY_INITIALIZE_OUTPUT(Input, data); - float bold = step(v.texcoord1.y, 0); + float bold = step(v.texcoord.w, 0); // Generate normal for backface float3 view = ObjSpaceViewDir(v.vertex); @@ -20,14 +20,12 @@ void VertShader(inout appdata_full v, out Input data) pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy); float scale = rsqrt(dot(pixelSize, pixelSize)); - scale *= abs(v.texcoord1.y) * _GradientScale * (_Sharpness + 1); + scale *= abs(v.texcoord.w) * _GradientScale * (_Sharpness + 1); scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert))))); data.param.y = scale; #endif - data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; // - - v.texcoord1.xy = UnpackUV(v.texcoord1.x); + data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; // data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex)); } @@ -82,7 +80,7 @@ void PixShader(Input input, inout SurfaceOutput o) float3 n = float3(0, 0, -1); float3 emission = float3(0, 0, 0); #endif - + #if GLOW_ON float4 glowColor = GetGlowColor(sd, scale); glowColor.a *= input.color.a; diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..2506d41b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,47 @@ +# Code of Conduct + +## Our Pledge + +We, as contributors and maintainers of My Scene Manager, pledge to make participation in our project and community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socioeconomic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +We are committed to fostering an open, welcoming, and inclusive community. + +## Our Standards + +Examples of behavior that contribute to a positive environment include: + +- Being respectful and inclusive of differing viewpoints and experiences. +- Giving and gracefully accepting constructive feedback. +- Using welcoming and inclusive language. +- Focusing on what is best for the community. +- Showing empathy towards other community members. + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, or unwelcome sexual attention or advances. +- Trolling, insulting or derogatory comments, and personal or political attacks. +- Public or private harassment. +- Publishing others’ private information without explicit permission. +- Other conduct which could reasonably be considered inappropriate in a professional setting. + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned with this Code of Conduct, or to ban temporarily or permanently any contributor for behaviors they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, including GitHub issues, pull requests, discussions, and any other communication channels used by the project. It also applies to public spaces when an individual is representing the project or its community. + +Examples of representing the project include using an official project email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainers via GitHub issues or direct contact. All complaints will be reviewed and investigated promptly and fairly. + +Project maintainers are obligated to maintain the confidentiality of the reporter of an incident. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..2c4da0ff --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,75 @@ +# Contribution Guide + +Thank you for considering contributing to My Scene Manager! Whether you're fixing a bug, adding a feature, or improving the documentation, your contributions are greatly appreciated and help make the tool better for everyone. + +## How to Contribute + +There are several ways you can contribute to My Scene Manager: + +### 1. Reporting Issues + +If you encounter any bugs or have feedback on features, please report them by opening an issue. When reporting an issue, please provide as much detail as possible, including: + +- Steps to reproduce the bug (if applicable) +- What behavior you expected and what actually happened +- Any relevant error messages or logs + +### 2. Submitting Code Changes + +If you'd like to submit code to fix an issue or add a feature, please follow these steps: + +#### Fork the Repository + +- Navigate to the repository on GitHub. +- Click the Fork button in the upper-right corner to create a copy of the repository under your GitHub account. + +#### Clone Your Fork + +Clone your forked repository to your local machine: + +```bash +git clone https://github.com/mygamedevtools/scene-loader.git +``` + +#### Create a New Branch + +Create a new branch for your feature or bug fix: + +```bash +git checkout -b feature-name-or-bugfix +``` + +#### Make Your Changes + +Make your changes to the code or documentation. When working on code: + +- Follow the existing coding style and conventions. +- Make sure to write unit tests for new features or bug fixes if applicable. + +For documentation changes, the documentation resides in the `docs` branch of the repository. You can switch to this branch if you're only updating the docs or contributing to new documentation. + +#### Create a Pull Request + +Open a pull request from your fork to the main repository. In the PR description, provide a clear explanation of what you've done, the issue it addresses, and any relevant details. + +- For code changes, the PR should be made against the main branch. +- For documentation changes, the PR should be made against the `docs` branch. + +This allows us to keep the documentation and code contributions in their respective branches. +Documentation changes can be submitted in the same way as code changes, by creating a PR from your fork. + +### 3. Improving Documentation + +We welcome any improvements to the documentation as well. If you spot a typo or think something could be explained better, feel free to submit a pull request with the suggested changes! + +### 4. Feature Requests + +If you have an idea for a new feature, open an issue and describe the feature in detail. Be sure to explain why you think it would be valuable for other users. If you plan to implement the feature yourself, let us know in the issue before you start so we can discuss the approach. + +## Code of Conduct + +By contributing to this project, you agree to adhere to our [Code of Conduct](./CODE_OF_CONDUCT.md). Please treat everyone with respect and kindness. + +## License + +By submitting a pull request, you agree that your contributions will be licensed under the same license as the rest of the project ([MIT License](./LICENSE)). \ No newline at end of file diff --git a/LICENSE b/LICENSE index 33cbcce8..ad781d94 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Joao Borks +Copyright (c) 2022 MyGameDevTools Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Packages/com.mygamedevtools.scene-loader/LICENSE.txt b/Packages/com.mygamedevtools.scene-loader/LICENSE.txt new file mode 100644 index 00000000..ad781d94 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 MyGameDevTools + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/LICENSE.txt.meta b/Packages/com.mygamedevtools.scene-loader/LICENSE.txt.meta new file mode 100644 index 00000000..538bae99 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/LICENSE.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1a9c44f367cac8a4892345e7d7405ed7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/AdvancedSceneManager.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/CoreSceneManager.cs similarity index 50% rename from Packages/com.mygamedevtools.scene-loader/Runtime/AdvancedSceneManager.cs rename to Packages/com.mygamedevtools.scene-loader/Runtime/CoreSceneManager.cs index 4dab3e5b..636e15d9 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/AdvancedSceneManager.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/CoreSceneManager.cs @@ -1,11 +1,6 @@ -#if ENABLE_UNITASK && !OVERRIDE_DISABLE_UNITASK -#define USE_UNITASK -#endif -#if USE_UNITASK -using Cysharp.Threading.Tasks; -#endif using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using UnityEngine; @@ -14,9 +9,9 @@ namespace MyGameDevTools.SceneLoading { /// - /// The is capable of managing both addressable and non-addressable scene operations. + /// The is capable of managing both addressable and non-addressable scene operations. /// - public class AdvancedSceneManager : ISceneManager + public class CoreSceneManager : ISceneManager { public event Action ActiveSceneChanged; public event Action SceneUnloaded; @@ -32,15 +27,15 @@ public class AdvancedSceneManager : ISceneManager ISceneData _activeScene; /// - /// Creates an with no initial scene references. + /// Creates a with no initial scene references. /// - public AdvancedSceneManager() : this(false) { } + public CoreSceneManager() : this(false) { } /// - /// Creates a new with the option to add all loaded scenes to its management. + /// Creates a new with the option to add all loaded scenes to its management. /// The advantage is that you can manage those scenes through this instead of having to /// use the Unity . /// - public AdvancedSceneManager(bool addLoadedScenes) + public CoreSceneManager(bool addLoadedScenes) { if (!addLoadedScenes) { @@ -63,19 +58,19 @@ public AdvancedSceneManager(bool addLoadedScenes) } else if (loadedSceneCount == 0) { - Debug.LogWarning("Tried to create an `AdvancedSceneManager` with all loaded scenes, but encoutered none. Did you create the scene manager on `Awake()`? If so, try moving the call to `Start()` instead."); + Debug.LogWarning("Tried to create a Scene Manager with all loaded scenes, but encoutered none. Did you create the Scene Manager on `Awake()`? If so, try moving the call to `Start()` instead."); } } /// - /// Creates a new with the option to add a list of loaded scenes to its management. + /// Creates a new with the option to add a list of loaded scenes to its management. /// The advantage is that you can manage those scenes through this instead of having to /// use the Unity . /// - public AdvancedSceneManager(Scene[] initializationScenes) + public CoreSceneManager(Scene[] initializationScenes) { if (initializationScenes == null || initializationScenes.Length == 0) { - throw new ArgumentException($"Trying to create an {nameof(AdvancedSceneManager)} with a null or empty array of initialization scenes. If you want to create it without any scenes, use the empty constructor instead.", nameof(initializationScenes)); + throw new ArgumentException($"Trying to create an {nameof(CoreSceneManager)} with a null or empty array of initialization scenes. If you want to create it without any scenes, use the empty constructor instead.", nameof(initializationScenes)); } int loadedSceneCount = initializationScenes.Length; @@ -141,45 +136,34 @@ public Scene GetLoadedSceneByName(string name) throw new ArgumentException($"[{GetType().Name}] Could not find any loaded scene with the name '{name}'.", nameof(name)); } - public async ValueTask LoadScenesAsync(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) + public Task TransitionAsync(SceneParameters sceneParameters, ILoadSceneInfo intermediateSceneReference = null, CancellationToken token = default) { - CancellationTokenSource linkedSource = CancellationTokenSource.CreateLinkedTokenSource(_lifetimeTokenSource.Token, token); - return await LoadScenesAsync_Internal(sceneInfos, setIndexActive, progress, linkedSource.Token).RunAndDisposeToken(linkedSource); - } - - public async ValueTask LoadSceneAsync(ILoadSceneInfo sceneInfo, bool setActive = false, IProgress progress = null, CancellationToken token = default) - { - sceneInfo = sceneInfo ?? throw new NullReferenceException($"[{GetType().Name}] Provided scene info is null."); + if (!sceneParameters.ShouldSetActive()) + throw new ArgumentException($"[{GetType().Name}] You need to provide a SceneParameters object with a valid 'setIndexActive' value to perform scene transitions.", nameof(sceneParameters)); CancellationTokenSource linkedSource = CancellationTokenSource.CreateLinkedTokenSource(_lifetimeTokenSource.Token, token); - Scene[] loadedScenes = await LoadScenesAsync_Internal(new ILoadSceneInfo[] { sceneInfo }, setActive ? 0 : -1, progress, linkedSource.Token).RunAndDisposeToken(linkedSource); - - return loadedScenes != null && loadedScenes.Length > 0 ? loadedScenes[0] : default; + return intermediateSceneReference == null + ? TransitionDirectlyAsync(sceneParameters, linkedSource.Token).RunAndDisposeToken(linkedSource) + : TransitionWithIntermediateAsync(sceneParameters, intermediateSceneReference, linkedSource.Token).RunAndDisposeToken(linkedSource); } - public async ValueTask UnloadScenesAsync(ILoadSceneInfo[] sceneInfos, CancellationToken token = default) + public Task LoadAsync(SceneParameters sceneParameters, IProgress progress = null, CancellationToken token = default) { CancellationTokenSource linkedSource = CancellationTokenSource.CreateLinkedTokenSource(_lifetimeTokenSource.Token, token); - return await UnloadScenesAsync_Internal(sceneInfos, linkedSource.Token).RunAndDisposeToken(linkedSource); + return LoadScenesAsync_Internal(sceneParameters, progress, linkedSource.Token).RunAndDisposeToken(linkedSource); } - public async ValueTask UnloadSceneAsync(ILoadSceneInfo sceneInfo, CancellationToken token = default) + public Task UnloadAsync(SceneParameters sceneParameters, CancellationToken token = default) { - sceneInfo = sceneInfo ?? throw new ArgumentNullException(nameof(sceneInfo), $"[{GetType().Name}] Provided scene info is null."); - CancellationTokenSource linkedSource = CancellationTokenSource.CreateLinkedTokenSource(_lifetimeTokenSource.Token, token); - Scene[] unloadedScenes = await UnloadScenesAsync_Internal(new ILoadSceneInfo[] { sceneInfo }, linkedSource.Token).RunAndDisposeToken(linkedSource); - - return unloadedScenes != null && unloadedScenes.Length > 0 ? unloadedScenes[0] : default; + return UnloadScenesAsync_Internal(sceneParameters.GetLoadSceneInfos(), linkedSource.Token).RunAndDisposeToken(linkedSource); } - async ValueTask LoadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, int setIndexActive, IProgress progress, CancellationToken token) + async Task LoadScenesAsync_Internal(SceneParameters sceneParameters, IProgress progress, CancellationToken token) { + ILoadSceneInfo[] sceneInfos = sceneParameters.GetLoadSceneInfos(); + int setIndexActive = sceneParameters.GetIndexToActivate(); int scenesToLoad = sceneInfos.Length; - if (sceneInfos == null || scenesToLoad == 0) - throw new ArgumentException(nameof(sceneInfos), $"[{GetType().Name}] Provided scene group is null or empty."); - if (setIndexActive >= scenesToLoad) - throw new ArgumentException(nameof(setIndexActive), $"[{GetType().Name}] Provided index to set active is bigger than the provided scene group size."); ISceneData[] sceneDataArray = new ISceneData[scenesToLoad]; int i; @@ -189,15 +173,7 @@ async ValueTask LoadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, i sceneDataArray[i].LoadSceneAsync(); } - while (!SceneDataUtilities.HasCompletedAllSceneLoadOperations(sceneDataArray) && !token.IsCancellationRequested) - { -#if USE_UNITASK - await UniTask.Yield(token); -#else - await Task.Yield(); -#endif - progress?.Report(SceneDataUtilities.GetAverageSceneLoadOperationProgress(sceneDataArray)); - } + await PollProgressAsync(sceneDataArray, progress, token); token.ThrowIfCancellationRequested(); @@ -212,17 +188,18 @@ async ValueTask LoadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, i if (setIndexActive >= 0) SetActiveScene(sceneDataArray[setIndexActive].SceneReference); - return SceneDataUtilities.GetScenesFromSceneDataArray(sceneDataArray); + return new SceneResult(SceneDataUtilities.GetScenesFromSceneDataArray(sceneDataArray)); } - async ValueTask UnloadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, CancellationToken token) + async Task UnloadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, CancellationToken token) { if (sceneInfos == null || sceneInfos.Length == 0) throw new ArgumentException($"[{GetType().Name}] Provided scene group is null or empty.", nameof(sceneInfos)); + int sceneCount = sceneInfos.Length; ISceneData[] sceneDataArray = SceneDataUtilities.GetLoadedSceneDatasWithLoadSceneInfos(sceneInfos, _loadedScenes); + Task[] loadTasks = new Task[sceneCount]; - int sceneCount = sceneInfos.Length; ISceneData tempSceneData; int i; for (i = 0; i < sceneCount; i++) @@ -230,19 +207,21 @@ async ValueTask UnloadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, tempSceneData = sceneDataArray[i]; _loadedScenes.Remove(tempSceneData); _unloadingScenes.Add(tempSceneData); - tempSceneData.UnloadSceneAsync(); + loadTasks[i] = UnityTaskUtilities.FromAsyncOperation(sceneDataArray[i].UnloadSceneAsync(), token); } - while (!SceneDataUtilities.HasCompletedAllSceneLoadOperations(sceneDataArray) && !token.IsCancellationRequested) + try { -#if USE_UNITASK - await UniTask.Yield(token); -#else - await Task.Yield(); -#endif + await Task.WhenAll(loadTasks); + } + catch (OperationCanceledException exception) + { + for (i = 0; i < sceneCount; i++) + { + _unloadingScenes.Remove(sceneDataArray[i]); + } + throw exception; } - - token.ThrowIfCancellationRequested(); for (i = 0; i < sceneCount; i++) { @@ -253,7 +232,80 @@ async ValueTask UnloadScenesAsync_Internal(ILoadSceneInfo[] sceneInfos, SetActiveScene(GetLastLoadedScene()); } - return SceneDataUtilities.GetScenesFromSceneDataArray(sceneDataArray); + return new SceneResult(SceneDataUtilities.GetScenesFromSceneDataArray(sceneDataArray)); + } + + async Task TransitionDirectlyAsync(SceneParameters sceneParameters, CancellationToken token) + { + // If only one scene is loaded, create a temporary scene for transition. + Scene tempScene = default; + if (LoadedSceneCount <= 1) + { + tempScene = SceneManager.CreateScene("temp-transition-scene"); + } + await UnloadSourceSceneAsync(token); + + Scene[] loadedScenes = await LoadAsync(sceneParameters, token: token); + + if (tempScene.IsValid()) + { + IAsyncSceneOperation unloadOperation = new AsyncSceneOperationStandard(SceneManager.UnloadSceneAsync(tempScene)); + await UnityTaskUtilities.FromAsyncOperation(unloadOperation, token); + } + return new SceneResult(loadedScenes); + } + + async Task TransitionWithIntermediateAsync(SceneParameters sceneParameters, ILoadSceneInfo intermediateSceneInfo, CancellationToken token) + { + Scene loadingScene = await LoadAsync(new SceneParameters(intermediateSceneInfo, false), token: token); + intermediateSceneInfo = new LoadSceneInfoScene(loadingScene); + + LoadingBehavior loadingBehavior = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None).FirstOrDefault(l => l.gameObject.scene == loadingScene); + return loadingBehavior + ? await TransitionWithIntermediateLoadingAsync(sceneParameters, intermediateSceneInfo, loadingBehavior, token) + : await TransitionWithIntermediateNoLoadingAsync(sceneParameters, intermediateSceneInfo, token); + } + + async Task TransitionWithIntermediateLoadingAsync(SceneParameters sceneParameters, ILoadSceneInfo intermediateSceneInfo, LoadingBehavior loadingBehavior, CancellationToken token) + { + LoadingProgress progress = loadingBehavior.Progress; + await progress.TransitionInTask.Task; + await UnloadSourceSceneAsync(token); + + Scene[] loadedScenes = await LoadAsync(sceneParameters, progress, token); + progress.SetLoadingCompleted(); + + await progress.TransitionOutTask.Task; + await UnloadAsync(new SceneParameters(intermediateSceneInfo), token); + return new SceneResult(loadedScenes); + } + + async Task TransitionWithIntermediateNoLoadingAsync(SceneParameters sceneParameters, ILoadSceneInfo intermediateSceneInfo, CancellationToken token) + { + await UnloadSourceSceneAsync(token); + Scene[] loadedScenes = await LoadAsync(sceneParameters, token: token); + await UnloadAsync(new SceneParameters(intermediateSceneInfo), token); + return new SceneResult(loadedScenes); + } + + async Task PollProgressAsync(ISceneData[] sceneDataArray, IProgress progress, CancellationToken token = default) + { + bool isDone = false; + while (!isDone && !token.IsCancellationRequested) + { + await Task.Yield(); + isDone = SceneDataUtilities.HasCompletedAllSceneLoadOperations(sceneDataArray); + progress?.Report(SceneDataUtilities.GetAverageSceneLoadOperationProgress(sceneDataArray)); + } + } + + Task UnloadSourceSceneAsync(CancellationToken token) + { + Scene sourceScene = GetActiveScene(); + if (!sourceScene.IsValid()) + return Task.FromResult(default); + + return UnloadAsync(new SceneParameters(new LoadSceneInfoScene(sourceScene)), token); } } } \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/AdvancedSceneManager.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/CoreSceneManager.cs.meta similarity index 100% rename from Packages/com.mygamedevtools.scene-loader/Runtime/AdvancedSceneManager.cs.meta rename to Packages/com.mygamedevtools.scene-loader/Runtime/CoreSceneManager.cs.meta diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/IAsyncSceneOperation.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/IAsyncSceneOperation.cs index 539a3e3a..f30007e7 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/IAsyncSceneOperation.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/IAsyncSceneOperation.cs @@ -1,3 +1,4 @@ +using System; using UnityEngine.SceneManagement; namespace MyGameDevTools.SceneLoading @@ -7,6 +8,11 @@ namespace MyGameDevTools.SceneLoading /// public interface IAsyncSceneOperation { + /// + /// Event fired when the async operation is done. + /// + event Action Completed; + /// /// Progress of the load/unload operation from 0 to 1 (float). /// diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneData.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneData.cs index e2a411f5..797c0676 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneData.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneData.cs @@ -37,6 +37,13 @@ public interface ISceneData /// void UpdateSceneReference(); + /// + /// Returns whether this can be matched by the given . + /// If the is equal to the or has a direct reference to the scene, it returns true. + /// + /// to validate a match. + bool MatchesLoadSceneInfo(ILoadSceneInfo loadSceneInfo); + /// /// Triggers the load async operation and updates the reference. /// diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoader.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoader.cs deleted file mode 100644 index 140b82c4..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoader.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using UnityEngine.SceneManagement; - -namespace MyGameDevTools.SceneLoading -{ - /// - /// Interface to standardize scene loading operations. - /// - public interface ISceneLoader : IDisposable - { - /// - /// Reference to the , responsible for performing the scene loading operations. - /// You can retrieve the manager to listen to the , and events. - /// - ISceneManager Manager { get; } - - /// - /// Triggers a transition to a group of scenes from the active scene. - /// It will transition from the current active scene () - /// to a group of scenes (), with an optional intermediate loading scene (). - /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. - /// The complete transition flow is: - ///

- /// 1. Load the intermediate scene (if provided).
- /// 2. Unload the source scene (if any).
- /// 3. Load all target scenes.
- /// 4. Unload the intermediate scene (if provided).
- ///
- /// - /// A reference to all scenes that will be transitioned to. - /// - /// - /// Index of the scene in the to be set as the active scene. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - void TransitionToScenes(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null); - - /// - /// Triggers a transition to the target scene from the active scene. - /// It will transition from the current active scene () - /// to the target scene (), with an optional intermediate loading scene (). - /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. - /// The complete transition flow is: - ///

- /// 1. Load the intermediate scene (if provided).
- /// 2. Unload the source scene (if any).
- /// 3. Load the target scene.
- /// 4. Unload the intermediate scene (if provided).
- ///
- /// - /// A reference to the scene that's going to be transitioned to. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - void TransitionToScene(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null); - - /// - /// Triggers a transition to a group of scenes from another group of scenes. - /// It will transition from the provided group of scenes () - /// to a group of scenes (), with an optional intermediate loading scene (). - /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. - /// The complete transition flow is: - ///

- /// 1. Load the intermediate scene (if provided).
- /// 2. Unload all provided scenes.
- /// 3. Load all target scenes.
- /// 4. Unload the intermediate scene (if provided).
- ///
- /// - /// A reference to all scenes that will be transitioned to. - /// - /// - /// A reference to all scenes that will be unloaded in the transition. - /// - /// - /// Index of the scene in the to be set as the active scene. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - void TransitionToScenesFromScenes(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null); - - /// - /// Triggers a transition to the target scene from a group of scens. - /// It will transition from the provided group of scenes () - /// to the target scene (), with an optional intermediate loading scene (). - /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. - /// The complete transition flow is: - ///

- /// 1. Load the intermediate scene (if provided).
- /// 2. Unload all provided scenes.
- /// 3. Load the target scene.
- /// 4. Unload the intermediate scene (if provided).
- ///
- /// - /// A reference to the scene that's going to be transitioned to. - /// - /// - /// A reference to all scenes that will be unloaded in the transition. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - void TransitionToSceneFromScenes(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneInfo = null); - - /// - /// Triggers a transition to a group of scenes from all loaded scenes. - /// It will transition from all loaded scenes - /// to a group of scenes (), with an optional intermediate loading scene (). - /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. - /// The complete transition flow is: - ///

- /// 1. Load the intermediate scene (if provided).
- /// 2. Unload all loaded scenes.
- /// 3. Load all target scenes.
- /// 4. Unload the intermediate scene (if provided).
- ///
- /// - /// A reference to all scenes that will be transitioned to. - /// - /// - /// Index of the scene in the to be set as the active scene. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - void TransitionToScenesFromAll(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null); - - /// - /// Triggers a transition to the target scene from all loaded scenes. - /// It will transition from the provided group of scenes () - /// to the target scene (), with an optional intermediate loading scene (). - /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. - /// The complete transition flow is: - ///

- /// 1. Load the intermediate scene (if provided).
- /// 2. Unload all provided scenes.
- /// 3. Load the target scene.
- /// 4. Unload the intermediate scene (if provided).
- ///
- /// - /// A reference to the scene that's going to be transitioned to. - /// - /// - /// A reference to all scenes that will be unloaded in the transition. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - void TransitionToSceneFromAll(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null); - - /// - /// Unloads all the scenes from the current scene stack. - /// - /// - /// Reference to all scenes that will be unloaded. - /// - void UnloadScenes(ILoadSceneInfo[] sceneInfos); - - /// - /// Unloads the given scene from the current scene stack. - /// - /// - /// Reference to the desired scene to be unloaded. - /// - void UnloadScene(ILoadSceneInfo sceneInfo); - - /// - /// Loads all scenes additively on top of the current scene stack, optionally marking one of them as the active scene. - /// - /// - /// Reference to all scenes that will be loaded. - /// - /// - /// Which of the scenes should be marked as active? Default is -1. - /// - void LoadScenes(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1); - - /// - /// Loads a scene additively on top of the current scene stack, optionally marking it as the active scene - /// (). - /// - /// - /// Reference to the scene that's going to be loaded. - /// - /// Should the loaded scene be marked as active? Equivalent to calling . - void LoadScene(ILoadSceneInfo sceneInfo, bool setActive = false); - } -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoaderAsync.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoaderAsync.cs deleted file mode 100644 index bab84fc8..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoaderAsync.cs +++ /dev/null @@ -1,198 +0,0 @@ -#if ENABLE_UNITASK -using Cysharp.Threading.Tasks; -#endif -using System; -using System.Threading.Tasks; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace MyGameDevTools.SceneLoading -{ - /// - /// Interface to standardize async scene loading operations. - /// can be a or an awaitable type that returns , such as - /// . - /// The can also be a coroutine or an awaitable type that returns a array. - /// - public interface ISceneLoaderAsync : ISceneLoader - { - /// - /// Async version of the - /// - /// - /// A reference to all scenes that will be transitioned to. - /// - /// - /// Index of the scene in the to be set as the active scene. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - /// - /// The transition operation. - /// - TAsyncSceneArray TransitionToScenesAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = default); - - /// - /// Async version of the . - /// - /// - /// A reference to the scene that's going to be transitioned to. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - /// - /// The transition operation. - /// - TAsyncScene TransitionToSceneAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = default); - - /// - /// Async version of the - /// - /// - /// A reference to all scenes that will be transitioned to. - /// - /// - /// A reference to all scenes that will be unloaded in the transition. - /// - /// - /// Index of the scene in the to be set as the active scene. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - /// - /// The transition operation. - /// - TAsyncSceneArray TransitionToScenesFromScenesAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = default); - - /// - /// Async version of the - /// - /// - /// A reference to the scene that's going to be transitioned to. - /// - /// - /// A reference to all scenes that will be unloaded in the transition. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - /// - /// The transition operation. - /// - TAsyncScene TransitionToSceneFromScenesAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneReference = default); - - /// - /// Async version of the - /// - /// - /// A reference to all scenes that will be transitioned to. - /// - /// - /// Index of the scene in the to be set as the active scene. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - /// - /// The transition operation. - /// - TAsyncSceneArray TransitionToScenesFromAllAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = default); - - /// - /// Async version of the - /// - /// - /// A reference to the scene that's going to be transitioned to. - /// - /// - /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). - /// If null, the transition will not have an intermediate loading scene. - /// - /// - /// The transition operation. - /// - TAsyncScene TransitionToSceneFromAllAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = default); - - /// - /// Async version of the . - /// - /// - /// Reference to all scenes that will be loaded. - /// - /// - /// Which of the scenes should be marked as active? Default is -1. - /// - /// - /// Optional reference to report the scene group loading progress (ranging from 0 to 1). - /// - /// - /// The loading operation. - /// - TAsyncSceneArray LoadScenesAsync(ILoadSceneInfo[] sceneReferences, int setIndexActive = -1, IProgress progress = null); - - /// - /// Async version of the . - /// - /// - /// Reference to the scene that's going to be loaded. - /// - /// - /// Should the loaded scene be marked as active? Equivalent to calling . - /// - /// - /// Optional reference to report the scene loading progress (ranging from 0 to 1). - /// - /// - /// The loading operation. - /// - TAsyncScene LoadSceneAsync(ILoadSceneInfo sceneReference, bool setActive = false, IProgress progress = null); - - /// - /// Async version of the - /// - /// - /// Reference to all scenes to be unloaded. - /// - /// - /// The unloading operation. - /// - TAsyncSceneArray UnloadScenesAsync(ILoadSceneInfo[] sceneReferences); - - /// - /// Async version of the . - /// - /// - /// Reference to the desired scene to be unloaded. - /// - /// - /// The unloading operation. - /// - TAsyncScene UnloadSceneAsync(ILoadSceneInfo sceneReference); - } - - /// - /// Convenience interface to standardize async scene loading operations. - /// You can use the to yield return inside coroutines. - /// - public interface ISceneLoaderCoroutine : ISceneLoaderAsync, WaitTask> { } - - /// - /// Convenience interface to standardize async scene loading operations. - /// - public interface ISceneLoaderAsync : ISceneLoaderAsync, ValueTask> { } - -#if ENABLE_UNITASK - /// - /// Convenience interface to standardize async scene loading operations. - /// - public interface ISceneLoaderUniTask : ISceneLoaderAsync, UniTask> { } -#endif -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneManager.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneManager.cs index ee43a713..a6a93b69 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneManager.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneManager.cs @@ -7,7 +7,7 @@ namespace MyGameDevTools.SceneLoading { /// /// Interface to standardize scene management operations. - /// The scene manager is responsible for scene loading operations, keeping track of its loaded scene stack and dispatching scene load events. + /// The Scene Manager is responsible for scene loading operations, keeping track of its loaded scene stack and dispatching scene load events. /// public interface ISceneManager : IDisposable { @@ -47,59 +47,58 @@ public interface ISceneManager : IDisposable void SetActiveScene(Scene scene); /// - /// Loads all scenes provided by the array in parallel. - /// You may also provide the desired index to set as the active scene through the parameter. - /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to the target scene or a group of scenes via a struct, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
///
- /// References to all scenes to load. - /// Index of the desired scene to set active, based on the array. - /// Object to report the loading operations progress to, from 0 to 1. + /// + /// A struct that may hold one or more scenes and the target active index. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. - /// A with all scenes loaded. - /// When scene info group is null, empty or the setIndexName is bigger than the scene length. - /// When the provided scene info group fails to produce valid load scene operations. - ValueTask LoadScenesAsync(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default); + /// A with all scenes loaded. + Task TransitionAsync(SceneParameters sceneParameters, ILoadSceneInfo intermediateSceneReference = default, CancellationToken token = default); /// - /// Loads a scene referenced by the , optionally enabling it as the active scene. - /// Also, you can pass an object to receive the progress of the loading operation, from 0 to 1. + /// Loads the target scene or group of scenes provided via a struct. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. /// - /// A reference to the scene that's going to be loaded. - /// Should the loaded scene be enabled as the active scene? - /// Object to report the loading operation progress to, from 0 to 1. - /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. - /// A with the loaded scene as the result. - /// When scene info is null. - /// When the provided scene info fails to produce a valid load scene operation. - ValueTask LoadSceneAsync(ILoadSceneInfo sceneInfo, bool setActive = false, IProgress progress = null, CancellationToken token = default); + /// + /// A struct that may hold one or more scenes and the target active index. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + Task LoadAsync(SceneParameters sceneParameters, IProgress progress = null, CancellationToken token = default); /// - /// Unloads all scenes provided by the array in parallel. + /// Unloads the target scene or group of scenes provided via a struct. /// - /// Reference to all scenes to unload. + /// + /// A struct that may hold one or more scenes. + /// /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. /// - /// A with all the unloaded scenes. + /// A with all the unloaded scenes. ///
/// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. ///
- /// When scene info group is null or empty. - /// When the provided scene info group fails to produce valid unload scene operations. - ValueTask UnloadScenesAsync(ILoadSceneInfo[] sceneInfos, CancellationToken token = default); - - /// - /// Unloads a scene referenced by the . - /// - /// A reference to the scene that's going to be unloaded. - /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. - /// - /// A with the unloaded scene as the result. - ///
- /// Note that in some cases, the returned scene might no longer have a reference to its native representation, which means its will not point anywhere and you won't be able to perform equal comparisons between scenes. - ///
- /// When scene info is null. - /// When the provided scene info fails to produce a valid unload scene operation. - ValueTask UnloadSceneAsync(ILoadSceneInfo sceneInfo, CancellationToken token = default); + Task UnloadAsync(SceneParameters sceneParameters, CancellationToken token = default); /// /// Gets the current active scene in this instance. diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingBehavior.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingBehavior.cs index 584459a6..70c963a7 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingBehavior.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingBehavior.cs @@ -21,19 +21,19 @@ public class LoadingBehavior : MonoBehaviour void Awake() { Progress = new LoadingProgress(); - Progress.StateChanged += OnLoadingStateChange; + Progress.LoadingCompleted += OnLoadingCompleted; } void Start() { if (!waitForScriptedStart) - Progress.SetState(LoadingState.Loading); + Progress.StartTransition(); } - void OnLoadingStateChange(LoadingState loadingState) + void OnLoadingCompleted() { - if (loadingState == LoadingState.TargetSceneLoaded && !waitForScriptedEnd) - Progress.SetState(LoadingState.TransitionComplete); + if (!waitForScriptedEnd) + Progress.EndTransition(); } } } \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingFader.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingFader.cs index 76c6877a..26cb834a 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingFader.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingFader.cs @@ -28,23 +28,17 @@ void Awake() void Start() { _loadingProgress = loadingBehavior.Progress; - _loadingProgress.StateChanged += OnLoadingStateChanged; + _loadingProgress.LoadingCompleted += FadeOut; FadeIn(); } - void OnLoadingStateChanged(LoadingState loadingState) - { - if (loadingState == LoadingState.TargetSceneLoaded) - FadeOut(); - } - void FadeOut() { StartCoroutine(fadeOutRoutine()); IEnumerator fadeOutRoutine() { yield return FadeRoutine(_fadeOutCurve); - _loadingProgress.SetState(LoadingState.TransitionComplete); + _loadingProgress.EndTransition(); } } @@ -54,7 +48,7 @@ void FadeIn() IEnumerator fadeInRoutine() { yield return FadeRoutine(_fadeInCurve); - _loadingProgress.SetState(LoadingState.Loading); + _loadingProgress.StartTransition(); } } diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingProgress.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingProgress.cs index ff6f31c8..089c7293 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingProgress.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingProgress.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using UnityEngine; namespace MyGameDevTools.SceneLoading @@ -8,41 +9,34 @@ namespace MyGameDevTools.SceneLoading /// public class LoadingProgress : IProgress { - /// - /// Reports when the has changed. - /// - public event Action StateChanged; /// /// Reports when the scene loading progress increases. Values range from 0 to 1. /// public event Action Progressed; + public event Action LoadingCompleted; - /// - /// Current state of the scene loading progress. - /// - public LoadingState State { get; private set; } + public readonly TaskCompletionSource TransitionInTask; + public readonly TaskCompletionSource TransitionOutTask; - /// - /// Creates a new instance of a , optionally adjusting its loading ratio. - ///
- ///
public LoadingProgress() { - State = LoadingState.WaitingToStart; + TransitionInTask = new TaskCompletionSource(); + TransitionOutTask = new TaskCompletionSource(); } - /// - /// Sets the value. - /// You can use this method to apply loading screen transition effects, such as fade in/out. - ///
- /// The target scene will only start to be loaded on the state, and the entire transition will only finish in the state. - /// The only sets the state, once after the target scene has finished loading in the background. - ///
- /// The to be set. - public void SetState(LoadingState targetState) + public void StartTransition() + { + TransitionInTask.SetResult(true); + } + + public void EndTransition() + { + TransitionOutTask.SetResult(true); + } + + public void SetLoadingCompleted() { - State = targetState; - StateChanged?.Invoke(State); + LoadingCompleted?.Invoke(); } /// diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingState.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingState.cs deleted file mode 100644 index 785d4d84..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingState.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace MyGameDevTools.SceneLoading -{ - /// - /// States of the loading scene, during a scene transition operation. - /// - public enum LoadingState - { - /// - /// Default state. Holds the loading of the target scene until the state is set. - /// Can be used to display loading screen transition effects, such as a fade in. - /// - WaitingToStart, - /// - /// The target scene is being loaded during this state. - /// Can be set automatically by the if is disabled. - ///
- /// Otherwise, it should be set via after a loading screen transition effect, such as a fade in. - ///
- Loading, - /// - /// The target scene has been successfully loaded at this state. - /// It is set by the . Do not set this state manually. - ///
- /// Holds the conclusion of the scene transition until the state is set. - ///
- TargetSceneLoaded, - /// - /// The scene transition is complete and the loading scene can be unloaded. - /// Can be set automatically by the if is disabled. - ///
- /// Otherwise, it should be set via after a loading screen transition effect, such as a fade out. - ///
- TransitionComplete - } -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/MyGameDevTools.SceneLoading.asmdef b/Packages/com.mygamedevtools.scene-loader/Runtime/MyGameDevTools.SceneLoading.asmdef index 2f2957be..b8f25cf9 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/MyGameDevTools.SceneLoading.asmdef +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/MyGameDevTools.SceneLoading.asmdef @@ -1,12 +1,10 @@ { "name": "MyGameDevTools.SceneLoading", - "rootNamespace": "", + "rootNamespace": "MyGameDevTools.SceneLoading", "references": [ "GUID:6055be8ebefd69e48b49212b09b47b2f", "GUID:9e24947de15b9834991c9d8411ea37cf", - "GUID:84651a3751eca9349aac36a66bba901b", - "GUID:f51ebe6a0ceec4240a699833d6309b23", - "GUID:593a5b492d29ac6448b1ebf7f035ef33" + "GUID:84651a3751eca9349aac36a66bba901b" ], "includePlatforms": [], "excludePlatforms": [], @@ -21,15 +19,15 @@ "expression": "2.2", "define": "ENABLE_TMP" }, + { + "name": "com.unity.ugui", + "expression": "2", + "define": "ENABLE_TMP" + }, { "name": "com.unity.addressables", "expression": "1.19", "define": "ENABLE_ADDRESSABLES" - }, - { - "name": "com.cysharp.unitask", - "expression": "2", - "define": "ENABLE_UNITASK" } ], "noEngineReferences": false diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/MySceneManager.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/MySceneManager.cs new file mode 100644 index 00000000..7cfbf93a --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/MySceneManager.cs @@ -0,0 +1,667 @@ +#if !DISABLE_STATIC_SCENE_MANAGER +using System; +using System.Threading; +using System.Threading.Tasks; +using UnityEngine; +#if ENABLE_ADDRESSABLES +using UnityEngine.AddressableAssets; +#endif +using UnityEngine.SceneManagement; + +namespace MyGameDevTools.SceneLoading +{ + public static class MySceneManager + { + internal static ISceneManager Instance + { + get + { + if (_instance == null) + throw new NullReferenceException($"[{nameof(MySceneManager)}] The static Scene Manager instance is not available before the first scene is fully loaded. Try moving the call to `Start()`."); + return _instance; + } + } + + static ISceneManager _instance; + + [RuntimeInitializeOnLoadMethod] + internal static void Initialize() + { + _instance = new CoreSceneManager(true); + } + + #region ISceneManager + /// + /// Reports that the active scene has changed, passing the previous and current active scene as parameters. + ///
+ /// In some scenarios, the previous or the current scene might be invalid (you can check it through ), but never both at the same time. + ///
+ /// This can occur when the first active scene is being set (there was no previous active scene) or when the last scene gets unloaded (leaving no other scene to be activated). + ///
+ public static event Action ActiveSceneChanged + { + add => Instance.ActiveSceneChanged += value; + remove => Instance.ActiveSceneChanged -= value; + } + /// + /// Reports when a scene gets unloaded. + /// + public static event Action SceneUnloaded + { + add => Instance.SceneUnloaded += value; + remove => Instance.SceneUnloaded -= value; + } + /// + /// Reports when a scene gets loaded. + /// + public static event Action SceneLoaded + { + add => Instance.SceneLoaded += value; + remove => Instance.SceneLoaded -= value; + } + + /// + /// The amount of scenes loaded. + /// + public static int LoadedSceneCount => Instance.LoadedSceneCount; + /// + /// The amount of scenes managed by the internal . + /// This includes scenes that are being unloaded. + /// + public static int TotalSceneCount => Instance.TotalSceneCount; + + /// + /// Sets the target as the active scene. + /// Internally calls . + /// + /// Scene to be enabled as the active scene. + public static void SetActiveScene(Scene scene) => Instance.SetActiveScene(scene); + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to the target scene or a group of scenes via a struct, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// A struct that may hold one or more scenes and the target active index. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(SceneParameters sceneParameters, ILoadSceneInfo intermediateSceneReference = default, CancellationToken token = default) => Instance.TransitionAsync(sceneParameters, intermediateSceneReference, token); + + /// + /// Loads the target scene or group of scenes provided via a struct. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// A struct that may hold one or more scenes and the target active index. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(SceneParameters sceneParameters, IProgress progress = null, CancellationToken token = default) => Instance.LoadAsync(sceneParameters, progress, token); + + /// + /// Unloads the target scene or group of scenes provided via a struct. + /// + /// + /// A struct that may hold one or more scenes. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(SceneParameters sceneParameters, CancellationToken token = default) => Instance.UnloadAsync(sceneParameters, token); + + /// + /// Gets the current active scene. + /// This should point to the same scene you get via . + /// + /// The current active scene, or an invalid scene if none of the loaded scenes are enabled as the active scene. + public static Scene GetActiveScene() => Instance.GetActiveScene(); + + /// + /// Gets the loaded scene at the of the loaded scenes list. + /// + /// Index of the target scene in the loaded scenes list. + /// The loaded scene at the of the loaded scenes list. + public static Scene GetLoadedSceneAt(int index) => Instance.GetLoadedSceneAt(index); + + /// + /// Gets the last loaded scene of this . + /// + /// The last loaded scene, or an invalid scene if there are no loaded scenes in this . + public static Scene GetLastLoadedScene() => Instance.GetLastLoadedScene(); + + /// + /// Gets a loaded scene by its . + /// + /// Name of the loaded scene to be found. + /// A loaded scene with the given . + public static Scene GetLoadedSceneByName(string name) => Instance.GetLoadedSceneByName(name); + #endregion + + #region Extensions + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' names. + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(string[] sceneNames, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) => Instance.LoadAsync(sceneNames, setIndexActive, progress, token); + + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' build indexes. + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(int[] buildIndices, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) => Instance.LoadAsync(buildIndices, setIndexActive, progress, token); + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's name. + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(string sceneName, bool setActive = false, IProgress progress = null, CancellationToken token = default) => Instance.LoadAsync(sceneName, setActive, progress, token); + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's build index. + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(int buildIndex, bool setActive = false, IProgress progress = null, CancellationToken token = default) => Instance.LoadAsync(buildIndex, setActive, progress, token); + +#if ENABLE_ADDRESSABLES + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' . + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(AssetReference[] assetReferences, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) => Instance.LoadAddressableAsync(assetReferences, setIndexActive, progress, token); + + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' addressable address. + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(string[] addresses, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) => Instance.LoadAddressableAsync(addresses, setIndexActive, progress, token); + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's . + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(AssetReference assetReference, bool setActive = false, IProgress progress = null, CancellationToken token = default) => Instance.LoadAddressableAsync(assetReference, setActive, progress, token); + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's addressable address. + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(string address, bool setActive = false, IProgress progress = null, CancellationToken token = default) => Instance.LoadAddressableAsync(address, setActive, progress, token); +#endif + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their names to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(string[] targetSceneNames, string loadingSceneName = null, int setIndexActive = 0, CancellationToken token = default) => Instance.TransitionAsync(targetSceneNames, loadingSceneName, setIndexActive, token); + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their build index to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(int[] targetBuildIndices, int loadingBuildIndex = -1, int setIndexActive = 0, CancellationToken token = default) => Instance.TransitionAsync(targetBuildIndices, loadingBuildIndex, setIndexActive, token); + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene name to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(string targetSceneName, string loadingSceneName = null, CancellationToken token = default) => Instance.TransitionAsync(targetSceneName, loadingSceneName, token); + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene build index to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If -1, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(int targetBuildIndex, int loadingBuildIndex = -1, CancellationToken token = default) => Instance.TransitionAsync(targetBuildIndex, loadingBuildIndex, token); + +#if ENABLE_ADDRESSABLES + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(AssetReference[] targetAssetReferences, AssetReference loadingAssetReference = null, int setIndexActive = 0, CancellationToken token = default) => Instance.TransitionAddressableAsync(targetAssetReferences, loadingAssetReference, setIndexActive, token); + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their addressable addresses to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(string[] targetAddresses, string loadingAddress = null, int setIndexActive = 0, CancellationToken token = default) => Instance.TransitionAddressableAsync(targetAddresses, loadingAddress, setIndexActive, token); + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(AssetReference targetAssetReference, AssetReference loadingAssetReference = null, CancellationToken token = default) => Instance.TransitionAddressableAsync(targetAssetReference, loadingAssetReference, token); + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene addressable address to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(string targetAddress, string loadingAddress = null, CancellationToken token = default) => Instance.TransitionAddressableAsync(targetAddress, loadingAddress, token); +#endif + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes by their names to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(string[] sceneNames, CancellationToken token = default) => Instance.UnloadAsync(sceneNames, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes by their build index to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(int[] buildIndices, CancellationToken token = default) => Instance.UnloadAsync(buildIndices, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(Scene[] scenes, CancellationToken token = default) => Instance.UnloadAsync(scenes, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's name to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(string sceneName, CancellationToken token = default) => Instance.UnloadAsync(sceneName, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's build index to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(int buildIndex, CancellationToken token = default) => Instance.UnloadAsync(buildIndex, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(Scene scene, CancellationToken token = default) => Instance.UnloadAsync(scene, token); + +#if ENABLE_ADDRESSABLES + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(AssetReference[] assetReferences, CancellationToken token = default) => Instance.UnloadAddressableAsync(assetReferences, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(string[] addresses, CancellationToken token = default) => Instance.UnloadAddressableAsync(addresses, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(AssetReference assetReference, CancellationToken token = default) => Instance.UnloadAddressableAsync(assetReference, token); + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's addressable address to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(string address, CancellationToken token = default) => Instance.UnloadAddressableAsync(address, token); +#endif + #endregion + } +} +#endif \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/MySceneManager.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/MySceneManager.cs.meta new file mode 100644 index 00000000..5dbe823d --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/MySceneManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a08c7b1ee6e5566469682ddc16ef7686 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderAsync.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderAsync.cs deleted file mode 100644 index eed00125..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderAsync.cs +++ /dev/null @@ -1,244 +0,0 @@ -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace MyGameDevTools.SceneLoading -{ - public readonly struct SceneLoaderAsync : ISceneLoaderAsync - { - public ISceneManager Manager => _manager; - - readonly ISceneManager _manager; - readonly CancellationTokenSource _lifetimeTokenSource; - - public SceneLoaderAsync(ISceneManager manager) - { - _manager = manager ?? throw new ArgumentNullException("Cannot create a scene loader with a null Scene Manager"); - _lifetimeTokenSource = new CancellationTokenSource(); - } - - public void Dispose() - { - _lifetimeTokenSource.Cancel(); - _lifetimeTokenSource.Dispose(); - _manager.Dispose(); - } - - public void TransitionToScenes(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesAsync(targetScenes, setIndexActive, intermediateSceneInfo).AsTask().Forget(HandleFireAndForgetException); - } - - public void TransitionToScene(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = default) - { - TransitionToSceneAsync(targetSceneInfo, intermediateSceneInfo).AsTask().Forget(HandleFireAndForgetException); - } - - public void TransitionToScenesFromScenes(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesFromScenesAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneInfo).Forget(HandleFireAndForgetException); - } - - public void TransitionToSceneFromScenes(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneFromScenesAsync(targetSceneInfo, fromScenes, intermediateSceneInfo).Forget(HandleFireAndForgetException); - } - - public void TransitionToScenesFromAll(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesFromAllAsync(targetScenes, setIndexActive, intermediateSceneInfo).Forget(HandleFireAndForgetException); - } - - public void TransitionToSceneFromAll(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneFromAllAsync(targetSceneInfo, intermediateSceneInfo).Forget(HandleFireAndForgetException); - } - - public void UnloadScenes(ILoadSceneInfo[] sceneInfos) - { - UnloadScenesAsync(sceneInfos).AsTask().Forget(HandleFireAndForgetException); - } - - public void UnloadScene(ILoadSceneInfo sceneInfo) - { - UnloadSceneAsync(sceneInfo).AsTask().Forget(HandleFireAndForgetException); - } - - public void LoadScenes(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1) - { - LoadScenesAsync(sceneInfos, setIndexActive, null).AsTask().Forget(HandleFireAndForgetException); - } - - public void LoadScene(ILoadSceneInfo sceneInfo, bool setActive = false) - { - LoadSceneAsync(sceneInfo, setActive, null).AsTask().Forget(HandleFireAndForgetException); - } - - public ValueTask TransitionToScenesAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - Scene activeScene = _manager.GetActiveScene(); - ILoadSceneInfo[] fromScenes = activeScene.IsValid() ? new ILoadSceneInfo[] { new LoadSceneInfoScene(activeScene) } : null; - return intermediateSceneReference == null - ? TransitionDirectlyAsync(targetScenes, fromScenes, setIndexActive, _lifetimeTokenSource.Token) - : TransitionWithIntermediateAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneReference, _lifetimeTokenSource.Token); - } - - public async ValueTask TransitionToSceneAsync(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = default) - { - var result = await TransitionToScenesAsync(new ILoadSceneInfo[] { targetSceneInfo }, 0, intermediateSceneInfo); - return result == null || result.Length == 0 ? default : result[0]; - } - - public ValueTask TransitionToScenesFromScenesAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return intermediateSceneReference == null - ? TransitionDirectlyAsync(targetScenes, fromScenes, setIndexActive, _lifetimeTokenSource.Token) - : TransitionWithIntermediateAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneReference, _lifetimeTokenSource.Token); - } - - public async ValueTask TransitionToSceneFromScenesAsync(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneReference = null) - { - var result = await TransitionToScenesFromScenesAsync(new ILoadSceneInfo[] { targetSceneInfo }, fromScenes, 0, intermediateSceneReference); - return result == null || result.Length == 0 ? default : result[0]; - } - - public ValueTask TransitionToScenesFromAllAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - ILoadSceneInfo[] fromScenes = GetAllLoadedSceneInfos(); - return intermediateSceneReference == null - ? TransitionDirectlyAsync(targetScenes, fromScenes, setIndexActive, _lifetimeTokenSource.Token) - : TransitionWithIntermediateAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneReference, _lifetimeTokenSource.Token); - } - - public async ValueTask TransitionToSceneFromAllAsync(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneReference = null) - { - var result = await TransitionToScenesFromAllAsync(new ILoadSceneInfo[] { targetSceneInfo }, 0, intermediateSceneReference); - return result == null || result.Length == 0 ? default : result[0]; - } - - public ValueTask LoadScenesAsync(ILoadSceneInfo[] sceneReferences, int setIndexActive = -1, IProgress progress = null) - { - return _manager.LoadScenesAsync(sceneReferences, setIndexActive, progress, _lifetimeTokenSource.Token); - } - - public ValueTask LoadSceneAsync(ILoadSceneInfo sceneInfo, bool setActive = false, IProgress progress = null) - { - return _manager.LoadSceneAsync(sceneInfo, setActive, progress, _lifetimeTokenSource.Token); - } - - public ValueTask UnloadScenesAsync(ILoadSceneInfo[] sceneReferences) - { - return _manager.UnloadScenesAsync(sceneReferences, _lifetimeTokenSource.Token); - } - - public ValueTask UnloadSceneAsync(ILoadSceneInfo sceneInfo) - { - return _manager.UnloadSceneAsync(sceneInfo, _lifetimeTokenSource.Token); - } - - async ValueTask TransitionDirectlyAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, CancellationToken token) - { - // If only one scene is loaded, we need to create a temporary scene for transition. - Scene tempScene = default; - if (SceneManager.sceneCount <= 1) - { - tempScene = SceneManager.CreateScene("temp-transition-scene"); - } - await UnloadSourceScenesAsync(fromScenes, token); - - Scene[] loadedScenes = await _manager.LoadScenesAsync(targetScenes, setIndexActive, token: token); - - if (tempScene.IsValid()) - { - _ = SceneManager.UnloadSceneAsync(tempScene); - } - return loadedScenes; - } - - async ValueTask TransitionWithIntermediateAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo, CancellationToken token) - { - Scene loadingScene; - try - { - loadingScene = await _manager.LoadSceneAsync(intermediateSceneInfo, token: token); - } - catch - { - throw; - } - - intermediateSceneInfo = new LoadSceneInfoScene(loadingScene); - -#if UNITY_2023_2_OR_NEWER - LoadingBehavior loadingBehavior = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None).FirstOrDefault(l => l.gameObject.scene == loadingScene); -#else - LoadingBehavior loadingBehavior = UnityEngine.Object.FindObjectsOfType().FirstOrDefault(l => l.gameObject.scene == loadingScene); -#endif - return loadingBehavior - ? await TransitionWithIntermediateLoadingAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneInfo, loadingBehavior, token) - : await TransitionWithIntermediateNoLoadingAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneInfo, token); - } - - async ValueTask TransitionWithIntermediateLoadingAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo, LoadingBehavior loadingBehavior, CancellationToken token) - { - LoadingProgress progress = loadingBehavior.Progress; - while (progress.State != LoadingState.Loading && !token.IsCancellationRequested) - await Task.Yield(); - - token.ThrowIfCancellationRequested(); - - await UnloadSourceScenesAsync(fromScenes, token); - - Scene[] loadedScenes = await _manager.LoadScenesAsync(targetScenes, setIndexActive, progress, token); - progress.SetState(LoadingState.TargetSceneLoaded); - - while (progress.State != LoadingState.TransitionComplete && !token.IsCancellationRequested) - await Task.Yield(); - - token.ThrowIfCancellationRequested(); - - _manager.UnloadSceneAsync(intermediateSceneInfo, token).Forget(HandleFireAndForgetException); - return loadedScenes; - } - - async ValueTask TransitionWithIntermediateNoLoadingAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo, CancellationToken token) - { - await UnloadSourceScenesAsync(fromScenes, token); - Scene[] loadedScenes = await _manager.LoadScenesAsync(targetScenes, setIndexActive, token: token); - _manager.UnloadSceneAsync(intermediateSceneInfo, token).Forget(HandleFireAndForgetException); - return loadedScenes; - } - - ValueTask UnloadSourceScenesAsync(ILoadSceneInfo[] fromScenes, CancellationToken token) - { - if (fromScenes == null || fromScenes.Length == 0) - return default; - - return _manager.UnloadScenesAsync(fromScenes, token); - } - - ILoadSceneInfo[] GetAllLoadedSceneInfos() - { - int count = _manager.LoadedSceneCount; - ILoadSceneInfo[] loadedSceneInfos = new ILoadSceneInfo[count]; - for (int i = 0; i < count; i++) - { - loadedSceneInfos[i] = new LoadSceneInfoScene(_manager.GetLoadedSceneAt(i)); - } - return loadedSceneInfos; - } - - void HandleFireAndForgetException(Exception exception) - { - Debug.LogWarningFormat("[SceneLoader] An exception was caught during a fire and forget task. Usually this can be caused due to internal task cancellation on exiting playmode. If that's not the case, investigate for issues on the async scene operations. Exception:\n{0}", exception); - } - - public override string ToString() - { - return $"Scene Loader [Async] with {_manager.GetType().Name}"; - } - } -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderCoroutine.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderCoroutine.cs deleted file mode 100644 index 11d5afb0..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderCoroutine.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using UnityEngine.SceneManagement; - -namespace MyGameDevTools.SceneLoading -{ - public readonly struct SceneLoaderCoroutine : ISceneLoaderCoroutine - { - public ISceneManager Manager => _sceneLoaderAsync.Manager; - - readonly ISceneLoaderAsync _sceneLoaderAsync; - - public SceneLoaderCoroutine(ISceneManager sceneManager) - { - if (sceneManager == null) - { - throw new ArgumentNullException($"Cannot create a {nameof(SceneLoaderCoroutine)} with a null {nameof(ISceneManager)}.", nameof(sceneManager)); - } - _sceneLoaderAsync = new SceneLoaderAsync(sceneManager); - } - - public void Dispose() - { - _sceneLoaderAsync.Dispose(); - } - - public void TransitionToScenes(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesAsync(targetScenes, setIndexActive, intermediateSceneInfo); - } - - public void TransitionToScene(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneAsync(targetSceneInfo, intermediateSceneInfo); - } - - public void TransitionToScenesFromScenes(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesFromScenesAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneInfo); - } - - public void TransitionToSceneFromScenes(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneFromScenesAsync(targetSceneInfo, fromScenes, intermediateSceneInfo); - } - - public void TransitionToScenesFromAll(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesFromAllAsync(targetScenes, setIndexActive, intermediateSceneInfo); - } - - public void TransitionToSceneFromAll(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneFromAllAsync(targetSceneInfo, intermediateSceneInfo); - } - - public void UnloadScenes(ILoadSceneInfo[] sceneInfos) - { - UnloadScenesAsync(sceneInfos); - } - - public void UnloadScene(ILoadSceneInfo sceneInfo) - { - UnloadSceneAsync(sceneInfo); - } - - public void LoadScenes(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1) - { - LoadScenesAsync(sceneInfos, setIndexActive); - } - - public void LoadScene(ILoadSceneInfo sceneInfo, bool setActive = false) - { - LoadSceneAsync(sceneInfo, setActive); - } - - public WaitTask TransitionToScenesAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return new WaitTask(_sceneLoaderAsync.TransitionToScenesAsync(targetScenes, setIndexActive, intermediateSceneReference).AsTask()); - } - - public WaitTask TransitionToSceneAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = null) - { - return new WaitTask(_sceneLoaderAsync.TransitionToSceneAsync(targetSceneReference, intermediateSceneReference).AsTask()); - } - - public WaitTask TransitionToScenesFromScenesAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return new WaitTask(_sceneLoaderAsync.TransitionToScenesFromScenesAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneReference).AsTask()); - } - - public WaitTask TransitionToSceneFromScenesAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneReference = null) - { - return new WaitTask(_sceneLoaderAsync.TransitionToSceneFromScenesAsync(targetSceneReference, fromScenes, intermediateSceneReference).AsTask()); - } - - public WaitTask TransitionToScenesFromAllAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return new WaitTask(_sceneLoaderAsync.TransitionToScenesFromAllAsync(targetScenes, setIndexActive, intermediateSceneReference).AsTask()); - } - - public WaitTask TransitionToSceneFromAllAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = null) - { - return new WaitTask(_sceneLoaderAsync.TransitionToSceneFromAllAsync(targetSceneReference, intermediateSceneReference).AsTask()); - } - - public WaitTask UnloadScenesAsync(ILoadSceneInfo[] sceneReferences) - { - return new WaitTask(_sceneLoaderAsync.UnloadScenesAsync(sceneReferences).AsTask()); - } - - public WaitTask UnloadSceneAsync(ILoadSceneInfo sceneReference) - { - return new WaitTask(_sceneLoaderAsync.UnloadSceneAsync(sceneReference).AsTask()); - } - - public WaitTask LoadScenesAsync(ILoadSceneInfo[] sceneReferences, int setIndexActive = -1, IProgress progress = null) - { - return new WaitTask(_sceneLoaderAsync.LoadScenesAsync(sceneReferences, setIndexActive, progress).AsTask()); - } - - public WaitTask LoadSceneAsync(ILoadSceneInfo sceneReference, bool setActive = false, IProgress progress = null) - { - return new WaitTask(_sceneLoaderAsync.LoadSceneAsync(sceneReference, setActive, progress).AsTask()); - } - - public override string ToString() - { - return $"Scene Loader [Coroutine] with {_sceneLoaderAsync.Manager.GetType().Name}"; - } - } -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderCoroutine.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderCoroutine.cs.meta deleted file mode 100644 index 2192d993..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderCoroutine.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c9843db71fb949748b0128e1754f6b03 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderUniTask.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderUniTask.cs deleted file mode 100644 index c2c9d9c3..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderUniTask.cs +++ /dev/null @@ -1,134 +0,0 @@ -#if ENABLE_UNITASK -using System; -using Cysharp.Threading.Tasks; -using UnityEngine.SceneManagement; - -namespace MyGameDevTools.SceneLoading -{ - public readonly struct SceneLoaderUniTask : ISceneLoaderUniTask - { - public ISceneManager Manager => _sceneLoaderAsync.Manager; - - readonly ISceneLoaderAsync _sceneLoaderAsync; - - public SceneLoaderUniTask(ISceneManager sceneManager) - { - if (sceneManager == null) - { - throw new ArgumentNullException($"Cannot create a {nameof(SceneLoaderUniTask)} with a null {nameof(ISceneManager)}.", nameof(sceneManager)); - } - _sceneLoaderAsync = new SceneLoaderAsync(sceneManager); - } - - public void Dispose() - { - _sceneLoaderAsync.Dispose(); - } - - public void TransitionToScenes(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesAsync(targetScenes, setIndexActive, intermediateSceneInfo); - } - - public void TransitionToScene(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneAsync(targetSceneInfo, intermediateSceneInfo); - } - - public void TransitionToScenesFromScenes(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesFromScenesAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneInfo); - } - - public void TransitionToSceneFromScenes(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneFromScenesAsync(targetSceneInfo, fromScenes, intermediateSceneInfo); - } - - public void TransitionToScenesFromAll(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToScenesFromAllAsync(targetScenes, setIndexActive, intermediateSceneInfo); - } - - public void TransitionToSceneFromAll(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null) - { - TransitionToSceneFromAllAsync(targetSceneInfo, intermediateSceneInfo); - } - - public void UnloadScenes(ILoadSceneInfo[] sceneInfos) - { - UnloadScenesAsync(sceneInfos); - } - - public void UnloadScene(ILoadSceneInfo sceneInfo) - { - UnloadSceneAsync(sceneInfo); - } - - public void LoadScenes(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1) - { - LoadScenesAsync(sceneInfos, setIndexActive); - } - - public void LoadScene(ILoadSceneInfo sceneInfo, bool setActive = false) - { - LoadSceneAsync(sceneInfo, setActive); - } - - public UniTask TransitionToScenesAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return _sceneLoaderAsync.TransitionToScenesAsync(targetScenes, setIndexActive, intermediateSceneReference).AsTask().AsUniTask(); - } - - public UniTask TransitionToSceneAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = null) - { - return _sceneLoaderAsync.TransitionToSceneAsync(targetSceneReference, intermediateSceneReference).AsTask().AsUniTask(); - } - - public UniTask TransitionToScenesFromScenesAsync(ILoadSceneInfo[] targetScenes, ILoadSceneInfo[] fromScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return _sceneLoaderAsync.TransitionToScenesFromScenesAsync(targetScenes, fromScenes, setIndexActive, intermediateSceneReference).AsTask().AsUniTask(); - } - - public UniTask TransitionToSceneFromScenesAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo[] fromScenes, ILoadSceneInfo intermediateSceneReference = null) - { - return _sceneLoaderAsync.TransitionToSceneFromScenesAsync(targetSceneReference, fromScenes, intermediateSceneReference).AsTask().AsUniTask(); - } - - public UniTask TransitionToScenesFromAllAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = null) - { - return _sceneLoaderAsync.TransitionToScenesFromAllAsync(targetScenes, setIndexActive, intermediateSceneReference).AsTask().AsUniTask(); - } - - public UniTask TransitionToSceneFromAllAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = null) - { - return _sceneLoaderAsync.TransitionToSceneFromAllAsync(targetSceneReference, intermediateSceneReference).AsTask().AsUniTask(); - } - - public UniTask UnloadScenesAsync(ILoadSceneInfo[] sceneReferences) - { - return _sceneLoaderAsync.UnloadScenesAsync(sceneReferences).AsTask().AsUniTask(); - } - - public UniTask UnloadSceneAsync(ILoadSceneInfo sceneReference) - { - return _sceneLoaderAsync.UnloadSceneAsync(sceneReference).AsTask().AsUniTask(); - } - - public UniTask LoadScenesAsync(ILoadSceneInfo[] sceneReferences, int setIndexActive = -1, IProgress progress = null) - { - return _sceneLoaderAsync.LoadScenesAsync(sceneReferences, setIndexActive, progress).AsTask().AsUniTask(); - } - - public UniTask LoadSceneAsync(ILoadSceneInfo sceneReference, bool setActive = false, IProgress progress = null) - { - return _sceneLoaderAsync.LoadSceneAsync(sceneReference, setActive, progress).AsTask().AsUniTask(); - } - - public override string ToString() - { - return $"Scene Loader [UniTask] with {_sceneLoaderAsync.Manager.GetType().Name}"; - } - } -} -#endif \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderUniTask.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderUniTask.cs.meta deleted file mode 100644 index f3e3e4c0..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderUniTask.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3cc4fc000345d644c8e1deeafaca3961 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationAddressable.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationAddressable.cs index 2bbc3f7b..47b87fcb 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationAddressable.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationAddressable.cs @@ -7,15 +7,17 @@ namespace MyGameDevTools.SceneLoading { /// - /// Struct to implement with the addressable . + /// Implementation of with the addressable . /// - public readonly struct AsyncSceneOperationAddressable : IAsyncSceneOperation + public class AsyncSceneOperationAddressable : IAsyncSceneOperation { - public readonly float Progress => _asyncOperationHandle.PercentComplete; + public event Action Completed; - public readonly bool IsDone => _asyncOperationHandle.IsDone; + public float Progress => _asyncOperationHandle.PercentComplete; - public readonly bool HasDirectReferenceToScene => true; + public bool IsDone => _asyncOperationHandle.IsDone; + + public bool HasDirectReferenceToScene => true; public AsyncOperationHandle AsyncOperationHandle => _asyncOperationHandle; @@ -27,6 +29,7 @@ public AsyncSceneOperationAddressable(AsyncOperationHandle operat throw new ArgumentException($"Cannot create a {nameof(AsyncSceneOperationAddressable)} from an invalid AsyncOperationHandle.", nameof(operationHandle)); _asyncOperationHandle = operationHandle; + _asyncOperationHandle.CompletedTypeless += OnAsyncOperationCompleted; } public Scene GetResult() @@ -38,6 +41,12 @@ public Scene GetResult() return _asyncOperationHandle.Result.Scene; } + + void OnAsyncOperationCompleted(AsyncOperationHandle asyncOperation) + { + _asyncOperationHandle.CompletedTypeless -= OnAsyncOperationCompleted; + Completed?.Invoke(); + } } } #endif \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationStandard.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationStandard.cs index 54f259c9..708eca9c 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationStandard.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/AsyncSceneOperationStandard.cs @@ -5,21 +5,24 @@ namespace MyGameDevTools.SceneLoading { /// - /// Struct to implement with the non-addressable . + /// Implementation of with the non-addressable . /// - public readonly struct AsyncSceneOperationStandard : IAsyncSceneOperation + public class AsyncSceneOperationStandard : IAsyncSceneOperation { - public readonly float Progress => _asyncOperation.progress; + public event Action Completed; - public readonly bool IsDone => _asyncOperation.isDone; + public float Progress => _asyncOperation.progress; - public readonly bool HasDirectReferenceToScene => false; + public bool IsDone => _asyncOperation.isDone; + + public bool HasDirectReferenceToScene => false; readonly AsyncOperation _asyncOperation; public AsyncSceneOperationStandard(AsyncOperation operation) { _asyncOperation = operation ?? throw new ArgumentException($"Cannot create a {nameof(AsyncSceneOperationStandard)} without a valid AsyncOperation instance.", nameof(operation)); + _asyncOperation.completed += OnAsyncOperationCompleted; } public Scene GetResult() @@ -27,5 +30,11 @@ public Scene GetResult() Debug.LogWarning($"{nameof(AsyncSceneOperationStandard)} cannot link directly to the loaded scene due to SceneManager API limitations."); return default; } + + void OnAsyncOperationCompleted(AsyncOperation asyncOperation) + { + _asyncOperation.completed -= OnAsyncOperationCompleted; + Completed?.Invoke(); + } } } \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/LoadSceneInfoName.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/LoadSceneInfoName.cs index 28244388..65874b03 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/LoadSceneInfoName.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/LoadSceneInfoName.cs @@ -18,7 +18,7 @@ namespace MyGameDevTools.SceneLoading /// Creates a new based on the scene's name or path. /// The scene must be added to the Build Settings in order to be loaded. ///
- /// `The scene's asset name or path, as displayed in the Build Settings window. + /// The scene's asset name or path, as displayed in the Build Settings window. public LoadSceneInfoName(string sceneNameOrPath) { if (string.IsNullOrWhiteSpace(sceneNameOrPath)) diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataAddressable.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataAddressable.cs index 821c8e9d..cf97d0f9 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataAddressable.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataAddressable.cs @@ -52,6 +52,15 @@ public void UpdateSceneReference() _sceneReference = AsyncOperation.GetResult(); } + public bool MatchesLoadSceneInfo(ILoadSceneInfo loadSceneInfo) + { + return loadSceneInfo.Type switch + { + LoadSceneInfoType.AssetReference or LoadSceneInfoType.Address => loadSceneInfo.Equals(_loadSceneInfo), + _ => loadSceneInfo.CanBeReferenceToScene(_sceneReference), + }; + } + public IAsyncSceneOperation LoadSceneAsync() { switch (_loadSceneInfo.Type) diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataStandard.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataStandard.cs index 67340fe8..6f7ff868 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataStandard.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneDataStandard.cs @@ -65,6 +65,11 @@ public void UpdateSceneReference() Debug.LogWarning($"[{nameof(SceneDataStandard)}] This type of scene data should not have its scene set automatically. Instead, it is expected to set it by calling {nameof(ISceneData.SetSceneReferenceManually)}."); } + public bool MatchesLoadSceneInfo(ILoadSceneInfo loadSceneInfo) + { + return loadSceneInfo.CanBeReferenceToScene(_sceneReference); + } + public IAsyncSceneOperation LoadSceneAsync() { switch (_loadSceneInfo.Type) diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneParameters.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneParameters.cs new file mode 100644 index 00000000..17f31de0 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneParameters.cs @@ -0,0 +1,45 @@ +namespace MyGameDevTools.SceneLoading +{ + public readonly struct SceneParameters + { + public readonly int Length => _loadSceneInfoArray.Length; + + readonly ILoadSceneInfo[] _loadSceneInfoArray; + readonly ILoadSceneInfo _singleLoadSceneInfo; + readonly int _setIndexActive; + + public SceneParameters(ILoadSceneInfo[] loadSceneInfos, int setIndexActive = -1) + { + _loadSceneInfoArray = loadSceneInfos; + _singleLoadSceneInfo = loadSceneInfos[0]; + _setIndexActive = setIndexActive; + } + + public SceneParameters(ILoadSceneInfo loadSceneInfo, bool setActive = false) + { + _loadSceneInfoArray = new ILoadSceneInfo[] { loadSceneInfo }; + _singleLoadSceneInfo = loadSceneInfo; + _setIndexActive = setActive ? 0 : -1; + } + + public readonly ILoadSceneInfo GetLoadSceneInfo() + { + return _singleLoadSceneInfo; + } + + public readonly ILoadSceneInfo[] GetLoadSceneInfos() + { + return _loadSceneInfoArray; + } + + public readonly bool ShouldSetActive() + { + return _setIndexActive >= 0; + } + + public readonly int GetIndexToActivate() + { + return _setIndexActive; + } + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneParameters.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneParameters.cs.meta new file mode 100644 index 00000000..a472d7fc --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneParameters.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 701953da3da98e54184827cc246e10c6 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneResult.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneResult.cs new file mode 100644 index 00000000..38cdfc96 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneResult.cs @@ -0,0 +1,47 @@ +using System.Linq; +using UnityEngine.SceneManagement; + +namespace MyGameDevTools.SceneLoading +{ + public readonly struct SceneResult + { + readonly Scene[] _sceneArray; + readonly Scene _singleScene; + + public SceneResult(Scene[] sceneArray) + { + if (sceneArray == null || sceneArray.Length == 0) + throw new System.ArgumentException("Cannot create a `SceneResult` struct out of a null or empty scene array.", nameof(sceneArray)); + + _sceneArray = sceneArray; + _singleScene = sceneArray[0]; + } + + public SceneResult(Scene scene) + { + _sceneArray = new[] { scene }; + _singleScene = scene; + } + + public readonly Scene GetScene() + { + return _singleScene; + } + + public readonly Scene[] GetScenes() + { + return _sceneArray; + } + + public static implicit operator Scene(SceneResult sceneResult) => sceneResult.GetScene(); + public static implicit operator Scene[](SceneResult sceneResult) => sceneResult.GetScenes(); + + public override string ToString() + { + if (!_singleScene.IsValid()) + return "Empty SceneResult"; + + return $"{{ {string.Join(", ", _sceneArray.Select(scene => scene.name))} }}"; + } + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneResult.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneResult.cs.meta new file mode 100644 index 00000000..adfdff51 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Structs/SceneResult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: aa1ed57359c7aa74a927bc6940b5e68a \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneDataUtilities.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneDataUtilities.cs index a37339db..4dc8c59f 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneDataUtilities.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneDataUtilities.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Text; using UnityEngine; using UnityEngine.SceneManagement; -using UnitySceneManager = UnityEngine.SceneManagement.SceneManager; namespace MyGameDevTools.SceneLoading { @@ -22,13 +20,13 @@ public static class SceneDataUtilities public static void LinkLoadedScenesWithSceneDataArray(ISceneData[] sceneDataArray, IList sceneDatasToExclude) { // Fill this list with all loaded scenes from the Unity Scene Manager; - int totalSceneCount = UnitySceneManager.sceneCount; + int totalSceneCount = SceneManager.sceneCount; List unmatchedScenes = new(totalSceneCount); int i; for (i = 0; i < totalSceneCount; i++) { - Scene scene = UnitySceneManager.GetSceneAt(i); + Scene scene = SceneManager.GetSceneAt(i); if (scene.isLoaded) unmatchedScenes.Add(scene); } @@ -159,22 +157,21 @@ public static bool TryLinkLoadedSceneWithSceneData(Scene scene, IList /// Tries to get an from a collection of s that match the given . /// - public static bool TryGetSceneDataByLoadSceneInfo(ILoadSceneInfo loadSceneInfo, ICollection sceneDataList, out ISceneData sceneData) + public static bool TryGetSceneDataByLoadSceneInfo(ILoadSceneInfo loadSceneInfo, IEnumerable sceneDataList, out ISceneData sceneData) { if (loadSceneInfo == null) throw new ArgumentNullException(nameof(loadSceneInfo)); foreach (ISceneData tempSceneData in sceneDataList) { - if ((loadSceneInfo.Type == LoadSceneInfoType.SceneHandle && tempSceneData.SceneReference == (Scene)loadSceneInfo.Reference) - || tempSceneData.LoadSceneInfo.Equals(loadSceneInfo)) + if (tempSceneData.MatchesLoadSceneInfo(loadSceneInfo)) { sceneData = tempSceneData; return true; } } - Debug.LogWarning($"Unable to get an {nameof(ISceneData)} with the load scene info {loadSceneInfo}."); + Debug.LogWarning($"Unable to get an {nameof(ISceneData)} with the load scene info {loadSceneInfo}. Is the scene loaded?"); sceneData = default; return false; } diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneManagerExtensions.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneManagerExtensions.cs new file mode 100644 index 00000000..00fce7aa --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneManagerExtensions.cs @@ -0,0 +1,637 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +#if ENABLE_ADDRESSABLES +using UnityEngine.AddressableAssets; +#endif +using UnityEngine.SceneManagement; + +namespace MyGameDevTools.SceneLoading +{ + public static class SceneManagerExtensions + { + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' names. + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(this ISceneManager sceneManager, string[] sceneNames, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = sceneNames.Select(name => (ILoadSceneInfo)new LoadSceneInfoName(name)).ToArray(); + SceneParameters sceneParams = new(sceneInfos, setIndexActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' build indexes. + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(this ISceneManager sceneManager, int[] buildIndices, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = buildIndices.Select(index => (ILoadSceneInfo)new LoadSceneInfoIndex(index)).ToArray(); + SceneParameters sceneParams = new(sceneInfos, setIndexActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's name. + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(this ISceneManager sceneManager, string sceneName, bool setActive = false, IProgress progress = null, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoName(sceneName), setActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's build index. + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAsync(this ISceneManager sceneManager, int buildIndex, bool setActive = false, IProgress progress = null, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoIndex(buildIndex), setActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + +#if ENABLE_ADDRESSABLES + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' . + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(this ISceneManager sceneManager, AssetReference[] assetReferences, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = assetReferences.Select(asset => (ILoadSceneInfo)new LoadSceneInfoAssetReference(asset)).ToArray(); + SceneParameters sceneParams = new(sceneInfos, setIndexActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + + /// + /// Loads the target scenes. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scenes' addressable address. + /// + /// + /// The index of the scene to be set active, or -1 if none. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(this ISceneManager sceneManager, string[] addresses, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = addresses.Select(address => (ILoadSceneInfo)new LoadSceneInfoAddress(address)).ToArray(); + SceneParameters sceneParams = new(sceneInfos, setIndexActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's . + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(this ISceneManager sceneManager, AssetReference assetReference, bool setActive = false, IProgress progress = null, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoAssetReference(assetReference), setActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } + + /// + /// Loads the target scene. + /// You may also provide the desired index to set as the active scene. + /// Also, you can pass an object to receive the average progress of all loading operations, from 0 to 1. + /// + /// + /// The target scene's addressable address. + /// + /// + /// If the scene should be activated after load. + /// + /// + /// Object to report the loading operations progress to, from 0 to 1. + /// + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all scenes loaded. + public static Task LoadAddressableAsync(this ISceneManager sceneManager, string address, bool setActive = false, IProgress progress = null, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoAddress(address), setActive); + return sceneManager.LoadAsync(sceneParams, progress, token); + } +#endif + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their names to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(this ISceneManager sceneManager, string[] targetSceneNames, string loadingSceneName = null, int setIndexActive = 0, CancellationToken token = default) + { + SceneParameters targetParams = new(targetSceneNames.Select(name => (ILoadSceneInfo)new LoadSceneInfoName(name)).ToArray(), setIndexActive); + ILoadSceneInfo loadingSceneInfo = string.IsNullOrWhiteSpace(loadingSceneName) ? null : new LoadSceneInfoName(loadingSceneName); + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their build index to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(this ISceneManager sceneManager, int[] targetBuildIndices, int loadingBuildIndex = -1, int setIndexActive = 0, CancellationToken token = default) + { + SceneParameters targetParams = new(targetBuildIndices.Select(index => (ILoadSceneInfo)new LoadSceneInfoIndex(index)).ToArray(), setIndexActive); + ILoadSceneInfo loadingSceneInfo = loadingBuildIndex >= 0 ? new LoadSceneInfoIndex(loadingBuildIndex) : null; + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene name to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(this ISceneManager sceneManager, string targetSceneName, string loadingSceneName = null, CancellationToken token = default) + { + SceneParameters targetParams = new(new LoadSceneInfoName(targetSceneName), true); + ILoadSceneInfo loadingSceneInfo = string.IsNullOrWhiteSpace(loadingSceneName) ? null : new LoadSceneInfoName(loadingSceneName); + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene build index to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If -1, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAsync(this ISceneManager sceneManager, int targetBuildIndex, int loadingBuildIndex = -1, CancellationToken token = default) + { + SceneParameters targetParams = new(new LoadSceneInfoIndex(targetBuildIndex), true); + ILoadSceneInfo loadingSceneInfo = loadingBuildIndex >= 0 ? new LoadSceneInfoIndex(loadingBuildIndex) : null; + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + +#if ENABLE_ADDRESSABLES + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(this ISceneManager sceneManager, AssetReference[] targetAssetReferences, AssetReference loadingAssetReference = null, int setIndexActive = 0, CancellationToken token = default) + { + SceneParameters targetParams = new(targetAssetReferences.Select(asset => (ILoadSceneInfo)new LoadSceneInfoAssetReference(asset)).ToArray(), setIndexActive); + ILoadSceneInfo loadingSceneInfo = loadingAssetReference != null ? new LoadSceneInfoAssetReference(loadingAssetReference) : null; + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + + /// + /// Triggers a transition to a group of scenes. + /// It will transition from the current active scene () + /// to a group of scenes, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// An array of scenes by their addressable addresses to transition to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// + /// The index of the scene to be activated as the active scene. It must be greater than or equal 0. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(this ISceneManager sceneManager, string[] targetAddresses, string loadingAddress = null, int setIndexActive = 0, CancellationToken token = default) + { + SceneParameters targetParams = new(targetAddresses.Select(address => (ILoadSceneInfo)new LoadSceneInfoAddress(address)).ToArray(), setIndexActive); + ILoadSceneInfo loadingSceneInfo = string.IsNullOrWhiteSpace(loadingAddress) ? null : new LoadSceneInfoAddress(loadingAddress); + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(this ISceneManager sceneManager, AssetReference targetAssetReference, AssetReference loadingAssetReference = null, CancellationToken token = default) + { + SceneParameters targetParams = new(new LoadSceneInfoAssetReference(targetAssetReference), true); + ILoadSceneInfo loadingSceneInfo = loadingAssetReference != null ? new LoadSceneInfoAssetReference(loadingAssetReference) : null; + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } + + /// + /// Triggers a transition to the target scene. + /// It will transition from the current active scene () + /// to the target scene, with an optional . + /// If the is not set, the transition will have no intermediate loading scene and will instead simply load the target scene directly. + /// The complete transition flow is: + ///

+ /// 1. Load the intermediate scene (if provided).
+ /// 2. Unload the source scene (if any).
+ /// 3. Load all target scenes.
+ /// 4. Unload the intermediate scene (if provided).
+ ///
+ /// + /// The target scene addressable address to be transitioned to. + /// + /// + /// A reference to the scene that's going to be loaded as the transition intermediate (as a loading scene). + /// If null, the transition will not have an intermediate loading scene. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// A with all scenes loaded. + public static Task TransitionAddressableAsync(this ISceneManager sceneManager, string targetAddress, string loadingAddress = null, CancellationToken token = default) + { + SceneParameters targetParams = new(new LoadSceneInfoAddress(targetAddress), true); + ILoadSceneInfo loadingSceneInfo = string.IsNullOrWhiteSpace(loadingAddress) ? null : new LoadSceneInfoAddress(loadingAddress); + return sceneManager.TransitionAsync(targetParams, loadingSceneInfo, token); + } +#endif + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes by their names to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(this ISceneManager sceneManager, string[] sceneNames, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = sceneNames.Select(name => (ILoadSceneInfo)new LoadSceneInfoName(name)).ToArray(); + SceneParameters sceneParams = new(sceneInfos); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes by their build index to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(this ISceneManager sceneManager, int[] buildIndices, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = buildIndices.Select(index => (ILoadSceneInfo)new LoadSceneInfoIndex(index)).ToArray(); + SceneParameters sceneParams = new(sceneInfos); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(this ISceneManager sceneManager, Scene[] scenes, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = scenes.Select(scene => (ILoadSceneInfo)new LoadSceneInfoScene(scene)).ToArray(); + SceneParameters sceneParams = new(sceneInfos); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's name to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(this ISceneManager sceneManager, string sceneName, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoName(sceneName)); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's build index to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(this ISceneManager sceneManager, int buildIndex, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoIndex(buildIndex)); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAsync(this ISceneManager sceneManager, Scene scene, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoScene(scene)); + return sceneManager.UnloadAsync(sceneParams, token); + } + +#if ENABLE_ADDRESSABLES + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(this ISceneManager sceneManager, AssetReference[] assetReferences, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = assetReferences.Select(asset => (ILoadSceneInfo)new LoadSceneInfoAssetReference(asset)).ToArray(); + SceneParameters sceneParams = new(sceneInfos); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// An array of scenes to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(this ISceneManager sceneManager, string[] addresses, CancellationToken token = default) + { + ILoadSceneInfo[] sceneInfos = addresses.Select(address => (ILoadSceneInfo)new LoadSceneInfoAddress(address)).ToArray(); + SceneParameters sceneParams = new(sceneInfos); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(this ISceneManager sceneManager, AssetReference assetReference, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoAssetReference(assetReference)); + return sceneManager.UnloadAsync(sceneParams, token); + } + + /// + /// Unloads the target scene or group of scenes. + /// + /// + /// The target scene's addressable address to be unloaded. + /// + /// Optional token to manually cancel the operation. Note that Unity Scene Manager operations cannot be manually canceled and will continue to run. + /// + /// A with all the unloaded scenes. + ///
+ /// Note that in some cases, the returned scenes might no longer have a reference to its native representation, hich means its will not point anywhere and you won't be able to perform equal comparisons between scenes. + ///
+ public static Task UnloadAddressableAsync(this ISceneManager sceneManager, string address, CancellationToken token = default) + { + SceneParameters sceneParams = new(new LoadSceneInfoAddress(address)); + return sceneManager.UnloadAsync(sceneParams, token); + } +#endif + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneManagerExtensions.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneManagerExtensions.cs.meta new file mode 100644 index 00000000..c0c333f4 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/SceneManagerExtensions.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c265d6fdb2414f84b9e8780dc6f07a09 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/TaskExtensions.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/TaskExtensions.cs index 6e350df1..4973aefd 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/TaskExtensions.cs +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/TaskExtensions.cs @@ -1,4 +1,3 @@ -using System; using System.Threading; using System.Threading.Tasks; @@ -6,25 +5,7 @@ namespace MyGameDevTools.SceneLoading { public static class TaskExtensions { - public static async void Forget(this Task task, Action onException = null) - { - try - { - await task; - } - catch (Exception exception) - { - if (onException == null) - throw exception; - - onException(exception); - } - } - } - - public static class ValueTaskExtensions - { - public static async ValueTask RunAndDisposeToken(this ValueTask valueTask, CancellationTokenSource tokenSource) + public static async Task RunAndDisposeToken(this Task valueTask, CancellationTokenSource tokenSource) { try { @@ -36,19 +17,9 @@ public static async ValueTask RunAndDisposeToken(this ValueTask valueTa } } - public static async void Forget(this ValueTask valueTask, Action onException = null) + public static WaitTask ToWaitTask(this Task task) { - try - { - await valueTask; - } - catch (Exception exception) - { - if (onException == null) - throw exception; - - onException(exception); - } + return new WaitTask(task); } } } \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/UnityTaskUtilities.cs b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/UnityTaskUtilities.cs new file mode 100644 index 00000000..623a34c9 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/UnityTaskUtilities.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.LowLevel; + +namespace MyGameDevTools.SceneLoading +{ + public static class UnityTaskUtilities + { + static Queue Actions; + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + static void HookToPlayerLoop() + { +#if UNITY_EDITOR && UNITY_2019_3_OR_NEWER + bool domainReloadDisabled = UnityEditor.EditorSettings.enterPlayModeOptionsEnabled && UnityEditor.EditorSettings.enterPlayModeOptions.HasFlag(UnityEditor.EnterPlayModeOptions.DisableDomainReload); + if (!domainReloadDisabled && Actions != null) + return; +#else + if (Actions != null) + return; +#endif + + Actions = new Queue(16); + PlayerLoopSystem playerLoop = PlayerLoop.GetCurrentPlayerLoop(); + List updatedSystems = new(playerLoop.subSystemList) + { + new PlayerLoopSystem + { + type = typeof(UnityTaskUtilities), + updateDelegate = ProcessMainThreadQueue + } + }; + + playerLoop.subSystemList = updatedSystems.ToArray(); + PlayerLoop.SetPlayerLoop(playerLoop); + } + + public static Task FromAsyncOperation(IAsyncSceneOperation asyncSceneOperation, CancellationToken token = default) + { + TaskCompletionSource tcs = new(); + + token.Register(() => + { + if (!tcs.Task.IsCompleted) + { + tcs.TrySetCanceled(token); + } + }); + + Enqueue(() => + { + if (tcs.Task.IsCanceled || tcs.Task.IsFaulted) + return; + + if (asyncSceneOperation.IsDone) + { + tcs.SetResult(true); + return; + } + + asyncSceneOperation.Completed += () => + { + tcs.TrySetResult(true); + }; + }); + + return tcs.Task; + } + + static void Enqueue(Action action) + { + lock (Actions) + { + Actions.Enqueue(action); + } + } + + static void ProcessMainThreadQueue() + { + lock (Actions) + { + while (Actions.TryDequeue(out Action action)) + { + action.Invoke(); + } + } + } + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/UnityTaskUtilities.cs.meta b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/UnityTaskUtilities.cs.meta new file mode 100644 index 00000000..f5824d8c --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Runtime/Utilities/UnityTaskUtilities.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ee47331024b569f45b526a646a9a6013 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples.meta b/Packages/com.mygamedevtools.scene-loader/Samples.meta new file mode 100644 index 00000000..0145eef9 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b738b42e1c3b1e49a5ef19b61ab1dbc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples.meta new file mode 100644 index 00000000..ade1f30a --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 574ec9c3c6b56cc428f3d5835792b527 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations.meta new file mode 100644 index 00000000..068dd27f --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b3337ce63c299a149aa0769c2d973f1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated.meta new file mode 100644 index 00000000..00bbb5c9 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c6ccf37b0b034444803177e80e2ccf4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/AC_LoadingAnimated.controller b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/AC_LoadingAnimated.controller new file mode 100644 index 00000000..7daa33a6 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/AC_LoadingAnimated.controller @@ -0,0 +1,211 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-8902521949079758999 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Close + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 4225177938088309335} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: c65db23636309ad42add4cfc8790375c, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-5945705694347017557 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle Opened + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 8348283624186510602} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: a2bbef94a5f31e5418bf4f78cb08a7da, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-5840351763902026485 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -5945705694347017557} + m_Position: {x: 30, y: 170, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8902521949079758999} + m_Position: {x: 30, y: 230, z: 0} + - serializedVersion: 1 + m_State: {fileID: 6396143234028859413} + m_Position: {x: 30, y: 290, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 260, y: 230, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 50, y: 350, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -5945705694347017557} +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AC_LoadingAnimated + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: IsOpen + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 1 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -5840351763902026485} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1101 &1637934215790774671 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 0} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 1 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 1 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &4225177938088309335 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsOpen + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 6396143234028859413} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.5 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &6396143234028859413 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Open + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1637934215790774671} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 81e15d35e1c54a4498be0e2469bbd354, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &8348283624186510602 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsOpen + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8902521949079758999} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/AC_LoadingAnimated.controller.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/AC_LoadingAnimated.controller.meta new file mode 100644 index 00000000..c265338d --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/AC_LoadingAnimated.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 400552a45bd9bf845a6dc65a0b80efe7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Close.anim b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Close.anim new file mode 100644 index 00000000..56cf1786 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Close.anim @@ -0,0 +1,198 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LoadingAnimated@Close + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.081082456 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Left + classID: 224 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.07207202 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Right + classID: 224 + script: {fileID: 0} + flags: 0 + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 856533603 + attribute: 1460864421 + script: {fileID: 0} + typeID: 224 + customType: 28 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 592561873 + attribute: 1460864421 + script: {fileID: 0} + typeID: 224 + customType: 28 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.5 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.081082456 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Left + classID: 224 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.5 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.07207202 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Right + classID: 224 + script: {fileID: 0} + flags: 0 + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: + - time: 0.5 + functionName: InTransitionTrigger + data: + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Close.anim.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Close.anim.meta new file mode 100644 index 00000000..16d3dede --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Close.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c65db23636309ad42add4cfc8790375c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Idle_Opened.anim b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Idle_Opened.anim new file mode 100644 index 00000000..34dddcd4 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Idle_Opened.anim @@ -0,0 +1,191 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LoadingAnimated@Idle_Opened + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.016666668 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Left + classID: 224 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.016666668 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Right + classID: 224 + script: {fileID: 0} + flags: 0 + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 856533603 + attribute: 1460864421 + script: {fileID: 0} + typeID: 224 + customType: 28 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 592561873 + attribute: 1460864421 + script: {fileID: 0} + typeID: 224 + customType: 28 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.016666668 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.016666668 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Left + classID: 224 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 0.016666668 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Right + classID: 224 + script: {fileID: 0} + flags: 0 + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Idle_Opened.anim.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Idle_Opened.anim.meta new file mode 100644 index 00000000..f245a3c9 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Idle_Opened.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a2bbef94a5f31e5418bf4f78cb08a7da +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Open.anim b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Open.anim new file mode 100644 index 00000000..10055d07 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Open.anim @@ -0,0 +1,198 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: LoadingAnimated@Open + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.081082456 + - serializedVersion: 3 + time: 0.5 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Left + classID: 224 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.07207202 + - serializedVersion: 3 + time: 0.5 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Right + classID: 224 + script: {fileID: 0} + flags: 0 + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 856533603 + attribute: 1460864421 + script: {fileID: 0} + typeID: 224 + customType: 28 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 592561873 + attribute: 1460864421 + script: {fileID: 0} + typeID: 224 + customType: 28 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 0.5 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.081082456 + - serializedVersion: 3 + time: 0.5 + value: -1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Left + classID: 224 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.07207202 + - serializedVersion: 3 + time: 0.5 + value: 1140 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_AnchoredPosition.x + path: Panel_Right + classID: 224 + script: {fileID: 0} + flags: 0 + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: + - time: 0.5 + functionName: OutTransitionTrigger + data: + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Open.anim.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Open.anim.meta new file mode 100644 index 00000000..95fd065a --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Animations/Loading_Animated/LoadingAnimated@Open.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 81e15d35e1c54a4498be0e2469bbd354 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials.meta new file mode 100644 index 00000000..9bef01c0 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 41c7267c0bf76d147ae0e2988ffd7a7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Barrel.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Barrel.mat new file mode 100644 index 00000000..777e4e08 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Barrel.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: M_Barrel + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _GLOSSYREFLECTIONS_OFF + - _SPECULARHIGHLIGHTS_OFF + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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.75 + - _GlossyReflections: 0 + - _Metallic: 0.8 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.8584906, g: 0.25597787, b: 0.20652366, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Barrel.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Barrel.mat.meta new file mode 100644 index 00000000..c900f6fe --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Barrel.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c7fa4d47884e65f4da8abc72e5dcb96a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Box.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Box.mat new file mode 100644 index 00000000..02870cc8 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Box.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: M_Box + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _GLOSSYREFLECTIONS_OFF + - _SPECULARHIGHLIGHTS_OFF + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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.05 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.675, g: 0.45245868, b: 0.22004999, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Box.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Box.mat.meta new file mode 100644 index 00000000..941308cc --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Box.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2cae1f6280e4f78409eeb7d01a1ab00b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Floor.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Floor.mat new file mode 100644 index 00000000..22a58f77 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Floor.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: M_Floor + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _GLOSSYREFLECTIONS_OFF + - _SPECULARHIGHLIGHTS_OFF + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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.05 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.254717, g: 0.254717, b: 0.254717, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Floor.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Floor.mat.meta new file mode 100644 index 00000000..8fd8f123 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Floor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3914cfcf95c8d774eaa76b1757b28bcf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Night.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Night.mat new file mode 100644 index 00000000..e5613227 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Night.mat @@ -0,0 +1,92 @@ +%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: M_Night + m_Shader: {fileID: 106, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _SUNDISK_HIGH_QUALITY + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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: + - _AtmosphereThickness: 3.5 + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Exposure: 0.5 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SunDisk: 2 + - _SunSize: 0.04 + - _SunSizeConvergence: 5 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _GroundColor: {r: 0.369, g: 0.349, b: 0.341, a: 1} + - _SkyTint: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Night.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Night.mat.meta new file mode 100644 index 00000000..eec3dc97 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Night.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 162b48961309d454ba4e0118c646ecca +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall.mat new file mode 100644 index 00000000..35edb4c3 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall.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: M_Wall + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _GLOSSYREFLECTIONS_OFF + - _SPECULARHIGHLIGHTS_OFF + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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.05 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.85, g: 0.85, b: 0.85, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall.mat.meta new file mode 100644 index 00000000..af4b7a51 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cdeb3ffd55a633049ae8eb687ee518f1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_A.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_A.mat new file mode 100644 index 00000000..ed8626e8 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_A.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: M_Wall_A + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _GLOSSYREFLECTIONS_OFF + - _SPECULARHIGHLIGHTS_OFF + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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.05 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 0.32941177, b: 0.64, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_A.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_A.mat.meta new file mode 100644 index 00000000..4306376a --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_A.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 24fbfe448e3667a48af7eddd9ccffbf6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_B.mat b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_B.mat new file mode 100644 index 00000000..424e55e3 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_B.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: M_Wall_B + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _GLOSSYREFLECTIONS_OFF + - _SPECULARHIGHLIGHTS_OFF + m_InvalidKeywords: [] + m_LightmapFlags: 4 + 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: 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.05 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.23921569, g: 0.72156864, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_B.mat.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_B.mat.meta new file mode 100644 index 00000000..9c920385 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Materials/M_Wall_B.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 33b2ce6d53c5e8947a553e4540a27b13 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes.meta new file mode 100644 index 00000000..48e03c14 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0305f3c245e40c54eaed1031e3027009 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Animated.unity b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Animated.unity new file mode 100644 index 00000000..8de01d4d --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Animated.unity @@ -0,0 +1,678 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &452422791 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 452422792} + - component: {fileID: 452422794} + - component: {fileID: 452422793} + m_Layer: 5 + m_Name: Panel_Right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &452422792 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 452422791} + 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: 1 + m_Children: + - {fileID: 1013596372} + - {fileID: 825098956} + m_Father: {fileID: 1076835549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 780, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &452422793 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 452422791} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23921569, g: 0.72156864, 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_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &452422794 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 452422791} + m_CullTransparentMesh: 1 +--- !u!1 &825098955 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 825098956} + - component: {fileID: 825098959} + - component: {fileID: 825098958} + - component: {fileID: 825098957} + m_Layer: 5 + m_Name: Text_Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &825098956 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825098955} + 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: 1 + m_Children: [] + m_Father: {fileID: 452422792} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -48, y: 48} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0} +--- !u!114 &825098957 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825098955} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &825098958 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825098955} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 3 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 2 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Now Loading... +--- !u!222 &825098959 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825098955} + m_CullTransparentMesh: 1 +--- !u!1 &992510978 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 992510979} + - component: {fileID: 992510981} + - component: {fileID: 992510980} + m_Layer: 5 + m_Name: Triangle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &992510979 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 992510978} + 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: 1 + m_Children: [] + m_Father: {fileID: 1676133489} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 360, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &992510980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 992510978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.32941177, b: 0.6392157, 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_Sprite: {fileID: 21300000, guid: 79a6fde258d0ee447a881166e6ecadea, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &992510981 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 992510978} + m_CullTransparentMesh: 1 +--- !u!1 &1013596371 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1013596372} + - component: {fileID: 1013596374} + - component: {fileID: 1013596373} + m_Layer: 5 + m_Name: Triangle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1013596372 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013596371} + 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: 1 + m_Children: [] + m_Father: {fileID: 452422792} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 360, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1013596373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013596371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23921569, g: 0.72156864, 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_Sprite: {fileID: 21300000, guid: 893a1f4488cb89d4c84df8bece4201be, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1013596374 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1013596371} + m_CullTransparentMesh: 1 +--- !u!1 &1076835545 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1076835549} + - component: {fileID: 1076835548} + - component: {fileID: 1076835547} + - component: {fileID: 1076835546} + - component: {fileID: 1076835550} + - component: {fileID: 1076835551} + - component: {fileID: 1076835552} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1076835546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1076835547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 2 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1076835548 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 10 + m_TargetDisplay: 0 +--- !u!224 &1076835549 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 1676133489} + - {fileID: 452422792} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1076835550 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c075a502fec352044ac850b2ac556afe, type: 3} + m_Name: + m_EditorClassIdentifier: + waitForScriptedStart: 1 + waitForScriptedEnd: 1 +--- !u!95 &1076835551 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 400552a45bd9bf845a6dc65a0b80efe7, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &1076835552 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1076835545} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86412405a5b304e44bcea539864a36ab, type: 3} + m_Name: + m_EditorClassIdentifier: + _loadingBehavior: {fileID: 1076835550} +--- !u!1 &1676133488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1676133489} + - component: {fileID: 1676133491} + - component: {fileID: 1676133490} + m_Layer: 5 + m_Name: Panel_Left + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1676133489 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1676133488} + 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: 1 + m_Children: + - {fileID: 992510979} + m_Father: {fileID: 1076835549} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 780, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1676133490 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1676133488} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.32941177, b: 0.6392157, 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_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1676133491 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1676133488} + m_CullTransparentMesh: 1 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1076835549} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Animated.unity.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Animated.unity.meta new file mode 100644 index 00000000..16aa8969 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Animated.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3dac14043db22ff4899bdb4d66c2d448 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Custom.unity b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Custom.unity new file mode 100644 index 00000000..51c26f7b --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Custom.unity @@ -0,0 +1,833 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &203667518 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 203667522} + - component: {fileID: 203667521} + - component: {fileID: 203667520} + - component: {fileID: 203667519} + - component: {fileID: 203667523} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &203667519 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203667518} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &203667520 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203667518} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 2 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &203667521 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203667518} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 10 + m_TargetDisplay: 0 +--- !u!224 &203667522 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203667518} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 531249905} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &203667523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203667518} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c075a502fec352044ac850b2ac556afe, type: 3} + m_Name: + m_EditorClassIdentifier: + waitForScriptedStart: 1 + waitForScriptedEnd: 1 +--- !u!1 &350044371 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 350044372} + - component: {fileID: 350044374} + - component: {fileID: 350044373} + - component: {fileID: 350044375} + m_Layer: 5 + m_Name: Clock + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &350044372 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350044371} + 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: 1 + m_Children: + - {fileID: 1773217052} + - {fileID: 1993542208} + m_Father: {fileID: 531249905} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -48, y: 48} + m_SizeDelta: {x: 192, y: 192} + m_Pivot: {x: 1, y: 0} +--- !u!114 &350044373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350044371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23921569, g: 0.72156864, 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_Sprite: {fileID: 21300000, guid: 0e631649835abae4fad9a729f45bcb81, type: 3} + m_Type: 3 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 2 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &350044374 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350044371} + m_CullTransparentMesh: 1 +--- !u!114 &350044375 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350044371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ea86e1e214840ef498f79747dcb26163, type: 3} + m_Name: + m_EditorClassIdentifier: + _loadingBehavior: {fileID: 203667523} +--- !u!1 &531249904 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 531249905} + - component: {fileID: 531249907} + - component: {fileID: 531249906} + m_Layer: 5 + m_Name: Group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &531249905 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531249904} + 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: 1 + m_Children: + - {fileID: 1900434454} + - {fileID: 350044372} + m_Father: {fileID: 203667522} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &531249906 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531249904} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3d268aa56fe5044468ac1c18858ab207, type: 3} + m_Name: + m_EditorClassIdentifier: + loadingBehavior: {fileID: 203667523} + fadeTime: 1 + _fadeOutCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _fadeInCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &531249907 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531249904} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &865714439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 865714440} + - component: {fileID: 865714442} + - component: {fileID: 865714441} + m_Layer: 5 + m_Name: Text_Symbol + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &865714440 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865714439} + 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: 1 + m_Children: [] + m_Father: {fileID: 1993542208} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &865714441 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865714439} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '%' +--- !u!222 &865714442 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865714439} + m_CullTransparentMesh: 1 +--- !u!1 &997970085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 997970086} + - component: {fileID: 997970088} + - component: {fileID: 997970087} + - component: {fileID: 997970089} + m_Layer: 5 + m_Name: Text_Value + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &997970086 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 997970085} + 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: 1 + m_Children: [] + m_Father: {fileID: 1993542208} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &997970087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 997970085} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 00 +--- !u!222 &997970088 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 997970085} + m_CullTransparentMesh: 1 +--- !u!114 &997970089 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 997970085} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 20a0de9ed473d5f4cbda13658d314b06, type: 3} + m_Name: + m_EditorClassIdentifier: + loadingBehavior: {fileID: 203667523} +--- !u!1 &1773217051 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1773217052} + - component: {fileID: 1773217054} + - component: {fileID: 1773217053} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1773217052 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773217051} + 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: 1 + m_Children: [] + m_Father: {fileID: 350044372} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -32, y: -32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1773217053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773217051} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.23137255, b: 0.44705883, 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_Sprite: {fileID: 21300000, guid: 0e631649835abae4fad9a729f45bcb81, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 2 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1773217054 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773217051} + m_CullTransparentMesh: 1 +--- !u!1 &1900434453 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1900434454} + - component: {fileID: 1900434456} + - component: {fileID: 1900434455} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1900434454 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1900434453} + 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: 1 + m_Children: [] + m_Father: {fileID: 531249905} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1900434455 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1900434453} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, 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_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1900434456 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1900434453} + m_CullTransparentMesh: 1 +--- !u!1 &1993542207 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1993542208} + - component: {fileID: 1993542209} + m_Layer: 5 + m_Name: Group_Progress + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1993542208 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993542207} + 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: 1 + m_Children: + - {fileID: 997970086} + - {fileID: 865714440} + m_Father: {fileID: 350044372} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1993542209 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993542207} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 203667522} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Custom.unity.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Custom.unity.meta new file mode 100644 index 00000000..87173f3d --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Custom.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e0094647c619f9c479fb11636924890e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Fade.unity b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Fade.unity new file mode 100644 index 00000000..db5689a7 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Fade.unity @@ -0,0 +1,1121 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &101138762 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 101138767} + - component: {fileID: 101138766} + - component: {fileID: 101138765} + - component: {fileID: 101138764} + - component: {fileID: 101138763} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &101138763 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101138762} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c075a502fec352044ac850b2ac556afe, type: 3} + m_Name: + m_EditorClassIdentifier: + waitForScriptedStart: 1 + waitForScriptedEnd: 1 +--- !u!114 &101138764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101138762} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &101138765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101138762} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 2 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &101138766 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101138762} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 10 + m_TargetDisplay: 0 +--- !u!224 &101138767 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101138762} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 2029535315} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &158472101 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 158472102} + - component: {fileID: 158472104} + - component: {fileID: 158472103} + - component: {fileID: 158472105} + m_Layer: 5 + m_Name: Text_Value + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &158472102 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158472101} + 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: 1 + m_Children: [] + m_Father: {fileID: 2115346373} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &158472103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158472101} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 00 +--- !u!222 &158472104 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158472101} + m_CullTransparentMesh: 1 +--- !u!114 &158472105 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158472101} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 20a0de9ed473d5f4cbda13658d314b06, type: 3} + m_Name: + m_EditorClassIdentifier: + loadingBehavior: {fileID: 101138763} +--- !u!1 &708903265 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 708903266} + - component: {fileID: 708903268} + - component: {fileID: 708903267} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &708903266 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 708903265} + 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: 1 + m_Children: [] + m_Father: {fileID: 2029535315} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &708903267 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 708903265} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, 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_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &708903268 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 708903265} + m_CullTransparentMesh: 1 +--- !u!1 &787578539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 787578540} + - component: {fileID: 787578542} + - component: {fileID: 787578541} + m_Layer: 5 + m_Name: Text_Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &787578540 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 787578539} + 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: 1 + m_Children: [] + m_Father: {fileID: 1457722969} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &787578541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 787578539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 36 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 48 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Loading Scene +--- !u!222 &787578542 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 787578539} + m_CullTransparentMesh: 1 +--- !u!1 &1387984379 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1387984380} + - component: {fileID: 1387984382} + - component: {fileID: 1387984381} + m_Layer: 5 + m_Name: Text_Symbol + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1387984380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387984379} + 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: 1 + m_Children: [] + m_Father: {fileID: 2115346373} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1387984381 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387984379} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '%' +--- !u!222 &1387984382 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387984379} + m_CullTransparentMesh: 1 +--- !u!1 &1457722968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1457722969} + - component: {fileID: 1457722971} + - component: {fileID: 1457722970} + m_Layer: 5 + m_Name: Group_Progress + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1457722969 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457722968} + 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: 1 + m_Children: + - {fileID: 787578540} + - {fileID: 2115346373} + m_Father: {fileID: 2029535315} + 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, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1457722970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457722968} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &1457722971 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1457722968} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 32 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1658017578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1658017579} + - component: {fileID: 1658017580} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1658017579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1658017578} + 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: 1 + m_Children: + - {fileID: 1873277544} + m_Father: {fileID: 2115346373} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1658017580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1658017578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &1740862374 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1740862375} + - component: {fileID: 1740862378} + - component: {fileID: 1740862377} + - component: {fileID: 1740862376} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1740862375 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740862374} + 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: 1 + m_Children: [] + m_Father: {fileID: 2115346373} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1740862376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740862374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1740862377 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740862374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.23137255, b: 0.44705883, 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_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1740862378 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740862374} + m_CullTransparentMesh: 1 +--- !u!1 &1873277543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1873277544} + - component: {fileID: 1873277546} + - component: {fileID: 1873277545} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1873277544 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1873277543} + 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: 1 + m_Children: [] + m_Father: {fileID: 1658017579} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1873277545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1873277543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23921569, g: 0.72156864, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1873277546 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1873277543} + m_CullTransparentMesh: 1 +--- !u!1 &2029535314 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2029535315} + - component: {fileID: 2029535317} + - component: {fileID: 2029535316} + m_Layer: 5 + m_Name: Group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2029535315 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2029535314} + 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: 1 + m_Children: + - {fileID: 708903266} + - {fileID: 1457722969} + m_Father: {fileID: 101138767} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2029535316 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2029535314} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3d268aa56fe5044468ac1c18858ab207, type: 3} + m_Name: + m_EditorClassIdentifier: + loadingBehavior: {fileID: 101138763} + fadeTime: 1 + _fadeOutCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + _fadeInCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &2029535317 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2029535314} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &2115346372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2115346373} + - component: {fileID: 2115346375} + - component: {fileID: 2115346374} + - component: {fileID: 2115346376} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2115346373 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2115346372} + 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: 1 + m_Children: + - {fileID: 1740862375} + - {fileID: 1658017579} + - {fileID: 158472102} + - {fileID: 1387984380} + m_Father: {fileID: 1457722969} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2115346374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2115346372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 128 + m_Right: 128 + m_Top: 6 + m_Bottom: 6 + m_ChildAlignment: 4 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &2115346375 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2115346372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 0 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 0} + m_FillRect: {fileID: 1873277544} + m_HandleRect: {fileID: 0} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2115346376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2115346372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 21e4a56a49cb1dd489d83ec7962d2fc2, type: 3} + m_Name: + m_EditorClassIdentifier: + loadingBehavior: {fileID: 101138763} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 101138767} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Fade.unity.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Fade.unity.meta new file mode 100644 index 00000000..6daadd3f --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/Loading_Fade.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 72e1cc83992e7c345938b36dbc8f927a +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneA.unity b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneA.unity new file mode 100644 index 00000000..b98781d6 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneA.unity @@ -0,0 +1,2627 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &65780886 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 65780887} + - component: {fileID: 65780890} + - component: {fileID: 65780889} + - component: {fileID: 65780888} + m_Layer: 5 + m_Name: Group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &65780887 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + 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: 1 + m_Children: + - {fileID: 1704821105} + - {fileID: 543624002} + m_Father: {fileID: 966196647} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!225 &65780888 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &65780889 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &65780890 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 48 + m_Right: 0 + m_Top: 48 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 24 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &72215351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 72215352} + - component: {fileID: 72215355} + - component: {fileID: 72215354} + - component: {fileID: 72215353} + m_Layer: 0 + m_Name: Barrel_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &72215352 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2.218, y: 0.5, z: 4.515} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &72215353 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + 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: 2 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &72215354 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c7fa4d47884e65f4da8abc72e5dcb96a, 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!33 &72215355 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &319343628 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 319343629} + - component: {fileID: 319343633} + - component: {fileID: 319343632} + - component: {fileID: 319343631} + - component: {fileID: 319343630} + m_Layer: 5 + m_Name: Button_Animated + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &319343629 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + 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: 1 + m_Children: + - {fileID: 1325044622} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &319343630 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &319343631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 319343632} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: TransitionWithLoading + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Loading_Animated + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &319343632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &319343633 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_CullTransparentMesh: 1 +--- !u!1 &476363614 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 476363615} + - component: {fileID: 476363618} + - component: {fileID: 476363617} + - component: {fileID: 476363616} + m_Layer: 0 + m_Name: Barrel_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &476363615 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2.718, y: 0.5, z: 4.22} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &476363616 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + 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: 2 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &476363617 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c7fa4d47884e65f4da8abc72e5dcb96a, 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!33 &476363618 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &522875729 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 522875730} + - component: {fileID: 522875733} + - component: {fileID: 522875732} + - component: {fileID: 522875731} + m_Layer: 0 + m_Name: Box_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &522875730 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0.07831686, z: -0, w: 0.9969285} + m_LocalPosition: {x: -0.388, y: 0.25, z: 3.933} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: -8.984, z: 0} +--- !u!65 &522875731 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + 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!23 &522875732 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2cae1f6280e4f78409eeb7d01a1ab00b, 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!33 &522875733 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &541502988 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 541502989} + - component: {fileID: 541502991} + - component: {fileID: 541502990} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &541502989 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541502988} + 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: 1 + m_Children: [] + m_Father: {fileID: 1961195941} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &541502990 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541502988} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Direct Transition +--- !u!222 &541502991 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541502988} + m_CullTransparentMesh: 1 +--- !u!1 &543624001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 543624002} + - component: {fileID: 543624003} + m_Layer: 5 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &543624002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 543624001} + 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: 1 + m_Children: + - {fileID: 974881141} + - {fileID: 319343629} + - {fileID: 817812573} + - {fileID: 1961195941} + m_Father: {fileID: 65780887} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &543624003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 543624001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 16 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &648910241 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 648910242} + - component: {fileID: 648910245} + - component: {fileID: 648910244} + - component: {fileID: 648910243} + m_Layer: 0 + m_Name: Box_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &648910242 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.10886683, z: -0, w: 0.9940564} + m_LocalPosition: {x: -1.072, y: 0.25, z: 3.633} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 12.5, z: 0} +--- !u!65 &648910243 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + 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!23 &648910244 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2cae1f6280e4f78409eeb7d01a1ab00b, 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!33 &648910245 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &715494127 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 715494129} + - component: {fileID: 715494128} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &715494128 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715494127} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &715494129 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715494127} + serializedVersion: 2 + m_LocalRotation: {x: 0.12708376, y: 0.8643611, z: -0.40305817, w: 0.27253202} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: 145, z: 0} +--- !u!1 &817812572 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 817812573} + - component: {fileID: 817812577} + - component: {fileID: 817812576} + - component: {fileID: 817812575} + - component: {fileID: 817812574} + m_Layer: 5 + m_Name: Button_Custom + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &817812573 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + 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: 1 + m_Children: + - {fileID: 1959944215} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &817812574 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &817812575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 817812576} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: TransitionWithLoading + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Loading_Custom + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &817812576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &817812577 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_CullTransparentMesh: 1 +--- !u!1 &966196643 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 966196647} + - component: {fileID: 966196646} + - component: {fileID: 966196645} + - component: {fileID: 966196644} + - component: {fileID: 966196648} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &966196644 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &966196645 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 2 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &966196646 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &966196647 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 65780887} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &966196648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2e674cd85e71d854e945438963214e21, type: 3} + m_Name: + m_EditorClassIdentifier: + _targetScene: SceneB +--- !u!1 &974881140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 974881141} + - component: {fileID: 974881145} + - component: {fileID: 974881144} + - component: {fileID: 974881143} + - component: {fileID: 974881142} + m_Layer: 5 + m_Name: Button_Fade + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &974881141 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + 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: 1 + m_Children: + - {fileID: 1628318502} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &974881142 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &974881143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 974881144} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: TransitionWithLoading + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Loading_Fade + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &974881144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &974881145 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_CullTransparentMesh: 1 +--- !u!1 &1297270288 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1297270289} + - component: {fileID: 1297270292} + - component: {fileID: 1297270291} + - component: {fileID: 1297270290} + m_Layer: 0 + m_Name: Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1297270289 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 5.25} + m_LocalScale: {x: 10, y: 2, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1297270290 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + 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!23 &1297270291 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 24fbfe448e3667a48af7eddd9ccffbf6, 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!33 &1297270292 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1325044621 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1325044622} + - component: {fileID: 1325044624} + - component: {fileID: 1325044623} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1325044622 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325044621} + 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: 1 + m_Children: [] + m_Father: {fileID: 319343629} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1325044623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325044621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Animated Transition +--- !u!222 &1325044624 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325044621} + m_CullTransparentMesh: 1 +--- !u!1 &1408457994 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1408457995} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1408457995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1408457994} + 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: 1 + m_Children: + - {fileID: 1489239189} + - {fileID: 1297270289} + - {fileID: 648910242} + - {fileID: 522875730} + - {fileID: 1450737562} + - {fileID: 72215352} + - {fileID: 476363615} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1450737561 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1450737562} + - component: {fileID: 1450737565} + - component: {fileID: 1450737564} + - component: {fileID: 1450737563} + m_Layer: 0 + m_Name: Box_03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1450737562 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0.07831686, z: -0, w: 0.9969285} + m_LocalPosition: {x: -1.768, y: 0.25, z: 4.301} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: -8.984, z: 0} +--- !u!65 &1450737563 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + 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!23 &1450737564 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2cae1f6280e4f78409eeb7d01a1ab00b, 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!33 &1450737565 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1489239188 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1489239189} + - component: {fileID: 1489239192} + - component: {fileID: 1489239191} + - component: {fileID: 1489239190} + m_Layer: 0 + m_Name: Floor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1489239189 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + 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: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1489239190 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + 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: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1489239191 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3914cfcf95c8d774eaa76b1757b28bcf, 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!33 &1489239192 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1628318501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1628318502} + - component: {fileID: 1628318504} + - component: {fileID: 1628318503} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1628318502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628318501} + 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: 1 + m_Children: [] + m_Father: {fileID: 974881141} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1628318503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628318501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Fade Transition +--- !u!222 &1628318504 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628318501} + m_CullTransparentMesh: 1 +--- !u!1 &1704821104 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1704821105} + - component: {fileID: 1704821106} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1704821105 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1704821104} + 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: 1 + m_Children: + - {fileID: 1977277422} + m_Father: {fileID: 65780887} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1704821106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1704821104} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 16 + m_Right: 16 + m_Top: 8 + m_Bottom: 8 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1959944214 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1959944215} + - component: {fileID: 1959944217} + - component: {fileID: 1959944216} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1959944215 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959944214} + 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: 1 + m_Children: [] + m_Father: {fileID: 817812573} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1959944216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959944214} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Custom Transition +--- !u!222 &1959944217 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959944214} + m_CullTransparentMesh: 1 +--- !u!1 &1961195940 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1961195941} + - component: {fileID: 1961195945} + - component: {fileID: 1961195944} + - component: {fileID: 1961195943} + - component: {fileID: 1961195942} + m_Layer: 5 + m_Name: Button_Direct + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1961195941 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961195940} + 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: 1 + m_Children: + - {fileID: 541502989} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1961195942 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961195940} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1961195943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961195940} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1961195944} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: Transition + 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 +--- !u!114 &1961195944 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961195940} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1961195945 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1961195940} + m_CullTransparentMesh: 1 +--- !u!1 &1977277421 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1977277422} + - component: {fileID: 1977277425} + - component: {fileID: 1977277424} + - component: {fileID: 1977277423} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1977277422 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + 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: 1 + m_Children: [] + m_Father: {fileID: 1704821105} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1977277423 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 300 + m_MinHeight: 90 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1977277424 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 72 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 7 + m_MaxSize: 72 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Scene A +--- !u!222 &1977277425 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + m_CullTransparentMesh: 1 +--- !u!1 &2058983089 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2058983092} + - component: {fileID: 2058983091} + - component: {fileID: 2058983090} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2058983090 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2058983089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &2058983091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2058983089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &2058983092 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2058983089} + 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: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2104398059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2104398062} + - component: {fileID: 2104398061} + - component: {fileID: 2104398060} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2104398060 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2104398059} + m_Enabled: 1 +--- !u!20 &2104398061 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2104398059} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &2104398062 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2104398059} + serializedVersion: 2 + m_LocalRotation: {x: -0.0767328, y: 0.0065776585, z: -0.0005059611, w: -0.9970299} + m_LocalPosition: {x: 0.48567814, y: 1.1522692, z: 0.55634296} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2104398062} + - {fileID: 715494129} + - {fileID: 1408457995} + - {fileID: 966196647} + - {fileID: 2058983092} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneA.unity.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneA.unity.meta new file mode 100644 index 00000000..4c575eea --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneA.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 26ad88ac19a09ee4597038542f7c085d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.meta new file mode 100644 index 00000000..45eee272 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b3e0ac649b31a3949b28a1062db22ecb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.unity b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.unity new file mode 100644 index 00000000..62dd6d6f --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.unity @@ -0,0 +1,2693 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.15, g: 0.15, b: 0.15, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 2100000, guid: 162b48961309d454ba4e0118c646ecca, type: 2} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 112000000, guid: 713fb479830fe2f41a7256e290b34369, type: 2} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &65780886 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 65780887} + - component: {fileID: 65780890} + - component: {fileID: 65780889} + - component: {fileID: 65780888} + m_Layer: 5 + m_Name: Group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &65780887 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + 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: 1 + m_Children: + - {fileID: 1704821105} + - {fileID: 543624002} + m_Father: {fileID: 966196647} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!225 &65780888 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &65780889 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &65780890 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65780886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 48 + m_Right: 0 + m_Top: 48 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 24 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &72215351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 72215352} + - component: {fileID: 72215355} + - component: {fileID: 72215354} + - component: {fileID: 72215353} + m_Layer: 0 + m_Name: Barrel_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &72215352 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2.218, y: 0.5, z: 4.515} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &72215353 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + 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: 2 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &72215354 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c7fa4d47884e65f4da8abc72e5dcb96a, 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!33 &72215355 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 72215351} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &77173871 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 77173873} + - component: {fileID: 77173872} + m_Layer: 0 + m_Name: Reflection Probe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!215 &77173872 +ReflectionProbe: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 77173871} + m_Enabled: 1 + serializedVersion: 2 + m_Type: 0 + m_Mode: 0 + m_RefreshMode: 0 + m_TimeSlicingMode: 0 + m_Resolution: 128 + m_UpdateFrequency: 0 + m_BoxSize: {x: 10, y: 10, z: 10} + m_BoxOffset: {x: 0, y: 0, z: 0} + m_NearClip: 0.3 + m_FarClip: 1000 + m_ShadowDistance: 100 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_IntensityMultiplier: 1 + m_BlendDistance: 1 + m_HDR: 1 + m_BoxProjection: 0 + m_RenderDynamicObjects: 0 + m_UseOcclusionCulling: 1 + m_Importance: 1 + m_CustomBakedTexture: {fileID: 0} +--- !u!4 &77173873 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 77173871} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.438, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &157672352 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 157672353} + - component: {fileID: 157672355} + - component: {fileID: 157672354} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &157672353 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157672352} + 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: 1 + m_Children: [] + m_Father: {fileID: 1468409464} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &157672354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157672352} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Direct Transition +--- !u!222 &157672355 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157672352} + m_CullTransparentMesh: 1 +--- !u!1 &319343628 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 319343629} + - component: {fileID: 319343633} + - component: {fileID: 319343632} + - component: {fileID: 319343631} + - component: {fileID: 319343630} + m_Layer: 5 + m_Name: Button_Animated + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &319343629 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + 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: 1 + m_Children: + - {fileID: 1325044622} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &319343630 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &319343631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.1, g: 0.1, b: 0.1, a: 1} + m_HighlightedColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_PressedColor: {r: 0, g: 0, b: 0, a: 1} + m_SelectedColor: {r: 0.15, g: 0.15, b: 0.15, a: 1} + m_DisabledColor: {r: 0.1, g: 0.1, b: 0.1, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 319343632} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: TransitionWithLoading + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Loading_Animated + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &319343632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &319343633 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 319343628} + m_CullTransparentMesh: 1 +--- !u!1 &476363614 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 476363615} + - component: {fileID: 476363618} + - component: {fileID: 476363617} + - component: {fileID: 476363616} + m_Layer: 0 + m_Name: Barrel_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &476363615 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 2.718, y: 0.5, z: 4.22} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &476363616 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + 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: 2 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &476363617 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c7fa4d47884e65f4da8abc72e5dcb96a, 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!33 &476363618 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 476363614} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &522875729 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 522875730} + - component: {fileID: 522875733} + - component: {fileID: 522875732} + - component: {fileID: 522875731} + m_Layer: 0 + m_Name: Box_02 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &522875730 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0.07831686, z: -0, w: 0.9969285} + m_LocalPosition: {x: -0.388, y: 0.25, z: 3.933} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: -8.984, z: 0} +--- !u!65 &522875731 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + 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!23 &522875732 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2cae1f6280e4f78409eeb7d01a1ab00b, 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!33 &522875733 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 522875729} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &543624001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 543624002} + - component: {fileID: 543624003} + m_Layer: 5 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &543624002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 543624001} + 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: 1 + m_Children: + - {fileID: 974881141} + - {fileID: 319343629} + - {fileID: 817812573} + - {fileID: 1468409464} + m_Father: {fileID: 65780887} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &543624003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 543624001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 16 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &648910241 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 648910242} + - component: {fileID: 648910245} + - component: {fileID: 648910244} + - component: {fileID: 648910243} + m_Layer: 0 + m_Name: Box_01 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &648910242 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.10886683, z: -0, w: 0.9940564} + m_LocalPosition: {x: -1.072, y: 0.25, z: 3.633} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 12.5, z: 0} +--- !u!65 &648910243 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + 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!23 &648910244 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2cae1f6280e4f78409eeb7d01a1ab00b, 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!33 &648910245 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648910241} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &715494127 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 715494129} + - component: {fileID: 715494128} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &715494128 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715494127} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 0.1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &715494129 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 715494127} + serializedVersion: 2 + m_LocalRotation: {x: 0.29956153, y: 0.08312204, z: -0.9500878, w: 0.026208278} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 170, y: 145, z: 0} +--- !u!1 &817812572 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 817812573} + - component: {fileID: 817812577} + - component: {fileID: 817812576} + - component: {fileID: 817812575} + - component: {fileID: 817812574} + m_Layer: 5 + m_Name: Button_Custom + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &817812573 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + 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: 1 + m_Children: + - {fileID: 1959944215} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &817812574 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &817812575 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.1, g: 0.1, b: 0.1, a: 1} + m_HighlightedColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_PressedColor: {r: 0, g: 0, b: 0, a: 1} + m_SelectedColor: {r: 0.15, g: 0.15, b: 0.15, a: 1} + m_DisabledColor: {r: 0.1, g: 0.1, b: 0.1, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 817812576} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: TransitionWithLoading + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Loading_Custom + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &817812576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &817812577 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817812572} + m_CullTransparentMesh: 1 +--- !u!1 &966196643 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 966196647} + - component: {fileID: 966196646} + - component: {fileID: 966196645} + - component: {fileID: 966196644} + - component: {fileID: 966196648} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &966196644 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &966196645 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 2 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &966196646 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &966196647 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 65780887} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &966196648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 966196643} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2e674cd85e71d854e945438963214e21, type: 3} + m_Name: + m_EditorClassIdentifier: + _targetScene: SceneA +--- !u!1 &974881140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 974881141} + - component: {fileID: 974881145} + - component: {fileID: 974881144} + - component: {fileID: 974881143} + - component: {fileID: 974881142} + m_Layer: 5 + m_Name: Button_Fade + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &974881141 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + 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: 1 + m_Children: + - {fileID: 1628318502} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &974881142 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &974881143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.1, g: 0.1, b: 0.1, a: 1} + m_HighlightedColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_PressedColor: {r: 0, g: 0, b: 0, a: 1} + m_SelectedColor: {r: 0.15, g: 0.15, b: 0.15, a: 1} + m_DisabledColor: {r: 0.1, g: 0.1, b: 0.1, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 974881144} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: TransitionWithLoading + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Loading_Fade + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &974881144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &974881145 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974881140} + m_CullTransparentMesh: 1 +--- !u!1 &1297270288 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1297270289} + - component: {fileID: 1297270292} + - component: {fileID: 1297270291} + - component: {fileID: 1297270290} + m_Layer: 0 + m_Name: Wall + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &1297270289 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: 5.25} + m_LocalScale: {x: 10, y: 2, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1297270290 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + 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!23 &1297270291 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 33b2ce6d53c5e8947a553e4540a27b13, 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!33 &1297270292 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1297270288} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1325044621 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1325044622} + - component: {fileID: 1325044624} + - component: {fileID: 1325044623} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1325044622 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325044621} + 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: 1 + m_Children: [] + m_Father: {fileID: 319343629} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1325044623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325044621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Animated Transition +--- !u!222 &1325044624 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325044621} + m_CullTransparentMesh: 1 +--- !u!1 &1408457994 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1408457995} + m_Layer: 0 + m_Name: Environment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &1408457995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1408457994} + 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: 1 + m_Children: + - {fileID: 1489239189} + - {fileID: 1297270289} + - {fileID: 648910242} + - {fileID: 522875730} + - {fileID: 1450737562} + - {fileID: 72215352} + - {fileID: 476363615} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1450737561 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1450737562} + - component: {fileID: 1450737565} + - component: {fileID: 1450737564} + - component: {fileID: 1450737563} + m_Layer: 0 + m_Name: Box_03 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &1450737562 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0.07831686, z: -0, w: 0.9969285} + m_LocalPosition: {x: -1.768, y: 0.25, z: 4.301} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: -8.984, z: 0} +--- !u!65 &1450737563 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + 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!23 &1450737564 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 2cae1f6280e4f78409eeb7d01a1ab00b, 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!33 &1450737565 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1450737561} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1468409463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1468409464} + - component: {fileID: 1468409468} + - component: {fileID: 1468409467} + - component: {fileID: 1468409466} + - component: {fileID: 1468409465} + m_Layer: 5 + m_Name: Button_Direct + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1468409464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468409463} + 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: 1 + m_Children: + - {fileID: 157672353} + m_Father: {fileID: 543624002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1468409465 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468409463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 24 + m_Right: 24 + m_Top: 16 + m_Bottom: 16 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1468409466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468409463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.1, g: 0.1, b: 0.1, a: 1} + m_HighlightedColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_PressedColor: {r: 0, g: 0, b: 0, a: 1} + m_SelectedColor: {r: 0.15, g: 0.15, b: 0.15, a: 1} + m_DisabledColor: {r: 0.1, g: 0.1, b: 0.1, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1468409467} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 65780888} + m_TargetAssemblyTypeName: UnityEngine.CanvasGroup, UnityEngine + m_MethodName: set_interactable + m_Mode: 6 + 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_Target: {fileID: 966196648} + m_TargetAssemblyTypeName: SceneTransitionTrigger, Sample.LoadingScene + m_MethodName: Transition + 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 +--- !u!114 &1468409467 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468409463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1468409468 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468409463} + m_CullTransparentMesh: 1 +--- !u!1 &1489239188 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1489239189} + - component: {fileID: 1489239192} + - component: {fileID: 1489239191} + - component: {fileID: 1489239190} + m_Layer: 0 + m_Name: Floor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 64 + m_IsActive: 1 +--- !u!4 &1489239189 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + 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: 1 + m_Children: [] + m_Father: {fileID: 1408457995} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1489239190 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + 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: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1489239191 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + 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_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 3914cfcf95c8d774eaa76b1757b28bcf, 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!33 &1489239192 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1489239188} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1628318501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1628318502} + - component: {fileID: 1628318504} + - component: {fileID: 1628318503} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1628318502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628318501} + 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: 1 + m_Children: [] + m_Father: {fileID: 974881141} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1628318503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628318501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Fade Transition +--- !u!222 &1628318504 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1628318501} + m_CullTransparentMesh: 1 +--- !u!1 &1704821104 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1704821105} + - component: {fileID: 1704821106} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1704821105 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1704821104} + 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: 1 + m_Children: + - {fileID: 1977277422} + m_Father: {fileID: 65780887} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1704821106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1704821104} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 16 + m_Right: 16 + m_Top: 8 + m_Bottom: 8 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1959944214 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1959944215} + - component: {fileID: 1959944217} + - component: {fileID: 1959944216} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1959944215 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959944214} + 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: 1 + m_Children: [] + m_Father: {fileID: 817812573} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1959944216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959944214} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 28 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Custom Transition +--- !u!222 &1959944217 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1959944214} + m_CullTransparentMesh: 1 +--- !u!1 &1977277421 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1977277422} + - component: {fileID: 1977277425} + - component: {fileID: 1977277424} + - component: {fileID: 1977277423} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1977277422 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + 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: 1 + m_Children: [] + m_Father: {fileID: 1704821105} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1977277423 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 300 + m_MinHeight: 90 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1977277424 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 72 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 7 + m_MaxSize: 72 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Scene B +--- !u!222 &1977277425 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1977277421} + m_CullTransparentMesh: 1 +--- !u!1 &2058983089 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2058983092} + - component: {fileID: 2058983091} + - component: {fileID: 2058983090} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2058983090 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2058983089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &2058983091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2058983089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &2058983092 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2058983089} + 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: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2104398059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2104398062} + - component: {fileID: 2104398061} + - component: {fileID: 2104398060} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2104398060 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2104398059} + m_Enabled: 1 +--- !u!20 &2104398061 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2104398059} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &2104398062 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2104398059} + serializedVersion: 2 + m_LocalRotation: {x: -0.0767328, y: 0.0065776585, z: -0.0005059611, w: -0.9970299} + m_LocalPosition: {x: 0.48567814, y: 1.1522692, z: 0.55634296} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2104398062} + - {fileID: 715494129} + - {fileID: 77173873} + - {fileID: 1408457995} + - {fileID: 966196647} + - {fileID: 2058983092} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.unity.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.unity.meta new file mode 100644 index 00000000..ccd78c11 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d6dc9d379ebdf9044808e8d344a75da0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/LightingData.asset b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/LightingData.asset new file mode 100644 index 00000000..7a38e2a0 Binary files /dev/null and b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/LightingData.asset differ diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/LightingData.asset.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/LightingData.asset.meta new file mode 100644 index 00000000..4ea604f5 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/LightingData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 713fb479830fe2f41a7256e290b34369 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 112000000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-0.exr b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-0.exr new file mode 100644 index 00000000..4c522a20 Binary files /dev/null and b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-0.exr differ diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-0.exr.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-0.exr.meta new file mode 100644 index 00000000..323b2483 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-0.exr.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: e44b2fada33483841b7922673545fe73 +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: 1 + seamlessCubemap: 1 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + 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: 2 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 100 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-1.exr b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-1.exr new file mode 100644 index 00000000..26ace0ee Binary files /dev/null and b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-1.exr differ diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-1.exr.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-1.exr.meta new file mode 100644 index 00000000..5eb6762a --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scenes/SceneB/ReflectionProbe-1.exr.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 3ca868183594b1d49a127bff22d45823 +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: 1 + seamlessCubemap: 1 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + 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: 2 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 100 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts.meta new file mode 100644 index 00000000..45e4e89e --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6adecbebb7cfd5a4685b3a0b5bb3ad62 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor.meta new file mode 100644 index 00000000..73def965 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 322e597b443729b45815e23122d1fdd6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/MaterialPipelineConverter.cs b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/MaterialPipelineConverter.cs new file mode 100644 index 00000000..cd4a0d12 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/MaterialPipelineConverter.cs @@ -0,0 +1,130 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; +#if CONVERT_MATERIALS +using UnityEditor.Rendering; +using UnityEngine.Rendering; +#if CONVERT_URP +using UnityEditor.Rendering.Universal; +using UnityEngine.Rendering.Universal; +#endif +#if CONVERT_HDRP +using UnityEngine.Rendering.HighDefinition; +using UnityEditor.Rendering.HighDefinition; +#endif +#endif + +[InitializeOnLoad] +public static class MaterialPipelineConverter +{ + const string _partialPath = "Loading Scene Examples/Materials"; + + static MaterialPipelineConverter() + { + EditorApplication.delayCall += ConvertMaterials; + } + + public static void ConvertMaterials() + { + RenderPipelineAsset renderPipeline = GraphicsSettings.currentRenderPipeline; + if (!renderPipeline) + return; + +#if CONVERT_MATERIALS + string[] materialPaths = AssetDatabase.FindAssets("t:Material") + .Select(AssetDatabase.GUIDToAssetPath) + .Where(path => path.Contains(_partialPath)) + .ToArray(); + + if (materialPaths.Length == 0) + return; + + Material[] materials = materialPaths + .Select(path => AssetDatabase.LoadAssetAtPath(path)) + .Where(material => material != null && material.shader.name == "Standard") + .ToArray(); + + if (materials.Length == 0) + return; + + List upgraders = GetMaterialUpgraders(renderPipeline); + if (upgraders.Count > 0 && EditorUtility.DisplayDialog("Sample Material Upgrader", "The sample materials have to be upgraded to match your render pipeline. Would you like to upgrade them now?", "Upgrade", "Ignore")) + { + foreach (Material material in materials) + { + MaterialUpgrader.Upgrade(material, upgraders, MaterialUpgrader.UpgradeFlags.None); + } + AssetDatabase.Refresh(); + } +#endif + } + +#if CONVERT_MATERIALS + static List GetMaterialUpgraders(RenderPipelineAsset renderPipeline) + { + List upgraders = new(); +#if CONVERT_URP + if (renderPipeline is UniversalRenderPipelineAsset) + upgraders.Add(new StandardUpgrader("Standard")); +#endif +#if CONVERT_HDRP + if (renderPipeline is HDRenderPipelineAsset) + upgraders.Add(new StandardsToHDLitMaterialUpgrader("Standard", "HDRP/Lit")); +#endif + return upgraders; + } +#endif +} + +#if CONVERT_HDRP +// Modified original from `Packages/com.unity.render-pipelines.high-definition/Editor/Material/Lit/StandardsToHDLitMaterialUpgrader.cs` +internal class StandardsToHDLitMaterialUpgrader : MaterialUpgrader +{ + internal StandardsToHDLitMaterialUpgrader(string sourceShaderName, string destShaderName, MaterialFinalizer finalizer = null) + { + RenameShader(sourceShaderName, destShaderName, finalizer); + + RenameTexture("_MainTex", "_BaseColorMap"); + RenameColor("_Color", "_BaseColor"); + RenameFloat("_Glossiness", "_Smoothness"); + RenameTexture("_BumpMap", "_NormalMap"); + RenameFloat("_BumpScale", "_NormalScale"); + RenameTexture("_ParallaxMap", "_HeightMap"); + RenameTexture("_EmissionMap", "_EmissiveColorMap"); + RenameTexture("_DetailAlbedoMap", "_DetailMap"); + RenameFloat("_UVSec", "_UVDetail"); + SetFloat("_LinkDetailsWithBase", 0); + RenameFloat("_DetailNormalMapScale", "_DetailNormalScale"); + RenameFloat("_Cutoff", "_AlphaCutoff"); + RenameKeywordToFloat("_ALPHATEST_ON", "_AlphaCutoffEnable", 1f, 0f); + + SetFloat("_MaterialID", 1f); + } + + public override void Convert(Material srcMaterial, Material dstMaterial) + { + dstMaterial.hideFlags = HideFlags.DontUnloadUnusedAsset; + + base.Convert(srcMaterial, dstMaterial); + + float metallicValue = Mathf.Pow(srcMaterial.GetFloat("_Metallic"), 2.2f); + dstMaterial.SetFloat("_Metallic", metallicValue); + dstMaterial.SetFloat("_AORemapMin", 1f - srcMaterial.GetFloat("_OcclusionStrength")); + dstMaterial.SetFloat("_SmoothnessRemapMax", srcMaterial.GetFloat("_Glossiness")); + dstMaterial.SetFloat("_SurfaceType", 0); + dstMaterial.SetFloat("_BlendMode", 0); + dstMaterial.SetFloat("_AlphaCutoffEnable", 0); + dstMaterial.SetFloat("_EnableBlendModePreserveSpecularLighting", 1); + + Color hdrEmission = srcMaterial.GetColor("_EmissionColor"); + + if (!srcMaterial.IsKeywordEnabled("_EMISSION")) + hdrEmission = Color.black; + + dstMaterial.SetColor("_EmissiveColor", hdrEmission); + + HDShaderUtils.ResetMaterialKeywords(dstMaterial); + } +} +#endif \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/MaterialPipelineConverter.cs.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/MaterialPipelineConverter.cs.meta new file mode 100644 index 00000000..ae580309 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/MaterialPipelineConverter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 35ef34a8ee68e684588480a73ab173eb \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/Sample.LoadingScene.Editor.asmdef b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/Sample.LoadingScene.Editor.asmdef new file mode 100644 index 00000000..7d1c687c --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/Sample.LoadingScene.Editor.asmdef @@ -0,0 +1,38 @@ +{ + "name": "Sample.LoadingScene.Editor", + "rootNamespace": "", + "references": [ + "GUID:3eae0364be2026648bf74846acb8a731", + "GUID:c579267770062bf448e75eb160330b7f", + "GUID:15fc0a57446b3144c949da3e2b9737a9", + "GUID:78bd2ddd6e276394a9615c203e574844", + "GUID:457756d89b35d2941b3e7b37b4ece6f1" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.render-pipelines.core", + "expression": "12.1", + "define": "CONVERT_MATERIALS" + }, + { + "name": "com.unity.render-pipelines.high-definition", + "expression": "12.1", + "define": "CONVERT_HDRP" + }, + { + "name": "com.unity.render-pipelines.universal", + "expression": "12.1", + "define": "CONVERT_URP" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/Sample.LoadingScene.Editor.asmdef.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/Sample.LoadingScene.Editor.asmdef.meta new file mode 100644 index 00000000..3afdbd10 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/Sample.LoadingScene.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7479c7f3f090a70479be9cf477703a60 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/SceneBuildSettingsEditor.cs b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/SceneBuildSettingsEditor.cs new file mode 100644 index 00000000..37667ab7 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/SceneBuildSettingsEditor.cs @@ -0,0 +1,100 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; + +[InitializeOnLoad] +public static class SceneBuildSettingsEditor +{ + const string _sampleName = "Loading Scene Examples"; + const string _sampleSlug = "asm_lse"; + const string _dontShowAgainKey = _sampleSlug + "::dontShowAddScenesPrompt"; + + static readonly string[] _requiredSceneNames = + { + "SceneA", + "SceneB", + "Loading_Fade", + "Loading_Animated", + "Loading_Custom" + }; + + static SceneBuildSettingsEditor() + { + EditorApplication.delayCall += CheckScenesInBuildSettings; + } + + static void CheckScenesInBuildSettings() + { + if (EditorPrefs.GetBool(_dontShowAgainKey, false)) + return; + + string[] buildScenes = EditorBuildSettings.scenes + .Select(scene => Path.GetFileNameWithoutExtension(scene.path)) + .ToArray(); + + string[] allScenePaths = AssetDatabase.FindAssets("t:Scene") + .Select(AssetDatabase.GUIDToAssetPath) + .ToArray(); + + string[] missingScenes = _requiredSceneNames + .Where(name => !buildScenes.Contains(name)) + .Select(name => allScenePaths.FirstOrDefault(path => Path.GetFileNameWithoutExtension(path) == name)) + .Where(path => !string.IsNullOrEmpty(path) && !path.Contains("Packages/com.mygamedevtools.scene-loader")) + .ToArray(); + + if (missingScenes.Length > 0) + { + bool addScenes = EditorUtility.DisplayDialogComplex( + _sampleName, + "To run the " + _sampleName + ", you need to add the sample scenes to the Build Settings. Would you like to add them now?\nYou can remove them later in the menu: \"Tools/My Scene Manager/Remove '" + _sampleName + "' from Build Settings\".", + "Add Scenes", + "Ignore", + "Don't Show Again" + ) switch + { + 0 => true, + 2 => SetDontShowAgain(), + _ => false + }; + + if (addScenes) + { + AddScenesToBuildSettings(missingScenes); + } + } + } + + static bool SetDontShowAgain() + { + EditorPrefs.SetBool(_dontShowAgainKey, true); + return false; + } + + static void AddScenesToBuildSettings(string[] scenes) + { + List currentScenes = EditorBuildSettings.scenes.ToList(); + + foreach (string scene in scenes) + { + currentScenes.Add(new EditorBuildSettingsScene(scene, true)); + } + + EditorBuildSettings.scenes = currentScenes.ToArray(); + } + + [MenuItem("Tools/My Scene Manager/Remove '" + _sampleName + "' from Build Settings")] + static void RemoveSampleScenesFromBuildSettings() + { + List currentScenes = EditorBuildSettings.scenes.ToList(); + currentScenes.RemoveAll(scene => _requiredSceneNames.Contains(Path.GetFileNameWithoutExtension(scene.path))); + + EditorBuildSettings.scenes = currentScenes.ToArray(); + } + + [MenuItem("Tools/My Scene Manager/Reset '" + _sampleName + "' Add Scenes Prompt")] + private static void ResetDontShowAgain() + { + EditorPrefs.DeleteKey(_dontShowAgainKey); + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/SceneBuildSettingsEditor.cs.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/SceneBuildSettingsEditor.cs.meta new file mode 100644 index 00000000..dd718460 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Editor/SceneBuildSettingsEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a7fd449815eefcf45aa518254adacc34 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime.meta new file mode 100644 index 00000000..e76772b2 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e8a9992f3d0281247a4c8fabbd6e7a8b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/AnimatedTrigger.cs b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/AnimatedTrigger.cs new file mode 100644 index 00000000..db842c8e --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/AnimatedTrigger.cs @@ -0,0 +1,75 @@ +using MyGameDevTools.SceneLoading; +using UnityEngine; + +public class AnimatedTrigger : MonoBehaviour +{ + /// + /// Cached Animation parameter hash, for quicker access. + /// + static readonly int _isOpenHash = Animator.StringToHash("IsOpen"); + + /// + /// Set this component reference in the inspector to be able to read and write loading states. + /// + [SerializeField] + LoadingBehavior _loadingBehavior; + + /// + /// The is used to notify when the target scenes have completed loading and to trigger the start and end of the Scene Transition. + /// + LoadingProgress _loadingProgress; + // We'll use the animator to play animations. + Animator _animator; + + /// + /// The Awake method is invoked right after a scene has completed loading, but still didn't activate. + /// Here we can get the references we need and trigger the "in" animation. + /// + void Awake() + { + _animator = GetComponent(); + + // Get the LoadingProgress from the LoadingBehavior + _loadingProgress = _loadingBehavior.Progress; + + // Subscribe to the LoadingCompleted event, that is broadcast when the target scenes are completely loaded + _loadingProgress.LoadingCompleted += PlayOutAnimation; + + // Start playing the "in" animation, to show a feedback that we're entering a loading state + PlayInAnimation(); + } + + /// + /// Call this method when you have finished your animation to effectively start the Scene Transition. + /// + public void InTransitionTrigger() + { + // Allow the Scene Manager to start the Scene Transition + _loadingProgress.StartTransition(); + } + + /// + /// Call this method when you have finished your animation to effectively end the Scene Transition. + /// + public void OutTransitionTrigger() + { + // Allow the Scene Manager to finish the Scene Transition + _loadingProgress.EndTransition(); + } + + /// + /// Plays the "in" transition animation for the loading screen. + /// + void PlayInAnimation() + { + _animator.SetBool(_isOpenHash, false); + } + + /// + /// Plays the "out" transition animation for the loading screen. + /// + void PlayOutAnimation() + { + _animator.SetBool(_isOpenHash, true); + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/AnimatedTrigger.cs.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/AnimatedTrigger.cs.meta new file mode 100644 index 00000000..23241446 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/AnimatedTrigger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 86412405a5b304e44bcea539864a36ab \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/LoadingFeedbackImageFill.cs b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/LoadingFeedbackImageFill.cs new file mode 100644 index 00000000..e1a68c25 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/LoadingFeedbackImageFill.cs @@ -0,0 +1,38 @@ +using MyGameDevTools.SceneLoading; +using UnityEngine; +using UnityEngine.UI; + +[RequireComponent(typeof(Image))] +public class LoadingFeedbackImageFill : MonoBehaviour +{ + /// + /// Set this component reference in the inspector to be able to read the loading progress. + /// + [SerializeField] + LoadingBehavior _loadingBehavior; + + // We'll use the Image component to display the loading feedback as the fill amount. + Image _image; + + /// + /// Initialize the feedback state. + /// + void Awake() + { + _image = GetComponent(); + _image.fillAmount = 0; + } + + /// + /// Subscribe to the event to receive the loading progress of the target scenes. + /// + void Start() + { + _loadingBehavior.Progress.Progressed += UpdateSlider; + } + + /// + /// Updates the to display the loading progress feedback. + /// + void UpdateSlider(float progress) => _image.fillAmount = progress; +} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/LoadingFeedbackImageFill.cs.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/LoadingFeedbackImageFill.cs.meta new file mode 100644 index 00000000..583fc7d1 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/LoadingFeedbackImageFill.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ea86e1e214840ef498f79747dcb26163 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/Sample.LoadingScene.asmdef b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/Sample.LoadingScene.asmdef new file mode 100644 index 00000000..3888e966 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/Sample.LoadingScene.asmdef @@ -0,0 +1,16 @@ +{ + "name": "Sample.LoadingScene", + "rootNamespace": "", + "references": [ + "GUID:eee6d035ccac42b4e845b99014468585" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/Sample.LoadingScene.asmdef.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/Sample.LoadingScene.asmdef.meta new file mode 100644 index 00000000..5d38ba36 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/Sample.LoadingScene.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 82fcb9e0d6410444c88a9f17063b829d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/SceneTransitionTrigger.cs b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/SceneTransitionTrigger.cs new file mode 100644 index 00000000..fedae7bc --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/SceneTransitionTrigger.cs @@ -0,0 +1,29 @@ +using MyGameDevTools.SceneLoading; +using UnityEngine; + +public class SceneTransitionTrigger : MonoBehaviour +{ + /// + /// Target Scene name. + /// Editable via the Unity Inspector. + /// Make sure to provide a scene that has been added to the Build Settings. + /// + [SerializeField] + string _targetScene; + + /// + /// Triggers a Scene Transition to a scene with name provided by '' with a loading scene with name ''. + /// + public void TransitionWithLoading(string loadingScene) + { + MySceneManager.TransitionAsync(_targetScene, loadingScene); + } + + /// + /// Triggers a Scene Transition to a scene with name provided by '' without a loading scene. + /// + public void Transition() + { + MySceneManager.TransitionAsync(_targetScene); + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/SceneTransitionTrigger.cs.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/SceneTransitionTrigger.cs.meta new file mode 100644 index 00000000..c8922b4c --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Scripts/Runtime/SceneTransitionTrigger.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e674cd85e71d854e945438963214e21 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites.meta new file mode 100644 index 00000000..c36db63c --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b73aa7ea07e12a4ab95f2968f988ec9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/circle.png b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/circle.png new file mode 100644 index 00000000..7c6d80ae Binary files /dev/null and b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/circle.png differ diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/circle.png.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/circle.png.meta new file mode 100644 index 00000000..3f296b3e --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/circle.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 0e631649835abae4fad9a729f45bcb81 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + 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: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_left.png b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_left.png new file mode 100644 index 00000000..4da3867e Binary files /dev/null and b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_left.png differ diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_left.png.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_left.png.meta new file mode 100644 index 00000000..9451ff21 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_left.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 79a6fde258d0ee447a881166e6ecadea +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + 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: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_right.png b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_right.png new file mode 100644 index 00000000..0a696f16 Binary files /dev/null and b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_right.png differ diff --git a/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_right.png.meta b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_right.png.meta new file mode 100644 index 00000000..da6c5bef --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Samples/LoadingSceneExamples/Sprites/triangle_right.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 893a1f4488cb89d4c84df8bece4201be +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 0 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + 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: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingBehaviorTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingBehaviorTests.cs index ca67cabe..86cd97c2 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingBehaviorTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingBehaviorTests.cs @@ -25,16 +25,12 @@ public IEnumerator AutomaticTriggers() var behavior = new GameObject().AddComponent(); var progress = behavior.Progress; - Assert.AreEqual(LoadingState.WaitingToStart, progress.State); - yield return null; - Assert.AreEqual(LoadingState.Loading, progress.State); - progress.Report(1); - progress.SetState(LoadingState.TargetSceneLoaded); + progress.SetLoadingCompleted(); - Assert.AreEqual(LoadingState.TransitionComplete, progress.State); + Assert.True(progress.TransitionOutTask.Task.Result); } [UnityTest] @@ -45,23 +41,23 @@ public IEnumerator ManualTriggers() behavior.waitForScriptedStart = true; behavior.waitForScriptedEnd = true; - var progress = behavior.Progress; - - Assert.AreEqual(LoadingState.WaitingToStart, progress.State); + bool completed = false; + var progress = behavior.Progress; + progress.LoadingCompleted += () => completed = true; yield return null; - Assert.AreEqual(LoadingState.WaitingToStart, progress.State); + progress.StartTransition(); + Assert.True(progress.TransitionInTask.Task.Result); - progress.SetState(LoadingState.Loading); progress.Report(1); - progress.SetState(LoadingState.TargetSceneLoaded); + progress.SetLoadingCompleted(); yield return null; - Assert.AreEqual(LoadingState.TargetSceneLoaded, progress.State); + Assert.True(completed); - progress.SetState(LoadingState.TransitionComplete); - Assert.AreEqual(LoadingState.TransitionComplete, progress.State); + progress.EndTransition(); + Assert.True(progress.TransitionOutTask.Task.Result); } } } \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingFaderTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingFaderTests.cs index d678a9f7..faf87327 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingFaderTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingFaderTests.cs @@ -34,18 +34,17 @@ public IEnumerator FadeInOut() loadingFader.fadeTime = .2f; loadingFader.loadingBehavior = loadingBehavior; - Assert.AreEqual(LoadingState.WaitingToStart, progress.State); Assert.AreEqual(0, canvasGroup.alpha); yield return new WaitForSeconds(loadingFader.fadeTime * 2); - Assert.AreEqual(LoadingState.Loading, progress.State); + Assert.True(progress.TransitionInTask.Task.IsCompletedSuccessfully); Assert.AreEqual(1, canvasGroup.alpha); - progress.SetState(LoadingState.TargetSceneLoaded); + progress.SetLoadingCompleted(); yield return new WaitForSeconds(loadingFader.fadeTime * 2); - Assert.AreEqual(LoadingState.TransitionComplete, progress.State); + Assert.True(progress.TransitionOutTask.Task.IsCompletedSuccessfully); Assert.AreEqual(0, canvasGroup.alpha); } } diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingProgressTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingProgressTests.cs index aa920970..dfa23bc0 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingProgressTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/LoadingProgressTests.cs @@ -8,14 +8,12 @@ public class LoadingProgressTests public void SetState_Test() { var progress = new LoadingProgress(); - Assert.AreEqual(LoadingState.WaitingToStart, progress.State); - LoadingState cachedState = default; - progress.StateChanged += state => cachedState = state; + bool completed = false; + progress.LoadingCompleted += () => completed = true; - progress.SetState(LoadingState.Loading); - Assert.AreEqual(LoadingState.Loading, progress.State); - Assert.AreEqual(progress.State, cachedState); + progress.SetLoadingCompleted(); + Assert.True(completed); } [Test] diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/MyGameDevTools.SceneLoading.Tests.asmdef b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/MyGameDevTools.SceneLoading.Tests.asmdef index e3601d61..d738710f 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/MyGameDevTools.SceneLoading.Tests.asmdef +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/MyGameDevTools.SceneLoading.Tests.asmdef @@ -1,14 +1,13 @@ { "name": "MyGameDevTools.SceneLoading.Tests", - "rootNamespace": "", + "rootNamespace": "MyGameDevTools.SceneLoading.Tests", "references": [ "GUID:eee6d035ccac42b4e845b99014468585", "GUID:27619889b8ba8c24980f49ee34dbb44a", "GUID:9e24947de15b9834991c9d8411ea37cf", "GUID:69448af7b92c7f342b298e06a37122aa", "GUID:84651a3751eca9349aac36a66bba901b", - "GUID:6055be8ebefd69e48b49212b09b47b2f", - "GUID:f51ebe6a0ceec4240a699833d6309b23" + "GUID:6055be8ebefd69e48b49212b09b47b2f" ], "includePlatforms": [], "excludePlatforms": [], @@ -27,15 +26,15 @@ "expression": "2.2", "define": "ENABLE_TMP" }, + { + "name": "com.unity.ugui", + "expression": "2", + "define": "ENABLE_TMP" + }, { "name": "com.unity.addressables", "expression": "1.19", "define": "ENABLE_ADDRESSABLES" - }, - { - "name": "com.cysharp.unitask", - "expression": "2", - "define": "ENABLE_UNITASK" } ], "noEngineReferences": false diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoaderTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoaderTests.cs deleted file mode 100644 index 0db13432..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoaderTests.cs +++ /dev/null @@ -1,350 +0,0 @@ -#if ENABLE_UNITASK -#endif -using NUnit.Framework; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using UnityEngine; -using UnityEngine.SceneManagement; -using UnityEngine.TestTools; - -namespace MyGameDevTools.SceneLoading.Tests -{ - enum SceneLoaderType - { - Async, -#if ENABLE_UNITASK - UniTask, -#endif - Coroutine, - } - - public class SceneLoaderTests : SceneTestBase - { - // Here we don't need to test multiple load scene infos, since that is already done - // in the scene manager tests. - public static readonly ILoadSceneInfo[] LoadingSceneInfos = new ILoadSceneInfo[] - { - null, - new LoadSceneInfoName(SceneBuilder.SceneNames[3]), - new LoadSceneInfoName(SceneBuilder.SceneNames[0]), - }; - - static readonly ISceneLoader[] _sceneLoaders = new ISceneLoader[] - { - new SceneLoaderAsync(SceneTestEnvironment.SceneManagers[0]), -#if ENABLE_UNITASK - new SceneLoaderUniTask(SceneTestEnvironment.SceneManagers[0]), -#endif - new SceneLoaderCoroutine(SceneTestEnvironment.SceneManagers[0]), - }; - - [UnityTest] - public IEnumerator LoadScenes([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes) - { - int sceneCount = targetScenes.Length; - var loadedScenes = new List(sceneCount); - - sceneLoader.Manager.SceneLoaded += sceneLoaded; - sceneLoader.LoadScenes(targetScenes, 0); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loadedScenes.Count == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - - Assert.AreEqual(sceneCount, loadedScenes.Count); - - void sceneLoaded(Scene scene) - { - loadedScenes.Add(scene); - } - } - - [UnityTest] - public IEnumerator LoadScene([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader) - { - yield return LoadFirstScene(sceneLoader); - } - - [UnityTest] - public IEnumerator UnloadScenes([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes) - { - int sceneCount = targetScenes.Length; - sceneLoader.LoadScenes(targetScenes); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => sceneLoader.Manager.LoadedSceneCount == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - Assert.AreEqual(sceneCount, sceneLoader.Manager.LoadedSceneCount); - - var unloadedScenes = new List(sceneCount); - - sceneLoader.Manager.SceneUnloaded += sceneUnloaded; - sceneLoader.UnloadScenes(targetScenes); - - watch.Restart(); - yield return new WaitUntil(() => unloadedScenes.Count == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneUnloaded -= sceneUnloaded; - - Assert.AreEqual(sceneCount, unloadedScenes.Count); - Assert.AreEqual(0, sceneLoader.Manager.LoadedSceneCount); - - void sceneUnloaded(Scene scene) - { - unloadedScenes.Add(scene); - } - } - - [UnityTest] - public IEnumerator UnloadScene([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader) - { - yield return LoadFirstScene(sceneLoader); - - var loadedScene = sceneLoader.Manager.GetLastLoadedScene(); - - sceneLoader.Manager.SceneUnloaded += sceneUnloaded; - - Scene unloadedScene = default; - sceneLoader.UnloadScene(new LoadSceneInfoName(SceneBuilder.SceneNames[1])); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => unloadedScene.handle != 0 && !unloadedScene.isLoaded || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneUnloaded -= sceneUnloaded; - - Assert.Less(watch.ElapsedMilliseconds, SceneTestEnvironment.DefaultTimeout); - Assert.AreEqual(loadedScene, unloadedScene); - Assert.IsFalse(unloadedScene.isLoaded); - - void sceneUnloaded(Scene scene) - { - unloadedScene = scene; - } - } - - [UnityTest] - public IEnumerator TransitionToScenes([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - yield return LoadFirstScene(sceneLoader); - - int sceneCount = targetScenes.Length; - if (loadingScene != null) - sceneCount++; - - var loadedScenes = new List(sceneCount); - - sceneLoader.Manager.SceneLoaded += sceneLoaded; - sceneLoader.TransitionToScenes(targetScenes, 0, loadingScene); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loadedScenes.Count == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - - Assert.AreEqual(sceneCount, loadedScenes.Count); - - yield return new WaitUntil(() => sceneLoader.Manager.TotalSceneCount == sceneCount); - - void sceneLoaded(Scene scene) - { - loadedScenes.Add(scene); - } - } - - [UnityTest] - public IEnumerator TransitionToScenesFromScenes([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - int sceneCount = targetScenes.Length; - - var loadedScenes = new List(sceneCount); - - sceneLoader.Manager.SceneLoaded += sceneLoaded; - sceneLoader.LoadScenes(targetScenes); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loadedScenes.Count == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneCount += loadingScene == null ? 0 : 1; - - var unloadedScenes = new List(sceneCount); - sceneLoader.Manager.SceneUnloaded += sceneUnloaded; - - loadedScenes.Clear(); - sceneLoader.TransitionToScenesFromScenes(targetScenes, targetScenes, 0, loadingScene); - - watch.Restart(); - yield return new WaitUntil(() => (loadedScenes.Count == sceneCount && unloadedScenes.Count == sceneCount) || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - sceneLoader.Manager.SceneUnloaded -= sceneUnloaded; - - yield return new WaitUntil(() => sceneLoader.Manager.TotalSceneCount == targetScenes.Length); - - Assert.AreEqual(sceneCount, loadedScenes.Count); - Assert.AreEqual(sceneCount, unloadedScenes.Count); - - void sceneLoaded(Scene scene) - { - loadedScenes.Add(scene); - } - - void sceneUnloaded(Scene scene) - { - unloadedScenes.Add(scene); - } - } - - [UnityTest] - public IEnumerator TransitionToScenesFromAll([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - int sceneCount = targetScenes.Length; - - var loadedScenes = new List(sceneCount); - - sceneLoader.Manager.SceneLoaded += sceneLoaded; - sceneLoader.LoadScenes(targetScenes); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loadedScenes.Count == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneCount += loadingScene == null ? 0 : 1; - - var unloadedScenes = new List(sceneCount); - sceneLoader.Manager.SceneUnloaded += sceneUnloaded; - - loadedScenes.Clear(); - sceneLoader.TransitionToScenesFromAll(targetScenes, 0, loadingScene); - - watch.Restart(); - yield return new WaitUntil(() => (loadedScenes.Count == sceneCount && unloadedScenes.Count == sceneCount) || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - sceneLoader.Manager.SceneUnloaded -= sceneUnloaded; - - yield return new WaitUntil(() => sceneLoader.Manager.TotalSceneCount == targetScenes.Length); - - Assert.AreEqual(sceneCount, loadedScenes.Count); - Assert.AreEqual(sceneCount, unloadedScenes.Count); - - void sceneLoaded(Scene scene) - { - loadedScenes.Add(scene); - } - - void sceneUnloaded(Scene scene) - { - unloadedScenes.Add(scene); - } - } - - [UnityTest] - public IEnumerator Transition([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo targetScene, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - yield return LoadFirstScene(sceneLoader); - - List loadedScenes = new(); - int expectedScenes = loadingScene == null ? 1 : 2; - sceneLoader.Manager.SceneLoaded += sceneLoaded; - - sceneLoader.TransitionToScene(targetScene, loadingScene); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loadedScenes.Count == expectedScenes || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - - Assert.AreEqual(loadedScenes[expectedScenes - 1], sceneLoader.Manager.GetActiveScene()); - - yield return new WaitUntil(() => sceneLoader.Manager.TotalSceneCount == 1); - - void sceneLoaded(Scene scene) - { - loadedScenes.Add(scene); - } - } - - [UnityTest] - public IEnumerator Transition_NoSourceScene([ValueSource(nameof(_sceneLoaders))] ISceneLoader sceneLoader, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo targetScene, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - List loadedScenes = new(); - List unloadedScenes = new(); - int expectedLoadedScenes = loadingScene == null ? 1 : 2; - // If there's no loading scene, the scene loader will create a temporary scene - // for the transition, and will unload it after the transition is complete. - int expectedUnloadedScenes = 1; - - sceneLoader.Manager.SceneLoaded += sceneLoaded; - // The temporary scene unload does not go through the ISceneManager - SceneManager.sceneUnloaded += sceneUnloaded; - - sceneLoader.TransitionToScene(targetScene, loadingScene); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => (loadedScenes.Count == expectedLoadedScenes && unloadedScenes.Count == expectedUnloadedScenes) || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - SceneManager.sceneUnloaded -= sceneUnloaded; - - Assert.AreEqual(loadedScenes[expectedLoadedScenes - 1], sceneLoader.Manager.GetActiveScene()); - Assert.AreEqual(expectedUnloadedScenes, unloadedScenes.Count); - - yield return new WaitUntil(() => sceneLoader.Manager.TotalSceneCount == 1); - - void sceneLoaded(Scene scene) - { - loadedScenes.Add(scene); - } - - void sceneUnloaded(Scene scene) - { - unloadedScenes.Add(scene); - } - } - - /// - /// Required to test transition scenarios, otherwise the initial (test) scene would be unloaded and stop the tests. - /// - public static IEnumerator LoadFirstScene(ISceneLoader sceneLoader) - { - sceneLoader.Manager.SceneLoaded += sceneLoaded; - sceneLoader.LoadScene(new LoadSceneInfoName(SceneBuilder.SceneNames[1]), true); - Scene loadedScene = default; - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loadedScene.IsValid() && loadedScene.isLoaded || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - sceneLoader.Manager.SceneLoaded -= sceneLoaded; - - Assert.AreEqual(loadedScene.name, SceneBuilder.SceneNames[1]); - Assert.AreEqual(loadedScene, SceneManager.GetActiveScene()); - - void sceneLoaded(Scene scene) - { - loadedScene = scene; - } - } - } -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoaderTests.cs.meta b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoaderTests.cs.meta deleted file mode 100644 index 6151cab5..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoaderTests.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e251a454cd075084f9d1f26da82fa383 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoader_DisposeTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoader_DisposeTests.cs deleted file mode 100644 index 8826cdde..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoader_DisposeTests.cs +++ /dev/null @@ -1,298 +0,0 @@ -#if ENABLE_UNITASK -using Cysharp.Threading.Tasks; -#endif -using NUnit.Framework; -using System; -using System.Collections; -using System.Diagnostics; -using UnityEngine; -using UnityEngine.SceneManagement; -using UnityEngine.TestTools; - -namespace MyGameDevTools.SceneLoading.Tests -{ - public class SceneLoader_DisposeTests : SceneTestBase - { - // Note: These functions must create new scene managers to correctly test the dispose flow - static readonly Func[] _sceneLoaderCreateFuncs = new Func[] - { - () => new SceneLoaderAsync(new AdvancedSceneManager()), -#if ENABLE_UNITASK - () => new SceneLoaderUniTask(new AdvancedSceneManager()), -#endif - () => new SceneLoaderCoroutine(new AdvancedSceneManager()), - }; - - [UnityTest] - public IEnumerator Dispose_Simple([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc) - { - ISceneLoader loader = loaderCreateFunc(); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - - [UnityTest] - public IEnumerator Dispose_DuringLoadScene([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc) - { - ISceneLoader loader = loaderCreateFunc(); - loader.LoadScene(new LoadSceneInfoName(SceneBuilder.SceneNames[1])); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - - [UnityTest] - public IEnumerator Dispose_DuringLoadScenes([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes) - { - ISceneLoader loader = loaderCreateFunc(); - loader.LoadScenes(targetScenes); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - - [UnityTest] - public IEnumerator Dispose_DuringUnloadScene([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc) - { - ISceneLoader loader = loaderCreateFunc(); - yield return SceneLoaderTests.LoadFirstScene(loader); - - loader.UnloadScene(new LoadSceneInfoScene(loader.Manager.GetLastLoadedScene())); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - - [UnityTest] - public IEnumerator Dispose_DuringUnloadScenes([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes) - { - ISceneLoader loader = loaderCreateFunc(); - int sceneCount = targetScenes.Length; - loader.LoadScenes(targetScenes); - - var watch = new Stopwatch(); - watch.Start(); - yield return new WaitUntil(() => loader.Manager.LoadedSceneCount == sceneCount || watch.ElapsedMilliseconds > SceneTestEnvironment.DefaultTimeout); - watch.Stop(); - - loader.UnloadScenes(targetScenes); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - - [UnityTest] - public IEnumerator Dispose_DuringTransitionToScene([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo targetScene, [ValueSource(typeof(SceneLoaderTests), nameof(SceneLoaderTests.LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - ISceneLoader loader = loaderCreateFunc(); - yield return SceneLoaderTests.LoadFirstScene(loader); - - loader.TransitionToScene(targetScene, loadingScene); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - - [UnityTest] - public IEnumerator Dispose_DuringTransitionToScenes([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes, [ValueSource(typeof(SceneLoaderTests), nameof(SceneLoaderTests.LoadingSceneInfos))] ILoadSceneInfo loadingScene) - { - ISceneLoader loader = loaderCreateFunc(); - yield return SceneLoaderTests.LoadFirstScene(loader); - - loader.TransitionToScenes(targetScenes, 0, loadingScene); - Assert.DoesNotThrow(loader.Dispose); - yield return null; - } - -#if ENABLE_UNITASK - [UnityTest] - public IEnumerator Dispose_DuringLoadSceneAsync([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo targetScene) => UniTask.ToCoroutine(async () => - { - ISceneLoader loader = loaderCreateFunc(); - SceneLoaderType type = GetSceneLoaderType(loader); - - UniTask task = default; - task = type switch - { - SceneLoaderType.Async => ((ISceneLoaderAsync)loader).LoadSceneAsync(targetScene).AsTask().AsUniTask(), - SceneLoaderType.UniTask => ((ISceneLoaderUniTask)loader).LoadSceneAsync(targetScene), - SceneLoaderType.Coroutine => ((ISceneLoaderCoroutine)loader).LoadSceneAsync(targetScene).Task.AsUniTask(), - _ => throw new NotImplementedException($"Type {type} was not implemented"), - }; - loader.Dispose(); - - bool canceled = false; - try - { - await task; - } - catch (OperationCanceledException) - { - canceled = true; - } - Assert.True(canceled); - }); - - [UnityTest] - public IEnumerator Dispose_DuringLoadScenesAsync([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes) => UniTask.ToCoroutine(async () => - { - ISceneLoader loader = loaderCreateFunc(); - SceneLoaderType type = GetSceneLoaderType(loader); - - UniTask task = default; - task = type switch - { - SceneLoaderType.Async => ((ISceneLoaderAsync)loader).LoadScenesAsync(targetScenes).AsTask().AsUniTask(), - SceneLoaderType.UniTask => ((ISceneLoaderUniTask)loader).LoadScenesAsync(targetScenes), - SceneLoaderType.Coroutine => ((ISceneLoaderCoroutine)loader).LoadScenesAsync(targetScenes).Task.AsUniTask(), - _ => throw new NotImplementedException($"Type {type} was not implemented"), - }; - loader.Dispose(); - - bool canceled = false; - try - { - await task; - } - catch (OperationCanceledException) - { - canceled = true; - } - Assert.True(canceled); - }); - - [UnityTest] - public IEnumerator Dispose_DuringUnloadSceneAsync([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc) => UniTask.ToCoroutine(async () => - { - ISceneLoader loader = loaderCreateFunc(); - await SceneLoaderTests.LoadFirstScene(loader); - - SceneLoaderType type = GetSceneLoaderType(loader); - ILoadSceneInfo sceneInfo = new LoadSceneInfoScene(loader.Manager.GetLastLoadedScene()); - - UniTask task = default; - task = type switch - { - SceneLoaderType.Async => ((ISceneLoaderAsync)loader).UnloadSceneAsync(sceneInfo).AsTask().AsUniTask(), - SceneLoaderType.UniTask => ((ISceneLoaderUniTask)loader).UnloadSceneAsync(sceneInfo), - SceneLoaderType.Coroutine => ((ISceneLoaderCoroutine)loader).UnloadSceneAsync(sceneInfo).Task.AsUniTask(), - _ => throw new NotImplementedException($"Type {type} was not implemented"), - }; - loader.Dispose(); - - bool canceled = false; - try - { - await task; - } - catch (OperationCanceledException) - { - canceled = true; - } - Assert.True(canceled); - }); - - [UnityTest] - public IEnumerator Dispose_DuringUnloadScenesAsync([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes) => UniTask.ToCoroutine(async () => - { - ISceneLoader loader = loaderCreateFunc(); - int sceneCount = targetScenes.Length; - loader.LoadScenes(targetScenes); - - await UniTask.WaitUntil(() => loader.Manager.LoadedSceneCount == sceneCount).TimeoutWithoutException(TimeSpan.FromMilliseconds(SceneTestEnvironment.DefaultTimeout)); - - SceneLoaderType type = GetSceneLoaderType(loader); - - UniTask task = default; - task = type switch - { - SceneLoaderType.Async => ((ISceneLoaderAsync)loader).UnloadScenesAsync(targetScenes).AsTask().AsUniTask(), - SceneLoaderType.UniTask => ((ISceneLoaderUniTask)loader).UnloadScenesAsync(targetScenes), - SceneLoaderType.Coroutine => ((ISceneLoaderCoroutine)loader).UnloadScenesAsync(targetScenes).Task.AsUniTask(), - _ => throw new NotImplementedException($"Type {type} was not implemented"), - }; - loader.Dispose(); - - bool canceled = false; - try - { - await task; - } - catch (OperationCanceledException) - { - canceled = true; - } - Assert.True(canceled); - }); - - [UnityTest] - public IEnumerator Dispose_DuringTransitionToSceneAsync([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo targetScene, [ValueSource(typeof(SceneLoaderTests), nameof(SceneLoaderTests.LoadingSceneInfos))] ILoadSceneInfo loadingScene) => UniTask.ToCoroutine(async () => - { - ISceneLoader loader = loaderCreateFunc(); - await SceneLoaderTests.LoadFirstScene(loader); - - SceneLoaderType type = GetSceneLoaderType(loader); - - UniTask task = default; - task = type switch - { - SceneLoaderType.Async => ((ISceneLoaderAsync)loader).TransitionToSceneAsync(targetScene, loadingScene).AsTask().AsUniTask(), - SceneLoaderType.UniTask => ((ISceneLoaderUniTask)loader).TransitionToSceneAsync(targetScene, loadingScene), - SceneLoaderType.Coroutine => ((ISceneLoaderCoroutine)loader).TransitionToSceneAsync(targetScene, loadingScene).Task.AsUniTask(), - _ => throw new NotImplementedException($"Type {type} was not implemented"), - }; - loader.Dispose(); - - bool canceled = false; - try - { - await task; - } - catch (OperationCanceledException) - { - canceled = true; - } - Assert.True(canceled); - }); - - [UnityTest] - public IEnumerator Dispose_DuringTransitionToScenesAsync([ValueSource(nameof(_sceneLoaderCreateFuncs))] Func loaderCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] targetScenes, [ValueSource(typeof(SceneLoaderTests), nameof(SceneLoaderTests.LoadingSceneInfos))] ILoadSceneInfo loadingScene) => UniTask.ToCoroutine(async () => - { - ISceneLoader loader = loaderCreateFunc(); - await SceneLoaderTests.LoadFirstScene(loader); - - SceneLoaderType type = GetSceneLoaderType(loader); - - UniTask task = default; - task = type switch - { - SceneLoaderType.Async => ((ISceneLoaderAsync)loader).TransitionToScenesAsync(targetScenes, 0, loadingScene).AsTask().AsUniTask(), - SceneLoaderType.UniTask => ((ISceneLoaderUniTask)loader).TransitionToScenesAsync(targetScenes, 0, loadingScene), - SceneLoaderType.Coroutine => ((ISceneLoaderCoroutine)loader).TransitionToScenesAsync(targetScenes, 0, loadingScene).Task.AsUniTask(), - _ => throw new NotImplementedException($"Type {type} was not implemented"), - }; - loader.Dispose(); - - bool canceled = false; - try - { - await task; - } - catch (OperationCanceledException) - { - canceled = true; - } - Assert.True(canceled); - }); -#endif - - SceneLoaderType GetSceneLoaderType(ISceneLoader loader) - { - if (loader is SceneLoaderAsync) - return SceneLoaderType.Async; -#if ENABLE_UNITASK - else if (loader is SceneLoaderUniTask) - return SceneLoaderType.UniTask; -#endif - else if (loader is SceneLoaderCoroutine) - return SceneLoaderType.Coroutine; - - throw new Exception("Unexpected ISceneLoader type"); - } - } -} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoader_DisposeTests.cs.meta b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoader_DisposeTests.cs.meta deleted file mode 100644 index d88aa41b..00000000 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneLoader_DisposeTests.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: e05b4c8d6f189c641a7e50831262ab57 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManagerTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManagerTests.cs index ba0c6bfa..2b6b05c7 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManagerTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManagerTests.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; +using System.Threading.Tasks; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.TestTools; @@ -12,9 +13,15 @@ namespace MyGameDevTools.SceneLoading.Tests { public partial class SceneManagerTests : SceneTestBase { - static readonly bool[] _setActiveParameterValues = new bool[] { true, false }; + public static readonly ILoadSceneInfo[] LoadingSceneInfos = new ILoadSceneInfo[] + { + null, + new LoadSceneInfoName(SceneBuilder.SceneNames[3]), + new LoadSceneInfoName(SceneBuilder.SceneNames[0]), + }; - static readonly int[] _setIndexActiveParameterValues = new int[] { -1, 1 }; + static readonly bool[] _setActiveParameterValues = new[] { false, true }; + static readonly int[] _setIndexActiveParameterValues = new[] { -1, 1 }; int _scenesActivated; int _scenesUnloaded; @@ -61,7 +68,7 @@ public IEnumerator Constructor_AddLoadedScenes() { yield return SceneManager.LoadSceneAsync(SceneBuilder.SceneNames[1], LoadSceneMode.Additive); - ISceneManager sceneManager = new AdvancedSceneManager(true); + ISceneManager sceneManager = new CoreSceneManager(true); Assert.AreEqual(2, sceneManager.LoadedSceneCount); Assert.AreEqual(sceneManager.TotalSceneCount, sceneManager.LoadedSceneCount); @@ -73,7 +80,7 @@ public IEnumerator Constructor_InitializationScenes() yield return SceneManager.LoadSceneAsync(SceneBuilder.SceneNames[1], LoadSceneMode.Additive); Scene loadedScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); - ISceneManager sceneManager = new AdvancedSceneManager(new Scene[] { loadedScene }); + ISceneManager sceneManager = new CoreSceneManager(new Scene[] { loadedScene }); Assert.AreEqual(1, sceneManager.LoadedSceneCount); Assert.AreEqual(sceneManager.TotalSceneCount, sceneManager.LoadedSceneCount); @@ -85,16 +92,16 @@ public IEnumerator InitializationScene_Unload() yield return SceneManager.LoadSceneAsync(SceneBuilder.SceneNames[1], LoadSceneMode.Additive); Scene loadedScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); - ISceneManager sceneManager = new AdvancedSceneManager(new Scene[] { loadedScene }); + ISceneManager sceneManager = new CoreSceneManager(new Scene[] { loadedScene }); - WaitTask waitTask = default; - Assert.DoesNotThrow(() => waitTask = new(sceneManager.UnloadSceneAsync(new LoadSceneInfoScene(loadedScene)).AsTask())); + WaitTask waitTask = default; + Assert.DoesNotThrow(() => waitTask = sceneManager.UnloadAsync(new SceneParameters(new LoadSceneInfoScene(loadedScene))).ToWaitTask()); yield return waitTask; } [UnityTest] - public IEnumerator SetActive_NotThroughManager([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + public IEnumerator SetActive_NotThroughmanager([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) { Scene loadedScene = default; SceneManager.sceneLoaded += assignLoadedScene; @@ -104,7 +111,7 @@ public IEnumerator SetActive_NotThroughManager([ValueSource(typeof(SceneTestEnvi Assert.Throws(() => manager.SetActiveScene(loadedScene)); - yield return SceneManager.UnloadSceneAsync(SceneBuilder.SceneNames[1]); + yield return SceneManager.UnloadSceneAsync(loadedScene); void assignLoadedScene(Scene scene, LoadSceneMode loadSceneMode) { @@ -122,11 +129,11 @@ public void GetActiveScene_Empty([ValueSource(typeof(SceneTestEnvironment), name [UnityTest] public IEnumerator GetActiveScene_Valid([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) { - var loadTask = manager.LoadSceneAsync(new LoadSceneInfoName(SceneBuilder.SceneNames[1]), true).AsTask(); + var loadTask = manager.LoadAsync(new SceneParameters(new LoadSceneInfoName(SceneBuilder.SceneNames[1]), true)); - yield return new WaitTask(loadTask); + yield return loadTask.ToWaitTask(); - var loadedScene = loadTask.Result; + Scene loadedScene = loadTask.Result; var managerActiveScene = manager.GetActiveScene(); Assert.True(loadedScene.IsValid()); @@ -143,7 +150,7 @@ public void GetLoadedSceneByName_Invalid([ValueSource(typeof(SceneTestEnvironmen [UnityTest] public IEnumerator GetLoadedSceneByName_Valid([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) { - yield return new WaitTask(manager.LoadSceneAsync(new LoadSceneInfoName(SceneBuilder.SceneNames[1])).AsTask()); + yield return manager.LoadAsync(new SceneParameters(new LoadSceneInfoName(SceneBuilder.SceneNames[1]))).ToWaitTask(); Assert.True(manager.GetLoadedSceneByName(SceneBuilder.SceneNames[1]).IsValid()); } @@ -163,79 +170,34 @@ public void GetLoadedSceneAt_IndexError([ValueSource(typeof(SceneTestEnvironment } [UnityTest] - public IEnumerator LoadScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo, [ValueSource(nameof(_setActiveParameterValues))] bool setActive) - { - var loadTask = manager.LoadSceneAsync(sceneInfo, setActive).AsTask(); - - Scene eventScene = default; - manager.SceneLoaded += setEventScene; - - yield return new WaitTask(loadTask); - - manager.SceneLoaded -= setEventScene; - var loadedScene = loadTask.Result; - - Assert.AreEqual(1, manager.LoadedSceneCount); - Assert.That(setActive ? loadedScene == manager.GetActiveScene() : loadedScene != manager.GetActiveScene()); - Assert.AreEqual(loadedScene, manager.GetLastLoadedScene()); - Assert.AreEqual(loadedScene, manager.GetLoadedSceneByName(loadedScene.name)); - Assert.AreEqual(loadedScene, eventScene); - Assert.AreEqual(1, _scenesLoaded); - Assert.AreEqual(0, _scenesUnloaded); - Assert.AreEqual(setActive ? 1 : 0, _scenesActivated); - - void setEventScene(Scene scene) => eventScene = scene; - } - - [UnityTest] - public IEnumerator LoadScenes([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos, [ValueSource(nameof(_setIndexActiveParameterValues))] int setIndexActive) + public IEnumerator Load([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { - int scenesToLoad = sceneInfos.Length; - var reportedScenes = new List(scenesToLoad); - manager.SceneLoaded += reportSceneLoaded; - var progress = new SimpleProgress(); - var loadTask = manager.LoadScenesAsync(sceneInfos, setIndexActive, progress).AsTask(); - - Assert.AreEqual(0, progress.Value); - - yield return new WaitTask(loadTask); - - manager.SceneLoaded -= reportSceneLoaded; - var loadedScenes = loadTask.Result; - - Assert.AreEqual(1, progress.Value); - Assert.AreEqual(scenesToLoad, loadedScenes.Length); - Assert.AreEqual(scenesToLoad, reportedScenes.Count); - Assert.AreEqual(scenesToLoad, manager.LoadedSceneCount); - if (setIndexActive >= 0) - Assert.AreEqual(manager.GetActiveScene(), loadedScenes[setIndexActive]); - Assert.AreEqual(scenesToLoad, _scenesLoaded); - Assert.AreEqual(0, _scenesUnloaded); - Assert.AreEqual(setIndexActive >= 0 ? 1 : 0, _scenesActivated); - - void reportSceneLoaded(Scene loadedScene) => reportedScenes.Add(loadedScene); + return Load_Template(manager, () => manager.LoadAsync(sceneParameters, progress), progress, sceneParameters.Length, sceneParameters.GetIndexToActivate()); } [UnityTest] - public IEnumerator LoadScene_Progress([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo, [ValueSource(nameof(_setActiveParameterValues))] bool setActive) + public IEnumerator Load_Progress([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { var progress = new SimpleProgress(); Assert.AreEqual(0, progress.Value); - yield return new WaitTask(manager.LoadSceneAsync(sceneInfo, setActive, progress).AsTask()); + yield return manager.LoadAsync(sceneParameters, progress).ToWaitTask(); Assert.AreEqual(1, progress.Value); } [UnityTest] - public IEnumerator LoadScene_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos, [ValueSource(nameof(_setActiveParameterValues))] bool setActive) + public IEnumerator Load_Stress([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { - var length = sceneInfos.Length; + ILoadSceneInfo[] sceneInfos = sceneParameters.GetLoadSceneInfos(); + int length = sceneInfos.Length; + bool setActive = sceneParameters.GetIndexToActivate() == 1; + var loadedScenes = new Scene[length]; for (int i = 0; i < length; i++) { - var loadTask = manager.LoadSceneAsync(sceneInfos[i], setActive).AsTask(); - yield return new WaitTask(loadTask); + var loadTask = manager.LoadAsync(new SceneParameters(sceneInfos[i], setActive)); + yield return loadTask.ToWaitTask(); loadedScenes[i] = loadTask.Result; } @@ -252,68 +214,195 @@ public IEnumerator LoadScene_Multiple([ValueSource(typeof(SceneTestEnvironment), } [Test] - public void LoadScene_NotInBuild([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + public void Load_NotInBuild([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) { var sceneName = "not-a-real-scene"; - if (manager is SceneManager || manager is AdvancedSceneManager) - LogAssert.Expect(LogType.Error, new Regex("'not-a-real-scene' couldn't be loaded")); - var wait = new WaitTask(manager.LoadSceneAsync(new LoadSceneInfoName(sceneName), false).AsTask()); + LogAssert.Expect(LogType.Error, new Regex("'not-a-real-scene' couldn't be loaded")); + var wait = manager.LoadAsync(sceneName).ToWaitTask(); Assert.Throws(() => wait.MoveNext()); } [UnityTest] - public IEnumerator UnloadScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo, [ValueSource(nameof(_setActiveParameterValues))] bool setActive) + public IEnumerator Unload([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { - yield return new WaitTask(manager.LoadSceneAsync(sceneInfo, setActive).AsTask()); + yield return Unload_Template(manager, () => manager.LoadAsync(sceneParameters), () => manager.UnloadAsync(sceneParameters), sceneParameters.Length); + } - Scene eventScene = default; - manager.SceneUnloaded += setEventScene; + [Test] + public void Unload_NotLoaded([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var sceneName = "not-a-real-scene"; + if (manager is not SceneManager) + LogAssert.Expect(LogType.Warning, new Regex("Unable to get an ISceneData with the load scene info")); + var wait = manager.UnloadAsync(sceneName).ToWaitTask(); + Assert.Throws(() => wait.MoveNext()); + } - var workingScene = manager.GetLastLoadedScene(); + [UnityTest] + public IEnumerator Transition([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment. + TransitionSceneParametersList))] SceneParameters sceneParameters, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) + { + yield return Transition_Template(manager, () => manager.TransitionAsync(sceneParameters, loadingScene), sceneParameters.Length, sceneParameters.GetIndexToActivate()); + } - var task = manager.UnloadSceneAsync(new LoadSceneInfoScene(workingScene)).AsTask(); - yield return new WaitTask(task); + [UnityTest] + public IEnumerator Transition_NoSourceScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo targetScene, [ValueSource(nameof(LoadingSceneInfos))] ILoadSceneInfo loadingScene) + { + int expectedLoadedScenes = loadingScene == null ? 1 : 2; + // If there's no loading scene, the scene manager will create a temporary scene + // for the transition, and will unload it after the transition is complete. + int expectedUnloadedScenes = 1; - manager.SceneUnloaded -= setEventScene; - var unloadedScene = task.Result; + int unloadedScenesCount = 0; - Assert.AreEqual(workingScene, unloadedScene); - Assert.AreEqual(workingScene, eventScene); - Assert.IsFalse(workingScene.isLoaded); - Assert.IsFalse(manager.GetActiveScene().IsValid()); - Assert.AreEqual(0, manager.LoadedSceneCount); - Assert.AreEqual(1, _scenesLoaded); - Assert.AreEqual(1, _scenesUnloaded); - Assert.AreEqual(setActive ? 2 : 0, _scenesActivated, "Activated scenes did not match expectation"); + // The temporary scene unload does not go through the ISceneManager + SceneManager.sceneUnloaded += sceneUnloaded; + + var task = manager.TransitionAsync(new SceneParameters(targetScene, true), loadingScene); + + yield return task.ToWaitTask(); + + Scene loadedScene = task.Result; + + SceneManager.sceneUnloaded -= sceneUnloaded; + + Assert.AreEqual(loadedScene, manager.GetActiveScene()); + Assert.AreEqual(expectedLoadedScenes, _scenesLoaded); + Assert.AreEqual(expectedUnloadedScenes, unloadedScenesCount); + + yield return new WaitUntil(() => manager.TotalSceneCount == 1); + + void sceneUnloaded(Scene scene) + { + unloadedScenesCount++; + } + } + + [UnityTest] + public IEnumerator Load_ByInfo_UnloadByScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo) + { + var task = manager.LoadAsync(new SceneParameters(sceneInfo)); + + yield return task.ToWaitTask(); + + Scene scene = task.Result; + + task = manager.UnloadAsync(scene); + + yield return task.ToWaitTask(); + + Assert.Zero(manager.LoadedSceneCount); + } + + [UnityTest] + public IEnumerator Load_ByInfo_UnloadByName([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList_NoAddressable))] ILoadSceneInfo sceneInfo) + { + var task = manager.LoadAsync(new SceneParameters(sceneInfo)); + + yield return task.ToWaitTask(); + + task = manager.UnloadAsync(SceneBuilder.SceneNames[1]); + + yield return task.ToWaitTask(); + + Assert.Zero(manager.LoadedSceneCount); + } + + [UnityTest] + public IEnumerator Load_ByInfo_UnloadByPath([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList_NoAddressable))] ILoadSceneInfo sceneInfo) + { + var task = manager.LoadAsync(new SceneParameters(sceneInfo)); + + yield return task.ToWaitTask(); + + task = manager.UnloadAsync(SceneBuilder.ScenePaths[1]); - void setEventScene(Scene scene) => eventScene = scene; + yield return task.ToWaitTask(); + + Assert.Zero(manager.LoadedSceneCount); } [UnityTest] - public IEnumerator UnloadScenes([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos, [ValueSource(nameof(_setIndexActiveParameterValues))] int setIndexActive) + public IEnumerator Load_ByInfo_UnloadByIndex([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList_NoAddressable))] ILoadSceneInfo sceneInfo) { - var loadTask = manager.LoadScenesAsync(sceneInfos, setIndexActive).AsTask(); - yield return new WaitTask(loadTask); - var loadedSceneHandles = loadTask.Result.Select(s => s.handle).ToArray(); + var task = manager.LoadAsync(new SceneParameters(sceneInfo)); + + yield return task.ToWaitTask(); + +#if UNITY_EDITOR + task = manager.UnloadAsync(1); +#else + task = manager.UnloadAsync(2); +#endif - int scenesToUnload = sceneInfos.Length; - var reportedScenes = new List(scenesToUnload); + yield return task.ToWaitTask(); + + Assert.Zero(manager.LoadedSceneCount); + } + + public IEnumerator Load_Template(ISceneManager manager, Func> loadTask, SimpleProgress progress, int sceneCount, int setIndexActive) + { + var reportedScenes = new List(sceneCount); + manager.SceneLoaded += reportSceneLoaded; + + var task = loadTask(); + + Assert.AreEqual(0, progress.Value); + + yield return task.ToWaitTask(); + + manager.SceneLoaded -= reportSceneLoaded; + Scene[] loadedScenes = task.Result; + + Assert.AreEqual(1, progress.Value); + Assert.AreEqual(sceneCount, loadedScenes.Length); + Assert.AreEqual(sceneCount, reportedScenes.Count); + Assert.AreEqual(sceneCount, manager.LoadedSceneCount); + if (setIndexActive >= 0) + Assert.AreEqual(manager.GetActiveScene(), loadedScenes[setIndexActive]); + Assert.AreEqual(sceneCount, _scenesLoaded); + Assert.AreEqual(0, _scenesUnloaded); + Assert.AreEqual(setIndexActive >= 0 ? 1 : 0, _scenesActivated); + + void reportSceneLoaded(Scene loadedScene) => reportedScenes.Add(loadedScene); + } + + public IEnumerator Transition_Template(ISceneManager manager, Func> transitionTask, int sceneCount, int setIndexActive) + { + yield return LoadFirstScene(manager); + + var task = transitionTask(); + yield return task.ToWaitTask(); + + Scene[] loadedScenes = task.Result; + Assert.AreEqual(sceneCount, loadedScenes.Length); + Assert.AreEqual(loadedScenes[setIndexActive], manager.GetActiveScene()); + + yield return new WaitUntil(() => manager.TotalSceneCount == sceneCount); + } + + public IEnumerator Unload_Template(ISceneManager manager, Func> loadTask, Func> unloadTask, int sceneCount) + { + var load = loadTask(); + yield return load.ToWaitTask(); + var loadedSceneHandles = load.Result.GetScenes().Select(s => s.handle).ToArray(); + + var reportedScenes = new List(sceneCount); manager.SceneUnloaded += reportSceneUnloaded; - var task = manager.UnloadScenesAsync(sceneInfos).AsTask(); - yield return new WaitTask(task); + var unload = unloadTask(); + yield return unload.ToWaitTask(); manager.SceneUnloaded -= reportSceneUnloaded; - var unloadedScenes = task.Result; + Scene[] unloadedScenes = unload.Result; - Assert.AreEqual(scenesToUnload, unloadedScenes.Length); - Assert.AreEqual(scenesToUnload, reportedScenes.Count); + Assert.AreEqual(sceneCount, unloadedScenes.Length); + Assert.AreEqual(sceneCount, reportedScenes.Count); Assert.AreEqual(0, manager.LoadedSceneCount); - Assert.AreEqual(scenesToUnload, _scenesLoaded); - Assert.AreEqual(scenesToUnload, _scenesUnloaded); - Assert.AreEqual(setIndexActive >= 0 ? 2 : 0, _scenesActivated, "Activated scenes did not match expectation"); + Assert.AreEqual(sceneCount, _scenesLoaded); + Assert.AreEqual(sceneCount, _scenesUnloaded); - for (int i = 0; i < scenesToUnload; i++) + for (int i = 0; i < sceneCount; i++) Assert.True(hasReference(loadedSceneHandles[i], reportedScenes)); void reportSceneUnloaded(Scene loadedScene) => reportedScenes.Add(loadedScene); @@ -330,31 +419,10 @@ bool hasReference(int handle, List scenes) } } - [Test] - public void UnloadScene_NotLoaded([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) - { - var sceneName = "not-a-real-scene"; - if (manager is not AdvancedSceneManager) - LogAssert.Expect(LogType.Warning, new Regex("Some of the scenes could not be found loaded")); - var wait = new WaitTask(manager.UnloadSceneAsync(new LoadSceneInfoName(sceneName)).AsTask()); - Assert.Throws(() => wait.MoveNext()); - } - - [UnityTest] - public IEnumerator LoadByInfo_UnloadByScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo) - { - var task = manager.LoadSceneAsync(sceneInfo).AsTask(); - - yield return new WaitTask(task); - - var scene = task.Result; - - task = manager.UnloadSceneAsync(new LoadSceneInfoScene(scene)).AsTask(); - - yield return new WaitTask(task); - - Assert.Zero(manager.LoadedSceneCount); - } + /// + /// Required to test some transition scenarios. + /// + public static WaitTask LoadFirstScene(ISceneManager sceneManager) => sceneManager.LoadAsync(SceneBuilder.SceneNames[1], true).ToWaitTask(); void ReportSceneActivation(Scene previousScene, Scene newScene) { diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_AssetReferenceTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_AssetReferenceTests.cs index 583fb04f..b6a8e458 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_AssetReferenceTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_AssetReferenceTests.cs @@ -12,6 +12,7 @@ namespace MyGameDevTools.SceneLoading.Tests // Unity Editor sessions. So, we must test AssetReference load scene infos "manually". public partial class SceneManagerTests { + AssetReference[] _assetReferences; ILoadSceneInfo[] _assetReferenceLoadSceneInfos; [OneTimeSetUp] @@ -21,6 +22,7 @@ public void AssetReferenceSetup() operationHandle.WaitForCompletion(); SceneReferenceData sceneReferenceData = operationHandle.Result; + _assetReferences = sceneReferenceData.sceneReferences.ToArray(); _assetReferenceLoadSceneInfos = new ILoadSceneInfo[] { @@ -34,27 +36,15 @@ public void AssetReferenceSetup() } [UnityTest] - public IEnumerator LoadScene_AssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(nameof(_setActiveParameterValues))] bool setActive) + public IEnumerator Load_AssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(nameof(_setIndexActiveParameterValues))] int setIndexActive) { - yield return LoadScene(manager, _assetReferenceLoadSceneInfos[1], setActive); + yield return Load(manager, new SceneParameters(_assetReferenceLoadSceneInfos, setIndexActive)); } [UnityTest] - public IEnumerator LoadScenes_AssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(nameof(_setIndexActiveParameterValues))] int setIndexActive) + public IEnumerator Unload_AssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) { - yield return LoadScenes(manager, _assetReferenceLoadSceneInfos, setIndexActive); - } - - [UnityTest] - public IEnumerator UnloadScene_AssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(nameof(_setActiveParameterValues))] bool setActive) - { - yield return UnloadScene(manager, _assetReferenceLoadSceneInfos[1], setActive); - } - - [UnityTest] - public IEnumerator UnloadScenes_AssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(nameof(_setIndexActiveParameterValues))] int setIndexActive) - { - yield return UnloadScenes(manager, _assetReferenceLoadSceneInfos, setIndexActive); + yield return Unload(manager, new SceneParameters(_assetReferenceLoadSceneInfos)); } } } diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_CancellationTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_CancellationTests.cs index a2baa611..1277f0fd 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_CancellationTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_CancellationTests.cs @@ -1,7 +1,6 @@ using NUnit.Framework; using System.Collections; using System.Threading; -using UnityEngine.SceneManagement; using UnityEngine.TestTools; namespace MyGameDevTools.SceneLoading.Tests @@ -9,35 +8,10 @@ namespace MyGameDevTools.SceneLoading.Tests public class SceneManager_CancellationTests : SceneTestBase { [UnityTest] - public IEnumerator Cancellation_DuringLoadScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo) + public IEnumerator Cancellation_DuringLoad([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { CancellationTokenSource tokenSource = new(); - WaitTask waitTask = new(manager.LoadSceneAsync(sceneInfo, token: tokenSource.Token).AsTask()); - tokenSource.Cancel(); - yield return waitTask; - Assert.That(waitTask.Task.IsCompleted); - tokenSource.Dispose(); - } - - [UnityTest] - public IEnumerator Cancellation_DuringLoadScenes([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos) - { - CancellationTokenSource tokenSource = new(); - WaitTask waitTask = new(manager.LoadScenesAsync(sceneInfos, token: tokenSource.Token).AsTask()); - tokenSource.Cancel(); - yield return waitTask; - Assert.True(waitTask.Task.IsCanceled); - tokenSource.Dispose(); - } - - [UnityTest] - public IEnumerator Cancellation_DuringUnloadScene([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo) - { - CancellationTokenSource tokenSource = new(); - WaitTask waitTask = new(manager.LoadSceneAsync(sceneInfo).AsTask()); - yield return waitTask; - - waitTask = new(manager.UnloadSceneAsync(sceneInfo, token: tokenSource.Token).AsTask()); + WaitTask waitTask = manager.LoadAsync(sceneParameters, token: tokenSource.Token).ToWaitTask(); tokenSource.Cancel(); yield return waitTask; Assert.True(waitTask.Task.IsCanceled); @@ -45,13 +19,13 @@ public IEnumerator Cancellation_DuringUnloadScene([ValueSource(typeof(SceneTestE } [UnityTest] - public IEnumerator Cancellation_DuringUnloadScenes([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos) + public IEnumerator Cancellation_DuringUnload([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { CancellationTokenSource tokenSource = new(); - WaitTask waitTask = new(manager.LoadScenesAsync(sceneInfos).AsTask()); + WaitTask waitTask = manager.LoadAsync(sceneParameters).ToWaitTask(); yield return waitTask; - waitTask = new(manager.UnloadScenesAsync(sceneInfos, token: tokenSource.Token).AsTask()); + waitTask = new(manager.UnloadAsync(sceneParameters, token: tokenSource.Token)); tokenSource.Cancel(); yield return waitTask; Assert.True(waitTask.Task.IsCanceled); diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_DisposeTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_DisposeTests.cs index 3acf247b..105751a1 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_DisposeTests.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_DisposeTests.cs @@ -1,17 +1,18 @@ using NUnit.Framework; using System; using System.Collections; -using UnityEngine.SceneManagement; +using System.Threading.Tasks; +using UnityEngine; using UnityEngine.TestTools; namespace MyGameDevTools.SceneLoading.Tests { public class SceneManager_DisposeTests : SceneTestBase { - // Note: These functions must create new scene managers to correctly test the dispose flow + // Note: These functions must create new Scene Managers to correctly test the dispose flow static readonly Func[] _sceneManagerCreateFuncs = new Func[] { - () => new AdvancedSceneManager(), + () => new CoreSceneManager(), }; [Test] @@ -22,49 +23,52 @@ public void Dispose_Simple([ValueSource(nameof(_sceneManagerCreateFuncs))] Func< } [UnityTest] - public IEnumerator Dispose_DuringLoadScene([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo) + public IEnumerator Dispose_DuringLoad([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { ISceneManager manager = managerCreateFunc(); - WaitTask waitTask = new(manager.LoadSceneAsync(sceneInfo).AsTask()); - manager.Dispose(); - yield return waitTask; - Assert.That(waitTask.Task.IsCompleted); - } - - [UnityTest] - public IEnumerator Dispose_DuringLoadScenes([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos) - { - ISceneManager manager = managerCreateFunc(); - WaitTask waitTask = new(manager.LoadScenesAsync(sceneInfos).AsTask()); + WaitTask waitTask = manager.LoadAsync(sceneParameters).ToWaitTask(); manager.Dispose(); yield return waitTask; Assert.True(waitTask.Task.IsCanceled); } [UnityTest] - public IEnumerator Dipose_DuringUnloadScene([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SingleLoadSceneInfoList))] ILoadSceneInfo sceneInfo) + public IEnumerator Dipose_DuringUnload([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) { ISceneManager manager = managerCreateFunc(); - WaitTask waitTask = new(manager.LoadSceneAsync(sceneInfo).AsTask()); + WaitTask waitTask = manager.LoadAsync(sceneParameters).ToWaitTask(); yield return waitTask; - waitTask = new(manager.UnloadSceneAsync(sceneInfo).AsTask()); + waitTask = new(manager.UnloadAsync(sceneParameters)); manager.Dispose(); yield return waitTask; Assert.True(waitTask.Task.IsCanceled); } [UnityTest] - public IEnumerator Dipose_DuringUnloadScenes([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.MultipleLoadSceneInfoList))] ILoadSceneInfo[] sceneInfos) + public IEnumerator Dispose_DuringTransition([ValueSource(nameof(_sceneManagerCreateFuncs))] Func managerCreateFunc, [ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.TransitionSceneParametersList))] SceneParameters sceneParameters, [ValueSource(typeof(SceneManagerTests), nameof(SceneManagerTests.LoadingSceneInfos))] ILoadSceneInfo loadingScene) { - ISceneManager manager = managerCreateFunc(); - WaitTask waitTask = new(manager.LoadScenesAsync(sceneInfos).AsTask()); - yield return waitTask; + async Task Test() + { + ISceneManager manager = managerCreateFunc(); + await SceneManagerTests.LoadFirstScene(manager).Task; - waitTask = new(manager.UnloadScenesAsync(sceneInfos).AsTask()); - manager.Dispose(); - yield return waitTask; - Assert.True(waitTask.Task.IsCanceled); + var task = manager.TransitionAsync(sceneParameters, loadingScene); + manager.Dispose(); + + bool canceled = false; + try + { + await task; + } + catch (OperationCanceledException) + { + canceled = true; + } + Assert.True(canceled); + return true; + } + return new WaitTask(Test()); } } } \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_ExtensionTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_ExtensionTests.cs new file mode 100644 index 00000000..0f578e82 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_ExtensionTests.cs @@ -0,0 +1,185 @@ +using System.Collections; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine.TestTools; + +namespace MyGameDevTools.SceneLoading.Tests +{ + public partial class SceneManagerTests + { + readonly int[] _buildIndexes = new[] { 1, 2, 3 }; + + [UnityTest] + public IEnumerator Load_Extension_ByIndex([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAsync(1, true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_ByIndex_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAsync(_buildIndexes, 1, progress), progress, _buildIndexes.Length, 1); + } + + [UnityTest] + public IEnumerator Load_Extension_ByName([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAsync(SceneBuilder.SceneNames[1], true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_ByName_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAsync(SceneBuilder.SceneNames, 1, progress), progress, SceneBuilder.SceneNames.Length, 1); + } + +#if ENABLE_ADDRESSABLES + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAddress([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAddressableAsync(SceneBuilder.SceneNames[1], true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAddress_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAddressableAsync(SceneBuilder.SceneNames, 1, progress), progress, SceneBuilder.SceneNames.Length, 1); + } + + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAddressableAsync(_assetReferences[1], true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAssetReference_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + var progress = new SimpleProgress(); + yield return Load_Template(manager, () => manager.LoadAddressableAsync(_assetReferences, 1, progress), progress, _assetReferences.Length, 1); + } +#endif + + [UnityTest] + public IEnumerator Transition_Extension_ByIndex([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAsync(1, 1), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_ByIndex_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAsync(_buildIndexes, 1), _buildIndexes.Length, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_ByName([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAsync(SceneBuilder.SceneNames[1], SceneBuilder.SceneNames[0]), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_ByName_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAsync(SceneBuilder.SceneNames, SceneBuilder.ScenePaths[0]), SceneBuilder.SceneNames.Length, 0); + } + +#if ENABLE_ADDRESSABLES + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAddress([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAddressableAsync(SceneBuilder.SceneNames[1], SceneBuilder.SceneNames[0]), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAddress_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAddressableAsync(SceneBuilder.SceneNames, SceneBuilder.SceneNames[0]), SceneBuilder.SceneNames.Length, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAddressableAsync(_assetReferences[1], _assetReferences[0]), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAssetReference_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Transition_Template(manager, () => manager.TransitionAddressableAsync(_assetReferences, _assetReferences[0]), SceneBuilder.SceneNames.Length, 0); + } +#endif + + [UnityTest] + public IEnumerator Unload_Extension_ByIndex([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAsync(1, true), () => manager.UnloadAsync(1), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByIndex_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAsync(_buildIndexes, 0), () => manager.UnloadAsync(_buildIndexes), _buildIndexes.Length); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByName([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAsync(SceneBuilder.SceneNames[1], true), () => manager.UnloadAsync(SceneBuilder.SceneNames[1]), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByName_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAsync(SceneBuilder.SceneNames, 0), () => manager.UnloadAsync(SceneBuilder.SceneNames), SceneBuilder.SceneNames.Length); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByScene_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + Task loadTask = Task.FromResult(default); + yield return Unload_Template(manager, () => + { + loadTask = manager.LoadAsync(SceneBuilder.SceneNames, 0); + return loadTask; + }, () => + { + SceneResult result = loadTask.GetAwaiter().GetResult(); + return manager.UnloadAsync(result.GetScenes()); + }, SceneBuilder.SceneNames.Length); + } + +#if ENABLE_ADDRESSABLES + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAddress([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAddressableAsync(SceneBuilder.SceneNames[1], true), () => manager.UnloadAddressableAsync(SceneBuilder.SceneNames[1]), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAddress_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAddressableAsync(SceneBuilder.SceneNames, 0), () => manager.UnloadAddressableAsync(SceneBuilder.SceneNames), SceneBuilder.SceneNames.Length); + } + + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAssetReference([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAddressableAsync(_assetReferences[1], true), () => manager.UnloadAddressableAsync(_assetReferences[1]), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAssetReference_Multiple([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneManagers))] ISceneManager manager) + { + yield return Unload_Template(manager, () => manager.LoadAddressableAsync(_assetReferences, 0), () => manager.UnloadAddressableAsync(_assetReferences), _assetReferences.Length); + } +#endif + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_ExtensionTests.cs.meta b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_ExtensionTests.cs.meta new file mode 100644 index 00000000..a9a1e3c2 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/SceneManager_ExtensionTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e7b3d6cfd812bb04c9b151cf3ebb4456 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_ExtensionTests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_ExtensionTests.cs new file mode 100644 index 00000000..1d0772f2 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_ExtensionTests.cs @@ -0,0 +1,205 @@ +using System.Collections; +using System.Threading.Tasks; +using NUnit.Framework; +#if ENABLE_ADDRESSABLES +using UnityEngine.AddressableAssets; +using UnityEngine.ResourceManagement.AsyncOperations; +#endif +using UnityEngine.TestTools; + +namespace MyGameDevTools.SceneLoading.Tests +{ + public partial class StaticSceneManager_Tests + { + int[] _buildIndexes = new[] { 1, 2, 3 }; + +#if ENABLE_ADDRESSABLES + AssetReference[] _assetReferences; + + [OneTimeSetUp] + public void AssetReferenceSetup() + { + AsyncOperationHandle operationHandle = Addressables.LoadAssetAsync(nameof(SceneReferenceData)); + operationHandle.WaitForCompletion(); + + SceneReferenceData sceneReferenceData = operationHandle.Result; + _assetReferences = sceneReferenceData.sceneReferences.ToArray(); + + Addressables.Release(operationHandle); + } +#endif + + [UnityTest] + public IEnumerator Load_Extension_ByIndex() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAsync(1, true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_ByIndex_Multiple() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAsync(_buildIndexes, 1, progress), progress, _buildIndexes.Length, 1); + } + + [UnityTest] + public IEnumerator Load_Extension_ByName() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAsync(SceneBuilder.SceneNames[1], true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_ByName_Multiple() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAsync(SceneBuilder.SceneNames, 1, progress), progress, SceneBuilder.SceneNames.Length, 1); + } + +#if ENABLE_ADDRESSABLES + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAddress() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAddressableAsync(SceneBuilder.SceneNames[1], true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAddress_Multiple() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAddressableAsync(SceneBuilder.SceneNames, 1, progress), progress, SceneBuilder.SceneNames.Length, 1); + } + + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAssetReference() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAddressableAsync(_assetReferences[1], true, progress), progress, 1, 0); + } + + [UnityTest] + public IEnumerator Load_Extension_Addressable_ByAssetReference_Multiple() + { + var progress = new SimpleProgress(); + yield return Load_Template(() => MySceneManager.LoadAddressableAsync(_assetReferences, 1, progress), progress, _assetReferences.Length, 1); + } +#endif + + [UnityTest] + public IEnumerator Transition_Extension_ByIndex() + { + yield return Transition_Template(() => MySceneManager.TransitionAsync(1, 1), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_ByIndex_Multiple() + { + yield return Transition_Template(() => MySceneManager.TransitionAsync(_buildIndexes, 1), _buildIndexes.Length, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_ByName() + { + yield return Transition_Template(() => MySceneManager.TransitionAsync(SceneBuilder.SceneNames[1], SceneBuilder.SceneNames[0]), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_ByName_Multiple() + { + yield return Transition_Template(() => MySceneManager.TransitionAsync(SceneBuilder.SceneNames, SceneBuilder.ScenePaths[0]), SceneBuilder.SceneNames.Length, 0); + } + +#if ENABLE_ADDRESSABLES + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAddress() + { + yield return Transition_Template(() => MySceneManager.TransitionAddressableAsync(SceneBuilder.SceneNames[1], SceneBuilder.SceneNames[0]), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAddress_Multiple() + { + yield return Transition_Template(() => MySceneManager.TransitionAddressableAsync(SceneBuilder.SceneNames, SceneBuilder.SceneNames[0]), SceneBuilder.SceneNames.Length, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAssetReference() + { + yield return Transition_Template(() => MySceneManager.TransitionAddressableAsync(_assetReferences[1], _assetReferences[0]), 1, 0); + } + + [UnityTest] + public IEnumerator Transition_Extension_Addressable_ByAssetReference_Multiple() + { + yield return Transition_Template(() => MySceneManager.TransitionAddressableAsync(_assetReferences, _assetReferences[0]), SceneBuilder.SceneNames.Length, 0); + } +#endif + + [UnityTest] + public IEnumerator Unload_Extension_ByIndex() + { + yield return Unload_Template(() => MySceneManager.LoadAsync(1, true), () => MySceneManager.UnloadAsync(1), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByIndex_Multiple() + { + yield return Unload_Template(() => MySceneManager.LoadAsync(_buildIndexes, 0), () => MySceneManager.UnloadAsync(_buildIndexes), _buildIndexes.Length); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByName() + { + yield return Unload_Template(() => MySceneManager.LoadAsync(SceneBuilder.SceneNames[1], true), () => MySceneManager.UnloadAsync(SceneBuilder.SceneNames[1]), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByName_Multiple() + { + yield return Unload_Template(() => MySceneManager.LoadAsync(SceneBuilder.SceneNames, 0), () => MySceneManager.UnloadAsync(SceneBuilder.SceneNames), SceneBuilder.SceneNames.Length); + } + + [UnityTest] + public IEnumerator Unload_Extension_ByScene_Multiple() + { + Task loadTask = Task.FromResult(default); + yield return Unload_Template(() => + { + loadTask = MySceneManager.LoadAsync(SceneBuilder.SceneNames, 0); + return loadTask; + }, () => + { + SceneResult result = loadTask.GetAwaiter().GetResult(); + return MySceneManager.UnloadAsync(result.GetScenes()); + }, SceneBuilder.SceneNames.Length); + } + +#if ENABLE_ADDRESSABLES + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAddress() + { + yield return Unload_Template(() => MySceneManager.LoadAddressableAsync(SceneBuilder.SceneNames[1], true), () => MySceneManager.UnloadAddressableAsync(SceneBuilder.SceneNames[1]), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAddress_Multiple() + { + yield return Unload_Template(() => MySceneManager.LoadAddressableAsync(SceneBuilder.SceneNames, 0), () => MySceneManager.UnloadAddressableAsync(SceneBuilder.SceneNames), SceneBuilder.SceneNames.Length); + } + + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAssetReference() + { + yield return Unload_Template(() => MySceneManager.LoadAddressableAsync(_assetReferences[1], true), () => MySceneManager.UnloadAddressableAsync(_assetReferences[1]), 1); + } + + [UnityTest] + public IEnumerator Unload_Extension_Addressable_ByAssetReference_Multiple() + { + yield return Unload_Template(() => MySceneManager.LoadAddressableAsync(_assetReferences, 0), () => MySceneManager.UnloadAddressableAsync(_assetReferences), _assetReferences.Length); + } +#endif + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_ExtensionTests.cs.meta b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_ExtensionTests.cs.meta new file mode 100644 index 00000000..a98247e1 --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_ExtensionTests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 03df37f55ff66674b848bc615005b6b1 \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_Tests.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_Tests.cs new file mode 100644 index 00000000..516b82bd --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_Tests.cs @@ -0,0 +1,209 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools; + +namespace MyGameDevTools.SceneLoading.Tests +{ + [PrebuildSetup(typeof(SceneTestEnvironment)), PostBuildCleanup(typeof(SceneTestEnvironment))] + public partial class StaticSceneManager_Tests + { + int _scenesActivated; + int _scenesUnloaded; + int _scenesLoaded; + + [OneTimeSetUp] + public void OneTimeSetup() + { + SceneTestEnvironment.ValidateSceneEnvironment(); + + MySceneManager.ActiveSceneChanged += ReportSceneActivation; + MySceneManager.SceneUnloaded += ReportSceneUnloaded; + MySceneManager.SceneLoaded += ReportSceneLoaded; + } + + [OneTimeTearDown] + public void OneTimeTeardown() + { + MySceneManager.ActiveSceneChanged -= ReportSceneActivation; + MySceneManager.SceneUnloaded -= ReportSceneUnloaded; + MySceneManager.SceneLoaded -= ReportSceneLoaded; + } + + [SetUp] + public void TestSetup() + { + MySceneManager.SetActiveScene(MySceneManager.GetLoadedSceneAt(0)); + + _scenesActivated = 0; + _scenesUnloaded = 0; + _scenesLoaded = 0; + } + + [UnityTearDown] + public IEnumerator UnloadScenesOnTearDown() + { + yield return UnloadAllScenes(); + Assert.AreEqual(1, SceneManager.sceneCount); + } + + [Test] + public void InitialStateTest() + { + int loadedScenes = 0; + Assert.DoesNotThrow(() => loadedScenes = MySceneManager.LoadedSceneCount); + Assert.AreEqual(1, loadedScenes); + Assert.AreEqual(1, MySceneManager.TotalSceneCount); + + Scene activeScene = SceneManager.GetActiveScene(); + Assert.AreEqual(activeScene, MySceneManager.GetActiveScene()); + Assert.AreEqual(activeScene, MySceneManager.GetLastLoadedScene()); + Assert.AreEqual(activeScene, MySceneManager.GetLoadedSceneAt(0)); + Assert.AreEqual(activeScene, MySceneManager.GetLoadedSceneByName(activeScene.name)); + } + + [UnityTest] + public IEnumerator Load([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) + { + var progress = new SimpleProgress(); + return Load_Template(() => MySceneManager.LoadAsync(sceneParameters, progress), progress, sceneParameters.Length, sceneParameters.GetIndexToActivate()); + } + + [UnityTest] + public IEnumerator Unload([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment.SceneParametersList))] SceneParameters sceneParameters) + { + yield return Unload_Template(() => MySceneManager.LoadAsync(sceneParameters), () => MySceneManager.UnloadAsync(sceneParameters), sceneParameters.Length); + } + + [UnityTest] + public IEnumerator Transition([ValueSource(typeof(SceneTestEnvironment), nameof(SceneTestEnvironment. + TransitionSceneParametersList))] SceneParameters sceneParameters) + { + yield return Transition_Template(() => MySceneManager.TransitionAsync(sceneParameters), sceneParameters.Length, sceneParameters.GetIndexToActivate()); + } + + public IEnumerator Load_Template(Func> loadTask, SimpleProgress progress, int sceneCount, int setIndexActive) + { + var reportedScenes = new List(sceneCount); + MySceneManager.SceneLoaded += reportSceneLoaded; + + var task = loadTask(); + + Assert.AreEqual(0, progress.Value); + + yield return task.ToWaitTask(); + + MySceneManager.SceneLoaded -= reportSceneLoaded; + Scene[] loadedScenes = task.Result; + + Assert.AreEqual(1, progress.Value); + Assert.AreEqual(sceneCount, loadedScenes.Length); + Assert.AreEqual(sceneCount, reportedScenes.Count); + Assert.AreEqual(sceneCount + 1, MySceneManager.LoadedSceneCount); + if (setIndexActive >= 0) + Assert.AreEqual(MySceneManager.GetActiveScene(), loadedScenes[setIndexActive]); + Assert.AreEqual(sceneCount, _scenesLoaded); + Assert.AreEqual(0, _scenesUnloaded); + Assert.AreEqual(setIndexActive >= 0 ? 1 : 0, _scenesActivated); + + void reportSceneLoaded(Scene loadedScene) => reportedScenes.Add(loadedScene); + } + + public IEnumerator Transition_Template(Func> transitionTask, int sceneCount, int setIndexActive) + { + yield return LoadFirstScene(); + + var task = transitionTask(); + yield return task.ToWaitTask(); + + Scene[] loadedScenes = task.Result; + Assert.AreEqual(sceneCount, loadedScenes.Length); + Assert.AreEqual(loadedScenes[setIndexActive], MySceneManager.GetActiveScene()); + + yield return new WaitUntil(() => MySceneManager.TotalSceneCount == sceneCount + 1); + } + + public IEnumerator Unload_Template(Func> loadTask, Func> unloadTask, int sceneCount) + { + var load = loadTask(); + yield return load.ToWaitTask(); + var loadedSceneHandles = load.Result.GetScenes().Select(s => s.handle).ToArray(); + + var reportedScenes = new List(sceneCount); + MySceneManager.SceneUnloaded += reportSceneUnloaded; + + var unload = unloadTask(); + yield return unload.ToWaitTask(); + + MySceneManager.SceneUnloaded -= reportSceneUnloaded; + Scene[] unloadedScenes = unload.Result; + + Assert.AreEqual(sceneCount, unloadedScenes.Length); + Assert.AreEqual(sceneCount, reportedScenes.Count); + Assert.AreEqual(1, MySceneManager.LoadedSceneCount); + Assert.AreEqual(sceneCount, _scenesLoaded); + Assert.AreEqual(sceneCount, _scenesUnloaded); + + for (int i = 0; i < sceneCount; i++) + Assert.True(hasReference(loadedSceneHandles[i], reportedScenes)); + + void reportSceneUnloaded(Scene loadedScene) => reportedScenes.Add(loadedScene); + + bool hasReference(int handle, List scenes) + { + foreach (var scene in scenes) + if (scene.handle == handle) + { + scenes.Remove(scene); + return true; + } + return false; + } + } + + /// + /// Required to test some transition scenarios. + /// + public static WaitTask LoadFirstScene() => MySceneManager.LoadAsync(SceneBuilder.SceneNames[1], true).ToWaitTask(); + + public static IEnumerator UnloadManagerScenes() + { + var lastScene = MySceneManager.GetLastLoadedScene(); + // MySceneManager registers the init scene as one of its managed scenes + while (MySceneManager.LoadedSceneCount > 1 && lastScene.IsValid()) + { + yield return MySceneManager.UnloadAsync(lastScene).ToWaitTask(); + lastScene = MySceneManager.GetLastLoadedScene(); + } + + Assert.AreEqual(1, MySceneManager.LoadedSceneCount); + Assert.True(MySceneManager.GetActiveScene().IsValid()); + } + + public static IEnumerator UnloadAllScenes() + { + yield return UnloadManagerScenes(); + yield return SceneTestUtilities.UnloadRemainingScenes(); + } + + void ReportSceneActivation(Scene previousScene, Scene newScene) + { + _scenesActivated++; + } + + void ReportSceneUnloaded(Scene unloadedScene) + { + _scenesUnloaded++; + } + + void ReportSceneLoaded(Scene loadedScene) + { + _scenesLoaded++; + } + } +} diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_Tests.cs.meta b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_Tests.cs.meta new file mode 100644 index 00000000..2d9ca28a --- /dev/null +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/StaticSceneManager_Tests.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 57ff7888822b8c743bf60397e36fec4c \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestEnvironment.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestEnvironment.cs index b36d0abe..9cedd2a5 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestEnvironment.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestEnvironment.cs @@ -22,7 +22,7 @@ public class SceneTestEnvironment : IPrebuildSetup, IPostBuildCleanup public const string ScenePathBase = "Assets/_test"; public const int DefaultTimeout = 3000; - public static readonly ILoadSceneInfo[][] MultipleLoadSceneInfoList = new ILoadSceneInfo[][] + static readonly ILoadSceneInfo[][] _multipleLoadSceneInfoList = new ILoadSceneInfo[][] { new ILoadSceneInfo[] { @@ -60,9 +60,44 @@ public class SceneTestEnvironment : IPrebuildSetup, IPostBuildCleanup #endif }; + public static readonly ILoadSceneInfo[] SingleLoadSceneInfoList_NoAddressable = new ILoadSceneInfo[] + { + new LoadSceneInfoName(SceneBuilder.SceneNames[1]), + new LoadSceneInfoName(SceneBuilder.ScenePaths[1]), + }; + + public static readonly SceneParameters[] SceneParametersList = new SceneParameters[] + { + new(SingleLoadSceneInfoList[0], false), + new(SingleLoadSceneInfoList[0], true), + new(SingleLoadSceneInfoList[1], false), + new(SingleLoadSceneInfoList[1], true), + new(SingleLoadSceneInfoList[2], false), + new(SingleLoadSceneInfoList[2], true), +#if ENABLE_ADDRESSABLES + new(SingleLoadSceneInfoList[3], false), + new(SingleLoadSceneInfoList[3], true), +#endif + new(_multipleLoadSceneInfoList[0], -1), + new(_multipleLoadSceneInfoList[0], 1), + new(_multipleLoadSceneInfoList[1], -1), + new(_multipleLoadSceneInfoList[1], 1), + }; + public static readonly SceneParameters[] TransitionSceneParametersList = new SceneParameters[] + { + new(SingleLoadSceneInfoList[0], true), + new(SingleLoadSceneInfoList[1], true), + new(SingleLoadSceneInfoList[2], true), +#if ENABLE_ADDRESSABLES + new(SingleLoadSceneInfoList[3], true), +#endif + new(_multipleLoadSceneInfoList[0], 1), + new(_multipleLoadSceneInfoList[1], 1), + }; + public static readonly ISceneManager[] SceneManagers = new ISceneManager[] { - new AdvancedSceneManager(), + new CoreSceneManager(), }; #if UNITY_EDITOR @@ -75,6 +110,9 @@ public class SceneTestEnvironment : IPrebuildSetup, IPostBuildCleanup public void Setup() { #if UNITY_EDITOR + if (IsSceneEnvironmentSetup()) + return; + int sceneCount = SceneBuilder.SceneNames.Length; List buildScenes = new(sceneCount); @@ -107,6 +145,9 @@ public void Setup() public void Cleanup() { #if UNITY_EDITOR + if (!IsSceneEnvironmentSetup()) + return; + EditorBuildSettings.scenes = EditorBuildSettings.scenes.Where(scene => !scene.path.StartsWith(ScenePathBase)).ToArray(); if (!Directory.Exists(ScenePathBase)) @@ -132,26 +173,7 @@ public void Cleanup() public static void ValidateSceneEnvironment() { #if UNITY_EDITOR - var builtScenes = EditorBuildSettings.scenes; - Assert.True(hasAllEnvironmentScenes()); - - bool hasAllEnvironmentScenes() - { - foreach (var name in SceneBuilder.SceneNames) - { - if (!hasBuiltSceneWithName(name)) - return false; - } - return true; - } - - bool hasBuiltSceneWithName(string name) - { - foreach (var builtScene in builtScenes) - if (builtScene.path.Contains(name)) - return true; - return false; - } + Assert.True(IsSceneEnvironmentSetup()); #if ENABLE_ADDRESSABLES var operation = Addressables.LoadResourceLocationsAsync(SceneBuilder.SceneNames); @@ -167,6 +189,29 @@ bool areLocationsValid() return true; } #endif +#endif + } + + public static bool IsSceneEnvironmentSetup() + { +#if UNITY_EDITOR + EditorBuildSettingsScene[] buildScenes = EditorBuildSettings.scenes; + foreach (string name in SceneBuilder.SceneNames) + { + if (!hasBuiltSceneWithName(name, buildScenes)) + return false; + } + return true; + + static bool hasBuiltSceneWithName(string name, EditorBuildSettingsScene[] buildScenes) + { + foreach (EditorBuildSettingsScene buildScene in buildScenes) + if (buildScene.path.Contains(name)) + return true; + return false; + } +#else + return false; #endif } } diff --git a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestUtilities.cs b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestUtilities.cs index 221078b2..987d18cd 100644 --- a/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestUtilities.cs +++ b/Packages/com.mygamedevtools.scene-loader/Tests/Runtime/Utilities/SceneTestUtilities.cs @@ -1,4 +1,3 @@ -using UnityEngine; using System.Collections; using NUnit.Framework; using UnityEngine.SceneManagement; @@ -7,18 +6,15 @@ namespace MyGameDevTools.SceneLoading.Tests { public static class SceneTestUtilities { - public static IEnumerator UnloadManagerScenes(ISceneManager sceneManager) + public static IEnumerator UnloadDirectorScenes(ISceneManager sceneManager) { var lastScene = sceneManager.GetLastLoadedScene(); while (sceneManager.LoadedSceneCount > 0 && lastScene.IsValid()) { - yield return new WaitTask(sceneManager.UnloadSceneAsync(new LoadSceneInfoScene(lastScene)).AsTask()); + yield return new WaitTask(sceneManager.UnloadAsync(lastScene)); lastScene = sceneManager.GetLastLoadedScene(); } - while (sceneManager.LoadedSceneCount > 0) - yield return new WaitUntil(() => sceneManager.LoadedSceneCount == 0); - Assert.Zero(sceneManager.LoadedSceneCount); Assert.False(sceneManager.GetActiveScene().IsValid()); } @@ -39,7 +35,7 @@ public static IEnumerator UnloadAllScenes() { ISceneManager[] sceneManagers = SceneTestEnvironment.SceneManagers; for (int i = 0; i < sceneManagers.Length; i++) - yield return UnloadManagerScenes(sceneManagers[i]); + yield return UnloadDirectorScenes(sceneManagers[i]); yield return UnloadRemainingScenes(); } diff --git a/Packages/com.mygamedevtools.scene-loader/package.json b/Packages/com.mygamedevtools.scene-loader/package.json index 25933883..8c75284f 100644 --- a/Packages/com.mygamedevtools.scene-loader/package.json +++ b/Packages/com.mygamedevtools.scene-loader/package.json @@ -1,8 +1,8 @@ { "name": "com.mygamedevtools.scene-loader", "version": "3.1.0", - "displayName": "Advanced Scene Manager", - "description": "This package simplifies scene operations: load, unload and transition. In a quick example:\n\n▐ // Unity Manager scene transition\n▐ yield return SceneManager.LoadSceneAsync(\"my-loading-scene\",\n▐ LoadSceneMode.Additive);\n▐ yield return SceneManager.LoadSceneAsync(\"my-target-scene\",\n▐ LoadSceneMode.Additive);\n▐\n▐ SceneManager.SetActiveScene(\n▐ SceneManager.GetSceneByName(\"my-target-scene\"));\n▐\n▐ SceneManager.UnloadSceneAsync(\"my-loading-scene\");\n▐ SceneManager.UnloadSceneAsync(\"my-previous-scene\");\n▐\n▐ // Advanced Scene Management scene transition\n▐ sceneLoader.TransitionToScene(\n▐ new LoadSceneInfoName(\"my-target-scene\"),\n▐ new LoadSceneInfoName(\"my-loading-scene\"));\n\nYou can also take advantage of these features:\n\n▪ Unified API for addressable and non-addressable scenes.\n▪ Awaitable scene operations.\n▪ Modular implementation with interfaces.\n▪ Load, unload or transition to multiple scenes.", + "displayName": "My Scene Manager", + "description": "This package simplifies scene operations: load, unload and transition.\nFor example, this is how you perform a scene transition:\n\n\u2503MySceneManager.TransitionAsync(\"my-target-scene\", \"my-loading-scene\");\n\nInstead of:\n\n\u2503 yield return SceneManager.LoadSceneAsync(\"my-loading-scene\",\n\u2503 LoadSceneMode.Additive);\n\u2503 yield return SceneManager.LoadSceneAsync(\"my-target-scene\",\n\u2503 LoadSceneMode.Additive);\n\u2503\n\u2503 SceneManager.SetActiveScene(\n\u2503 SceneManager.GetSceneByName(\"my-target-scene\"));\n\u2503\n\u2503 SceneManager.UnloadSceneAsync(\"my-loading-scene\");\n\u2503 SceneManager.UnloadSceneAsync(\"my-previous-scene\");\n\nYou can also take advantage of these features:\n\n\u25aa Unified API for addressable and non-addressable scenes.\n\u25aa Awaitable scene operations.\n\u25aa Modular implementation with interfaces.\n\u25aa Load, unload or transition to multiple scenes.", "unity": "2021.3", "keywords": [], "author": { @@ -14,5 +14,12 @@ "documentationUrl": "https://github.com/mygamedevtools/scene-loader", "licensesUrl": "https://github.com/mygamedevtools/scene-loader?tab=MIT-1-ov-file", "changelogUrl": "https://github.com/mygamedevtools/scene-loader/blob/main/CHANGELOG.md", - "hideInEditor": false -} + "hideInEditor": false, + "samples": [ + { + "displayName": "Loading Scene Examples", + "description": "Experiment with different loading scenes for Scene Transitions. Use the sample scenes as a starting point to build your own loading scenes.", + "path": "Samples~/LoadingSceneExamples" + } + ] +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Changelog.md b/Packages/com.needle.upm-in-unitypackage/Changelog.md new file mode 100644 index 00000000..ce6247fe --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Changelog.md @@ -0,0 +1,58 @@ +# Changelog +All notable changes to this package will be documented in this file. +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [0.6.3] - 2023-08-22 +- catch patching exception +- disable patching on Apple Silicon (unsupported) + +## [0.6.2] - 2022-10-30 +- fixed compilation issue on 2020.x + +## [0.6.1] - 2022-10-30 +- updated Readme + +## [0.6.0] - 2022-10-30 +- added support for the new Asset Store tools and the integrated Hybrid Packages workflow +- added automatically enabling the new flow in the Asset Store tools when this package is present +- added button to open export folder from upload config +- fix new AssetStore tools not allowing file:.. referenced packages for some reason +- ensure namespace is Needle.HybridPackages everywhere + +## [0.5.3] - 2021-05-25 +- added: default npmignore excludes will now be excluded when exporting hidden folders (Samples~, Documentation~ etc.) +- added: new sample, Package with Samples +- fixed: in very rare cases GUIDs can collide between assets. We're now properly avoiding these collisions. + +## [0.5.2] - 2021-05-20 +- fixed: exporting a package that has samples but not using an upload config threw a nullref exception + +## [0.5.1] - 2021-05-18 +- fixed: packing performance was low because compression strength was "Ultra", now defaults to "Normal" +- changed: disabled gitignore/npmignore option by default (it's experimental), can be turned on in the upload config +- added: ProgressBars to see what actually happens +- added: ability to export one or many upload configs directly for local testing (without upload) + +## [0.5.0] - 2021-05-18 +- added: ability to export hidden folders (Samples~, Documentation~ etc) in .unitypackage +- added: file ignore checks for content from hidden folders based on .gitignore/.npmignore + +## [0.4.0] - 2021-05-13 +- added: ability to create UploadConfigs that can specify multiple folders/packages for store upload +- added: prevent packages that start with "com.unity." from being uploaded +- added: prevent packages in the Library from being uploaded (only local/embedded packages should be) +- added: sample UploadConfig, import via PackMan samples. + +## [0.3.0] - 2021-05-03 +- embedded Harmony plugin to simplify dependencies +- fixed: DLLs were not exported in some cases because Unity treats them as DefaultAssets, same as folders + +## [0.2.0] - 2021-04-28 +- initial OpenUPM release +- Readme adjustments + +## [0.1.0-exp] - 2021-04-10 +- initial package version +- supports `Asset Store Tools 5.0` +- supports `Assets/Export Package` +- tested against Unity 2018.4, 2019.4, 2020.3 \ No newline at end of file diff --git a/Assets/ScriptTemplates/74-My Scripts__Entities__Component-NewComponent.cs.txt.meta b/Packages/com.needle.upm-in-unitypackage/Changelog.md.meta similarity index 75% rename from Assets/ScriptTemplates/74-My Scripts__Entities__Component-NewComponent.cs.txt.meta rename to Packages/com.needle.upm-in-unitypackage/Changelog.md.meta index ae221e4b..699e1552 100644 --- a/Assets/ScriptTemplates/74-My Scripts__Entities__Component-NewComponent.cs.txt.meta +++ b/Packages/com.needle.upm-in-unitypackage/Changelog.md.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: eb44eb497ac6b0c48ab5907a3c41aa2b +guid: 1b913e9ab8afdf644995371b558185be TextScriptImporter: externalObjects: {} userData: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor.meta b/Packages/com.needle.upm-in-unitypackage/Editor.meta new file mode 100644 index 00000000..7f44348e --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3695b9f4542e8d24fa3b6b1b06189fbc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreToolsExtension.cs b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreToolsExtension.cs new file mode 100644 index 00000000..3fad0e17 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreToolsExtension.cs @@ -0,0 +1,684 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using HarmonyLib; +using UnityEditor; +using UnityEngine; +using UnityEngine.Profiling; +using Assembly = System.Reflection.Assembly; +using Debug = UnityEngine.Debug; + +// ReSharper disable InconsistentNaming + +namespace Needle.HybridPackages +{ + using Ignore = Ignore.Ignore; + +#if UNITY_2019_1_OR_NEWER + internal class PackagePathValidationPatchProvider + { + [InitializeOnLoadMethod] + static void OnGetPatches() + { + var harmony = new Harmony(nameof(PackagerPatchProvider)); + var asms = AppDomain.CurrentDomain.GetAssemblies(); + var asm = asms.FirstOrDefault(x => x.FullName.StartsWith("asset-store-tools-editor")); + if (asm == null) return; + var type = asm.GetType("AssetStoreTools.Uploader.HybridPackageUploadWorkflowView"); + var method = type?.GetMethod("IsValidLocalPackage", (BindingFlags)(-1)); + if (method == null) + { + //Debug.LogError($"Null method returned from {typeof(PackagePathValidationPatchProvider)}.IsValidLocalPackage. Please report a bug and note your Unity and package versions."); + return; + } + + try + { + harmony.Patch(method, new HarmonyMethod(AccessTools.Method(typeof(IsValidPatch), "Prefix"))); + } + catch (Exception e) + { + Debug.LogError($"Method patching failed from {typeof(PackagePathValidationPatchProvider)}.IsValidLocalPackage. Please report a bug and note your Unity and package versions.\n{e}"); + } + } + + private class IsValidPatch + { + private static bool Prefix(ref bool __result, string packageFolderPath, out string assetDatabasePackagePath) + { +#if UNITY_2022_1_OR_NEWER + var allPackages = UnityEditor.PackageManager.PackageInfo.GetAllRegisteredPackages(); +#else + var allPackages = UnityEditor.PackageManager.PackageInfo.GetAll(); +#endif + var packageInfo = allPackages.FirstOrDefault( + x => x.resolvedPath.Replace("\\", "/") == packageFolderPath.Replace("\\", "/")); + if (packageInfo != null) + { + assetDatabasePackagePath = packageInfo.assetPath; + __result = true; + return false; + } + + assetDatabasePackagePath = ""; + __result = false; + return true; + } + } + } +#endif + + internal class PackagerPatchProvider + { + [InitializeOnLoadMethod] + static void OnGetPatches() + { + if (!Helpers.PatchingSupported()) return; + + var harmony = new Harmony(nameof(PackagerPatchProvider)); + var type = typeof(EditorWindow).Assembly.GetType("UnityEditor.PackageExport"); + var method = type?.GetMethod("GetAssetItemsForExport", (BindingFlags)(-1)); + if (method == null) return; + harmony.Patch(method, new HarmonyMethod(AccessTools.Method(typeof(PackagerPatch), "Prefix"))); + } + + private class PackagerPatch + { + // ReSharper disable once UnusedMember.Local + // ReSharper disable once RedundantAssignment + private static bool Prefix(ref IEnumerable __result, ICollection guids, bool includeDependencies) + { + // check if this is an attempt to export from Packages, otherwise use original method + var someGuidsAreInsidePackages = guids + .Select(AssetDatabase.GUIDToAssetPath) + .Any(x => !string.IsNullOrEmpty(x) && x.StartsWith("Packages/", StringComparison.OrdinalIgnoreCase)); + if (!someGuidsAreInsidePackages) + return true; + + string[] resultingGuids = new string[0]; + foreach (var guid in guids) + resultingGuids = AssetDatabase.CollectAllChildren(guid, resultingGuids); + + // if (includeDependencies) + // Helpers.Log("You're exporting a package. If your package has dependencies and you want to export them, they need to be manually selected."); + + var rootsAndChildGuids = resultingGuids.Union(guids).Distinct().ToList(); + if (includeDependencies) + rootsAndChildGuids = rootsAndChildGuids.Union(AssetDatabase + .GetDependencies(rootsAndChildGuids.Select(AssetDatabase.GUIDToAssetPath).ToArray(), true) + .Select(AssetDatabase.AssetPathToGUID)) + .Distinct().ToList(); + + __result = rootsAndChildGuids + .Select(x => new ExportPackageItem() + { + assetPath = AssetDatabase.GUIDToAssetPath(x), + enabledStatus = (int)PackageExportTreeView.EnabledState.All, + guid = x, + isFolder = AssetDatabase.IsValidFolder(AssetDatabase.GUIDToAssetPath(x)) + }) + .Where(x => !x.isFolder); // ignore folders, otherwise these seem to end up being separate assets and ignored on import + + // this just doesn't warn, but still does not include the right items + // __result = PackageUtility.BuildExportPackageItemsList(resultingGuids, false); + return false; + } + } + } + + public class AssetStoreToolsPatchProvider + { + private const string outputSubFolder = "Temp"; // NB: this is Unity's "project's Temp folder" so you shouldn't change it + private static AssetStoreUploadConfig currentUploadConfig; + + [InitializeOnLoadMethod] + static void OnGetPatches() + { + // safeguard, should be prevented by OnWillEnablePatch + if (Helpers.GetAssetStoreToolsAssembly() == null) return; + if (!Helpers.PatchingSupported()) return; + + var harmony = new Harmony(nameof(AssetStoreToolsPatchProvider)); + PathValidationPatch.Patch(harmony); + RootPathPatch.Patch(harmony); + GetGUIDsPatch.Patch(harmony); + PackagerExportPatch.Patch(harmony); + } + + internal static void ExportPackageForConfig(AssetStoreUploadConfig uploadConfig) + { + var results = new List(); + + if (!uploadConfig.IsValid) + throw new ArgumentException("The selected upload config " + uploadConfig + " is not valid."); + + currentUploadConfig = uploadConfig; + + foreach (var path in uploadConfig.GetExportPaths()) + GetGUIDsPatch.AddChildrenToResults(results, path); + + var exportFilename = uploadConfig.GetExportFilename(outputSubFolder); + PackagerExportPatch.ExportPackage(results.ToArray(), exportFilename); + } + + private class PathValidationPatch + { + public static void Patch(Harmony harmony) + { + var asm = Helpers.GetAssetStoreToolsAssembly(); + if (asm == null) return; + var m = asm.GetType("AssetStorePackageController").GetMethod("IsValidProjectFolder", (BindingFlags)(-1)); + harmony.Patch(m, new HarmonyMethod(AccessTools.Method(typeof(PathValidationPatch), "Prefix"))); + } + + // ReSharper disable once UnusedMember.Local + // ReSharper disable once UnusedParameter.Local + // ReSharper disable once RedundantAssignment + private static bool Prefix(ref bool __result, string directory) + { + if (Path.GetFullPath(directory).Replace("\\", "/").StartsWith(Application.dataPath, StringComparison.Ordinal)) + return true; + + __result = true; + return false; + } + } + + private class RootPathPatch + { + public static void Patch(Harmony harmony) + { + var asm = Helpers.GetAssetStoreToolsAssembly(); + if (asm == null) return; + var m = asm.GetType("AssetStorePackageController").GetMethod("SetRootPath", (BindingFlags)(-1)); + harmony.Patch(m, new HarmonyMethod(AccessTools.Method(typeof(RootPathPatch), "Prefix"))); + } + + // ReSharper disable once UnusedMember.Local + private static bool Prefix(object __instance, string path) + { + if (__instance == null) return true; + // Helpers.Log(path); + if (path.StartsWith(Application.dataPath, StringComparison.Ordinal)) + return true; + + var m_UnsavedChanges = __instance.GetType().GetField("m_UnsavedChanges", (BindingFlags)(-1)); + if (m_UnsavedChanges == null) return true; + m_UnsavedChanges.SetValue(__instance, true); + + // project-relative path: + var directoryName = Application.dataPath; + if (string.IsNullOrEmpty(directoryName)) return true; + + var relative = "/../" + new Uri(directoryName).MakeRelativeUri(new Uri(path)); + // Helpers.Log(directoryName + " + " + path + " = " + relative); + + var m_LocalRootPath = __instance.GetType().GetField("m_LocalRootPath", (BindingFlags)(-1)); + if (m_LocalRootPath == null) return true; + m_LocalRootPath.SetValue(__instance, relative); + + var m_MainAssets = __instance.GetType().GetField("m_MainAssets", (BindingFlags)(-1)); + if (m_MainAssets == null) return true; + + var mainAssets = m_MainAssets.GetValue(__instance) as List; + if (mainAssets == null) return true; + mainAssets.Clear(); + return false; + } + } + + private class GetGUIDsPatch + { + public static void Patch(Harmony harmony) + { + var asm = Helpers.GetAssetStoreToolsAssembly(); + if (asm == null) return; + var m = asm.GetType("AssetStorePackageController").GetMethod("GetGUIDS", (BindingFlags)(-1)); + harmony.Patch(m, new HarmonyMethod(AccessTools.Method(typeof(GetGUIDsPatch), "Prefix"))); + } + + class PackageInfoMock + { + public string name; + public string resolvedPath; + } + + internal static void AddChildrenToResults(List results, string assetPath) + { + if (File.Exists(assetPath)) + { + results.Add(AssetDatabase.AssetPathToGUID(assetPath)); + return; + } + + string[] collection = new string[0]; + var children = AssetDatabase.CollectAllChildren(AssetDatabase.AssetPathToGUID(assetPath), collection); + + if (!children.Any()) + throw new NullReferenceException(Helpers.LogPrefix + "Seems you're trying to export something that's not in your AssetDatabase: " + assetPath + " - this can't be exported as .unitypackage."); + + results.AddRange(children); + } + + // ReSharper disable once UnusedMember.Local + private static bool Prefix(ref string[] __result, object __instance, bool includeProjectSettings) + { + var m_LocalRootPath = __instance.GetType().GetField("m_LocalRootPath", (BindingFlags)(-1)); + if (m_LocalRootPath == null) return true; + var localRootPath = m_LocalRootPath.GetValue(__instance) as string; + + if (string.IsNullOrEmpty(localRootPath) || localRootPath.Equals("/", StringComparison.Ordinal)) + return true; + + List results = new List(); + + // seems there's some weird path behaviour on 2018.4 with double // + if (localRootPath.StartsWith("/", StringComparison.Ordinal) && !localRootPath.StartsWith("/.", StringComparison.Ordinal)) + localRootPath = localRootPath.Substring("/".Length); + + currentUploadConfig = null; + + if (Directory.Exists("Assets/" + localRootPath) && !localRootPath.StartsWith("/..")) + { + // find the config inside this folder + var configs = AssetDatabase.FindAssets("t:AssetStoreUploadConfig", new[] { "Assets/" + localRootPath }); + if (configs.Any()) + { + var configPath = AssetDatabase.GUIDToAssetPath(configs.First()); + var uploadConfig = AssetDatabase.LoadAssetAtPath(configPath); + Debug.Log("Upload Config detected. The selected path will be ignored, and the upload config will be used instead.", uploadConfig); + + if (uploadConfig) + { + if (!uploadConfig.IsValid) + throw new ArgumentException("The selected upload config at " + configPath + " is not valid."); + currentUploadConfig = uploadConfig; + + foreach (var path in uploadConfig.GetExportPaths()) + { + AddChildrenToResults(results, path); + } + + __result = results.ToArray(); + + // Debug.Log("Included files: " + string.Join("\n", __result.Select(AssetDatabase.GUIDToAssetPath))); + return false; + } + } + } + + if (!string.IsNullOrEmpty(AssetDatabase.AssetPathToGUID("Assets/" + localRootPath))) + return true; + + // localRootPath is now project-relative, so not a package folder... + // We need to figure out if it's a proper package folder here, or already convert the path way earlier + // For now, we'll just check if any project package has this as resolved path + PackageInfoMock packageInfo = null; + var packageInfos = AssetDatabase + .FindAssets("package") + .Select(AssetDatabase.GUIDToAssetPath) + .Where(x => x.StartsWith("Packages/") && x.EndsWith("/package.json")) + .Select(x => + { + if (string.IsNullOrEmpty(x)) return null; + var parts = x.Split('/'); + if (parts.Length != 3) return null; + + return new PackageInfoMock() + { + name = parts[1], + resolvedPath = Path.GetDirectoryName(Path.GetFullPath(x))?.Replace("\\", "/") + }; + }) + .Where(x => x != null) + .Distinct(); + + foreach (var x in packageInfos) + { + var localFullPath = Path.GetFullPath(Application.dataPath + localRootPath); + var packageFullPath = Path.GetFullPath(x.resolvedPath); + // Debug.Log("Checking paths: " + localFullPath + " <== " + packageFullPath); + + if (localFullPath == packageFullPath) + { + packageInfo = x; + break; + } + } + + var assetDbPath = localRootPath; + if (packageInfo != null) + { + assetDbPath = "Packages/" + packageInfo.name; + + if (!Unsupported.IsDeveloperMode()) + { + // sanitize: do not allow uploading packages that are in the Library + var libraryRoot = Path.GetFullPath(Application.dataPath + "/../Library"); + if (Path.GetFullPath(assetDbPath).StartsWith(libraryRoot, StringComparison.Ordinal)) + throw new ArgumentException("You're trying to export a package from your Libary folder. This is not allowed. Only local/embedded packages can be exported."); + + // sanitize: do not allow re-uploading of Unity-scoped packages + if (packageInfo.name.StartsWith("com.unity.", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException("You're trying to export a package from the Unity registry. This is not allowed."); + } + + if (includeProjectSettings) + { + Helpers.LogWarning("You're exporting a package - please note that project settings won't be included!"); + } + } + + AddChildrenToResults(results, assetDbPath); + + __result = results.Distinct().ToArray(); + // Debug.Log("Included files: " + string.Join("\n", __result.Select(AssetDatabase.GUIDToAssetPath))); + return false; + } + } + + // https://npm.github.io/publishing-pkgs-docs/publishing/the-npmignore-file.html + private static readonly HashSet defaultNpmIgnore = new HashSet() + { + ".*.swp", + "._*", + ".DS_Store", + ".git", + ".hg", + ".npmrc", + ".lock-wscript", + ".svn", + ".wafpickle-*", + "config.gypi", + "CVS", + "npm-debug.log", + }; + + public class PackagerExportPatch + { + public static void Patch(Harmony harmony) + { + var asm = Helpers.GetAssetStoreToolsAssembly(); + if (asm == null) return; + var m = asm.GetType("Packager").GetMethod("ExportPackage", (BindingFlags)(-1)); + harmony.Patch(m, new HarmonyMethod(AccessTools.Method(typeof(PackagerExportPatch), "Prefix"))); + } + + public static bool ExportPackage(string[] guids, string fileName) + { + var result = Prefix(guids, fileName, false); + if (result) + { + Debug.LogWarning("Couldn't export a Hybrid Package: no files selected that are in packages."); + } + return result; + } + + // ReSharper disable once UnusedMember.Local + // ReSharper disable once UnusedParameter.Local + // ReSharper disable once RedundantAssignment + public static bool Prefix(string[] guids, string fileName, bool needsPackageManagerManifest) + { + // we want to patch this if there's packages in here + var anyFileInPackages = guids.Select(AssetDatabase.GUIDToAssetPath).Any(x => x.StartsWith("Packages/", StringComparison.Ordinal)); + + if (anyFileInPackages && needsPackageManagerManifest) + throw new ArgumentException("When exporting Hybrid Packages, please don't enable the \"Include Dependencies\" option. Specify dependencies via package.json."); + + // custom package export - constructing .unitypackage while respecting AssetDatabase, + // hidden top-level folders (end with ~) and .npmignore/.gitignore + if (anyFileInPackages) + { + var sw = new Stopwatch(); + sw.Start(); + + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Collecting Packages", 0f); + Profiler.BeginSample("Collecting Packages"); + + // get all packages we want to export + var packageRoots = new HashSet(); + + // the resulting project-relative paths (not absolute paths) + var exportPaths = new HashSet(); + + // all the currently selected files from AssetDB should be exported anyways + var assetDatabasePaths = guids.Select(AssetDatabase.GUIDToAssetPath).ToList(); + foreach (var p in assetDatabasePaths) + exportPaths.Add(p); + + foreach (var path0 in assetDatabasePaths) + { + var path = path0; + if (!path.StartsWith("Packages/", StringComparison.Ordinal)) continue; + + path = path.Substring("Packages/".Length); + var indexOfSlash = path.IndexOf("/", StringComparison.Ordinal); + var packageName = path.Substring(0, indexOfSlash); + path = "Packages/" + packageName; + + if (!packageRoots.Contains(path)) + packageRoots.Add(path); + } + Profiler.EndSample(); + + #region Handle file ignore + + var ignoreFiles = new List<(string dir, Ignore ignore)>(); + + // collect npm and gitignore files in all subdirectories + void CollectIgnoreFiles(string directory) + { + Profiler.BeginSample(nameof(CollectIgnoreFiles)); + ignoreFiles.Clear(); + + var di = new DirectoryInfo(directory); + + void AddToIgnore(List<(string dir, Ignore ignore)> ignoreList, string searchPattern, SearchOption searchOption) + { + try + { + foreach (var file in di.GetFiles(searchPattern, searchOption)) + { + var ignore = new Ignore(); + ignore.Add(File.ReadAllLines(file.FullName).Where(x => !string.IsNullOrWhiteSpace(x.Trim()) && !x.TrimStart().StartsWith("#", StringComparison.Ordinal))); + var fileDirectory = file.Directory; + if (fileDirectory != null) + ignoreFiles.Add((fileDirectory.FullName.Replace("\\", "/"), ignore)); + } + } + catch (IOException) + { + // ignore + } + } + + // find all ignore files in subdirectories + AddToIgnore(ignoreFiles, ".gitignore", SearchOption.AllDirectories); + AddToIgnore(ignoreFiles, ".npmignore", SearchOption.AllDirectories); + + var upwardsIgnoreFiles = new List<(string, Ignore)>(); + bool folderIsInsideGitRepository = false; + + try + { + // find ignore files up to directory root or until a .git folder is found + while (di.Parent != null) + { + di = di.Parent; + + AddToIgnore(upwardsIgnoreFiles, ".gitignore", SearchOption.TopDirectoryOnly); + AddToIgnore(upwardsIgnoreFiles, ".npmignore", SearchOption.TopDirectoryOnly); + + // we should stop at a git repo (.git folder) or a submodule (.git file) + if (di.GetDirectories(".git", SearchOption.TopDirectoryOnly).Any() || + di.GetFiles(".git", SearchOption.TopDirectoryOnly).Any()) + { + folderIsInsideGitRepository = true; + break; + } + } + } + catch (IOException) + { + folderIsInsideGitRepository = false; + upwardsIgnoreFiles.Clear(); + } + + // if we found any upwards git folder we add those ignore files to our list here, otherwise + // let's assume this isn't inside a git repo and we shouldn't look at those. + if (folderIsInsideGitRepository) + ignoreFiles.AddRange(upwardsIgnoreFiles); + + Profiler.EndSample(); + } + + bool IsIgnored(string filePath) + { + Profiler.BeginSample(nameof(IsIgnored)); + + filePath = filePath.Replace("\\", "/"); + foreach (var ig in ignoreFiles) + { + var dirLength = ig.dir.Length + 1; + // check if the file is a sub file of the ignore file + // because we dont want to apply ignore patterns to external files + // e.g. a file in "stuff/material" should not be affected from "myFolder/.gitignore" + if (filePath.StartsWith(ig.dir)) + { + var checkedPath = filePath.Substring(dirLength); + if (ig.ignore.IsIgnored(checkedPath)) + { + Debug.Log("File will be ignored: " + filePath + ", location of .ignore: " + ig.dir); + Profiler.EndSample(); + return true; + } + } + } + + Profiler.EndSample(); + return false; + } + + #endregion + + int counter = 0; + int length = packageRoots.Count; + foreach (var root in packageRoots) + { + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Collecting Files for Package: " + root, counter / (float)length); + counter++; + Profiler.BeginSample("Collecting Files for Package: " + root); + + var fullPath = Path.GetFullPath(root); + CollectIgnoreFiles(root); + + // include all hidden directories (end with ~) + foreach (var directory in new DirectoryInfo(root).GetDirectories("*", SearchOption.AllDirectories)) + { + try + { + if (directory.Name.StartsWith(".", StringComparison.Ordinal)) + continue; + + // this is a hidden folder. We want to include it in our export to catch + // - Samples~ + // - Documentation~ + // - Templates~ + // and so on. + if (directory.Name.EndsWith("~", StringComparison.Ordinal)) + { + // add all files in this directory + foreach (var file in directory.GetFiles("*", SearchOption.AllDirectories)) + { + if (defaultNpmIgnore.Contains(file.Name)) + continue; + + if (file.Extension.EndsWith(".meta", StringComparison.OrdinalIgnoreCase)) + continue; + + if (currentUploadConfig && currentUploadConfig.respectIgnoreFiles && IsIgnored(file.FullName)) continue; + + var projectRelativePath = file.FullName.Replace(fullPath, root); + exportPaths.Add(projectRelativePath); + } + } + } + catch (IOException) + { + // + } + } + + Profiler.EndSample(); + } + + // Debug.Log("" + fileName + "" + "\n" + string.Join("\n", exportPaths)); + + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Start Packing to " + fileName, 0.2f); + Profiler.BeginSample("Create .unitypackage"); + var dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "/Unity/AssetStoreTools/Export"; + + var guidToFile = new Dictionary(); + foreach (var path in exportPaths.OrderByDescending(x => AssetDatabase.GetMainAssetTypeAtPath(x) != null)) + UnitypackageExporter.AddToUnityPackage(path, dir, ref guidToFile); + + var compressionStrength = currentUploadConfig ? currentUploadConfig.compressionStrength : Zipper.CompressionStrength.Normal; + if (!Zipper.TryCreateTgz(dir, fileName, compressionStrength)) + { + Profiler.EndSample(); + throw new Exception("Failed creating .unitypackage " + fileName); + } + EditorUtility.RevealInFinder(fileName); + Directory.Delete(dir, true); + Profiler.EndSample(); + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Done", 1f); + EditorUtility.ClearProgressBar(); + + // Note: "filename" is actually "relative-folder + filename" (it's wrongly named), so we introduce "outputPreDir" as the (folder containing the folder with the file) + var outputPreDir = Path.GetDirectoryName(Application.dataPath); + Debug.Log("Created .unitypackage in " + (sw.ElapsedMilliseconds / 1000f).ToString("F2") + "s at: \"" + outputPreDir + "/" + fileName + "\""); + return false; + } + + // Debug.Log("" + fileName + "" + "\n" + string.Join("\n", guids.Select(AssetDatabase.GUIDToAssetPath))); + return true; + } + } + } + internal static class Helpers + { + internal static string LogPrefix => "[AssetStoreToolsExtension] "; + + internal static void Log(object obj) + { + Debug.Log(LogPrefix + obj); + } + + internal static void LogWarning(object obj) + { + Debug.LogWarning(LogPrefix + obj); + } + + internal static Assembly GetAssetStoreToolsAssembly() + { + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assembly = assemblies.FirstOrDefault(x => x.FullName == @"AssetStoreTools, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"); + return assembly; + } + + internal static bool PatchingSupported() + { + // Harmony is not supported on Apple Silicon right now; see + // https://github.com/pardeike/Harmony/issues/424 + // blocked by https://github.com/MonoMod/MonoMod/issues/90 + var isAppleSilicon = RuntimeInformation.ProcessArchitecture == Architecture.Arm64 + && RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + + return !isAppleSilicon; + } + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoaderAsync.cs.meta b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreToolsExtension.cs.meta similarity index 83% rename from Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoaderAsync.cs.meta rename to Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreToolsExtension.cs.meta index 8db11ef7..48b31ce1 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Interfaces/ISceneLoaderAsync.cs.meta +++ b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreToolsExtension.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 76562df7de1a93f4893ccdfbbbe7a33c +guid: ebd00d677f4f42e4194adbc4ea008310 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreUploadConfig.cs b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreUploadConfig.cs new file mode 100644 index 00000000..890c66f9 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreUploadConfig.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditorInternal; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Needle.HybridPackages +{ + [CreateAssetMenu(menuName = "Needle/Asset Store Upload Config")] + public class AssetStoreUploadConfig : ScriptableObject + { + public List items; + public Zipper.CompressionStrength compressionStrength = Zipper.CompressionStrength.Normal; + public bool respectIgnoreFiles = false; + + public bool IsValid => items != null && items.Any(x => GetActualExportObject(x)); + + public string[] GetExportPaths() + { + if (items == null || !items.Any()) return new string[] { }; + + HashSet exportPaths = new HashSet(); + foreach (var folder in items) + { + var actualExport = GetActualExportObject(folder); + if(actualExport) + exportPaths.Add(AssetDatabase.GetAssetPath(actualExport)); + } + + return exportPaths.ToArray(); + } + + public Object GetActualExportObject(Object obj) + { + if (!obj) return null; + + var path = AssetDatabase.GetAssetPath(obj); + + if(path.StartsWith("Packages/", StringComparison.Ordinal)) + { + path = path.Substring("Packages/".Length); + var indexOfSlash = path.IndexOf("/", StringComparison.Ordinal); + var packageName = path.Substring(0, indexOfSlash); + path = "Packages/" + packageName; + + if(!Unsupported.IsDeveloperMode()) + { + // sanitize: do not allow uploading packages that are in the Library + var libraryRoot = Path.GetFullPath(Application.dataPath + "/../Library"); + if (Path.GetFullPath(path).StartsWith(libraryRoot, StringComparison.Ordinal)) + return null; + + // sanitize: do not allow re-uploading of Unity-scoped packages + if (packageName.StartsWith("com.unity.", StringComparison.OrdinalIgnoreCase)) + return null; + } + return AssetDatabase.LoadAssetAtPath(path); + } + + return obj; + } + + public string GetExportFilename(string outputSubFolder) + { + if (!this) return null; + return outputSubFolder+"/HybridPackage_" + Path.GetDirectoryName(AssetDatabase.GetAssetPath(this)) + .Replace("\\", "/") + .Replace("Assets/", "") + .Replace("Packages/", "") + .Replace("/", "_") + .Trim('_') + + ".unitypackage"; + } + } + + [CanEditMultipleObjects] + [CustomEditor(typeof(AssetStoreUploadConfig))] + internal class AssetStoreUploadConfigEditor : Editor + { + private ReorderableList itemList; + + private void OnEnable() + { + var t = target as AssetStoreUploadConfig; + if (!t) return; + + itemList = new ReorderableList(serializedObject, serializedObject.FindProperty(nameof(AssetStoreUploadConfig.items)), true, false, true, true); + itemList.elementHeight = 60; + itemList.drawElementCallback += (rect, index, active, focused) => + { + var selectedObject = itemList.serializedProperty.GetArrayElementAtIndex(index); + rect.height = 20; + EditorGUI.PropertyField(rect, selectedObject, new GUIContent("Item")); + rect.y += 20; + var actuallyExportedObject = t.GetActualExportObject(itemList.serializedProperty.GetArrayElementAtIndex(index).objectReferenceValue); + if(selectedObject.objectReferenceValue != actuallyExportedObject) + { + if (!actuallyExportedObject) + { + EditorGUI.HelpBox(rect, "This file/package can't be exported.", MessageType.Error); + } + else + { + EditorGUI.ObjectField(rect, "Exported", actuallyExportedObject, typeof(Object), false); + rect.y += 20; + EditorGUI.LabelField(rect, "The entire Package will be exported.", EditorStyles.miniLabel); + } + } + else + { + EditorGUI.HelpBox(rect, "This file is not part of a package.", MessageType.Warning); + rect.y += 20; + EditorGUI.LabelField(rect, "Please export a regular .unitypackage.", EditorStyles.miniLabel); + } + }; + } + + private static readonly GUIContent RespectIgnoreFilesContent = new GUIContent("Respect Ignore Files (experimental)", "Uses .gitignore and .npmignore to filter which files should be part of the package."); + + private static GUIStyle wordWrapLabel; + + public override void OnInspectorGUI() + { + var t = target as AssetStoreUploadConfig; + if (!t) return; + + if(targets.Length <= 1) + { + EditorGUILayout.LabelField(new GUIContent("Selection", "Select all root folders and assets that should be exported. For packages, select the package.json."), EditorStyles.boldLabel); + itemList.DoLayoutList(); + EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(t.respectIgnoreFiles)), RespectIgnoreFilesContent); + serializedObject.ApplyModifiedProperties(); + } + + EditorGUILayout.Space(); + EditorGUILayout.LabelField(new GUIContent("Export to folder:"), EditorStyles.boldLabel); + + EditorGUI.indentLevel++; + if (wordWrapLabel == null) wordWrapLabel = new GUIStyle( GUI.skin.GetStyle( "label" )){ wordWrap = true }; + var outputLocation = Path.GetDirectoryName( Application.dataPath ) + "/Temp"; + EditorGUILayout.LabelField(new GUIContent(outputLocation), wordWrapLabel); + + if (GUILayout.Button("Export for Local Testing" + (targets.Length > 1 ? " [" + targets.Length + "]" : ""))) + { + foreach (var o in targets) + { + var config = (AssetStoreUploadConfig) o; + if(!config) continue; + AssetStoreToolsPatchProvider.ExportPackageForConfig(config); + } + } + + if( GUILayout.Button( "Open Export Folder" ) ) + { + Application.OpenURL( outputLocation ); + } + + #if HAVE_AS_TOOLS_PACKAGE + if (GUILayout.Button("Open Asset Store Uploader")) + { + EditorApplication.ExecuteMenuItem("Asset Store Tools/Asset Store Uploader"); + } + #endif + + EditorGUI.indentLevel--; + + + EditorGUILayout.Space(); + EditorGUI.BeginDisabled(true); + EditorGUILayout.Space(); + foreach(var o in targets) + { + var c = (AssetStoreUploadConfig) o; + EditorGUILayout.LabelField(new GUIContent("Export Roots for " + c.name, "All content from these folders will be included when exporting with this configuration."), EditorStyles.boldLabel); + EditorGUI.indentLevel++; + var paths = c.GetExportPaths(); + foreach (var p in paths) + { + EditorGUILayout.LabelField(p); + } + EditorGUI.indentLevel--; + EditorGUILayout.Space(); + } + EditorGUI.EndDisabled(); + } + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingState.cs.meta b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreUploadConfig.cs.meta similarity index 83% rename from Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingState.cs.meta rename to Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreUploadConfig.cs.meta index 047aa594..7e024c89 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/Loading/LoadingState.cs.meta +++ b/Packages/com.needle.upm-in-unitypackage/Editor/AssetStoreUploadConfig.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0eea660b2ae8d4e498bba8839358ec36 +guid: 72b48b51417c2fb4390f04d9a1d34a86 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Needle.PackageTools.AssetStore.asmdef b/Packages/com.needle.upm-in-unitypackage/Editor/Needle.PackageTools.AssetStore.asmdef new file mode 100644 index 00000000..0ca9819b --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Needle.PackageTools.AssetStore.asmdef @@ -0,0 +1,26 @@ +{ + "name": "Unity.InternalAPIEditorBridge.011", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "AssetStoreTools.dll", + "Needle.PackageTools.AST.Harmony.dll", + "Needle.PackageTools.AST.Ignore.dll" + ], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.asset-store-tools", + "expression": "0.0.0", + "define": "HAVE_AS_TOOLS_PACKAGE" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Needle.PackageTools.AssetStore.asmdef.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Needle.PackageTools.AssetStore.asmdef.meta new file mode 100644 index 00000000..5f2028ca --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Needle.PackageTools.AssetStore.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1ef0bbeee4c5c164fadb7031fd63e223 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins.meta new file mode 100644 index 00000000..b6edb59b --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: defd0bc4cc87c174cb50775754c25271 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Harmony-License.md b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Harmony-License.md new file mode 100644 index 00000000..edeae8e5 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Harmony-License.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Andreas Pardeike + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Assets/ScriptTemplates/72-My Scripts__Game Objects__Scriptable Object-NewScriptableObject.cs.txt.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Harmony-License.md.meta similarity index 75% rename from Assets/ScriptTemplates/72-My Scripts__Game Objects__Scriptable Object-NewScriptableObject.cs.txt.meta rename to Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Harmony-License.md.meta index b98ddf49..ec2711b5 100644 --- a/Assets/ScriptTemplates/72-My Scripts__Game Objects__Scriptable Object-NewScriptableObject.cs.txt.meta +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Harmony-License.md.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 29f71f35823cc314392a406933983d0e +guid: ffa94b56840075044abe40a4d27101b4 TextScriptImporter: externalObjects: {} userData: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Ignore-License.md b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Ignore-License.md new file mode 100644 index 00000000..662ec0a5 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Ignore-License.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Hardik Goel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Assets/ScriptTemplates/71-My Scripts__Game Objects__Mono Behaviour-NewBehaviourScript.cs.txt.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Ignore-License.md.meta similarity index 75% rename from Assets/ScriptTemplates/71-My Scripts__Game Objects__Mono Behaviour-NewBehaviourScript.cs.txt.meta rename to Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Ignore-License.md.meta index 22cc3d89..4749e298 100644 --- a/Assets/ScriptTemplates/71-My Scripts__Game Objects__Mono Behaviour-NewBehaviourScript.cs.txt.meta +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Ignore-License.md.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2026145634d264c45b00c976ff8e7d8d +guid: 1d99054c7a8b9f0418ae1cf68d10841a TextScriptImporter: externalObjects: {} userData: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Harmony.dll b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Harmony.dll new file mode 100644 index 00000000..0601685c Binary files /dev/null and b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Harmony.dll differ diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Harmony.dll.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Harmony.dll.meta new file mode 100644 index 00000000..961a23bf --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Harmony.dll.meta @@ -0,0 +1,89 @@ +fileFormatVersion: 2 +guid: cb8c1cc3f5de7b141bc56c946e4ccb82 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + '': Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Linux + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Ignore.dll b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Ignore.dll new file mode 100644 index 00000000..ba5ac383 Binary files /dev/null and b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Ignore.dll differ diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Ignore.dll.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Ignore.dll.meta new file mode 100644 index 00000000..20ac4ba1 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Plugins/Needle.PackageTools.AST.Ignore.dll.meta @@ -0,0 +1,89 @@ +fileFormatVersion: 2 +guid: 85aa172ecb046b64a8f2e13f6138e880 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 1 + validateReferences: 1 + platformData: + - first: + '': Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Linux + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/UnitypackageExport.cs b/Packages/com.needle.upm-in-unitypackage/Editor/UnitypackageExport.cs new file mode 100644 index 00000000..a22ceffa --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/UnitypackageExport.cs @@ -0,0 +1,273 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using UnityEditor; +using UnityEngine; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; + +namespace Needle.HybridPackages +{ + public static class UnitypackageExporter + { + // This does the same as "Assets/Export Package" but doesn't require the EditorPatching package. + // [MenuItem("Assets/Export Package (with UPM support)")] + // static void ExportSelected() + // { + // var folders = Selection.objects.Where(x => x is DefaultAsset).Cast(); + // if (!folders.Any()) return; + // + // ExportUnitypackage(folders.Select(x => AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(x))), "Export.unitypackage"); + // } + +#if HAVE_AS_TOOLS_PACKAGE + [InitializeOnLoadMethod] + static void SetKeyword() + { + const string define = "UNITY_ASTOOLS_EXPERIMENTAL"; + var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.activeBuildTargetGroup).Split(';'); + if (!defines.Contains(define)) + { + var newDefines = new string[defines.Length + 1]; + Array.Copy(defines, newDefines, defines.Length); + newDefines[newDefines.Length - 1] = define; + PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.activeBuildTargetGroup, string.Join(";", newDefines)); + AssetDatabase.Refresh(); + } + } +#endif + + public static string ExportUnitypackage(IEnumerable packageInfo, string fileName) + { + var guids = packageInfo.Select(x => AssetDatabase.AssetPathToGUID("Packages/" + x.name)); + return ExportUnitypackage(guids, fileName); + } + + public static string ExportUnitypackage(IEnumerable rootGuids, string fileName) + { + if (!fileName.EndsWith(".unitypackage", StringComparison.OrdinalIgnoreCase)) + { + Debug.LogError("File name must end with .unitypackage"); + return null; + } + + var collection = new string[0]; + foreach(var guid in rootGuids) { + collection = AssetDatabase.CollectAllChildren(guid, collection); + } + + PackageUtility.ExportPackage(collection, fileName); + // TODO return absolute export path + return Application.dataPath + "/" + fileName; + } + + // [MenuItem("Test/Export package files")] + // private static void ExportTest() + // { + // var dir = @"C:\Users\wiessler\AppData\Local\Temp\test"; + // AddToUnityPackage(@"C:\git\npm\development\PackagePlayground-2020.3\Assets\PackageToolsTesting\AssetReference\TestMaterial.mat", dir); + // AddToUnityPackage(@"C:\git\npm\development\editorpatching\modules\unity-demystify\package\Documentation~\beforeafter.jpg", dir); + // var package = dir + "/package.unitypackage"; + // Zipper.TryCreateTgz(dir, package); + // EditorUtility.RevealInFinder(package); + // } + + // [MenuItem("Test/Scan Folder for preview.png")] + // private static void ScanFolder() + // { + // var path = EditorUtility.OpenFolderPanel("Select unpacked unitypackage root", "", ""); + // if (!string.IsNullOrEmpty(path)) + // { + // var di = new DirectoryInfo(path); + // + // var distinctExtensionsWithPreview = di.GetDirectories("*", SearchOption.TopDirectoryOnly) + // .Where(x => x.GetFiles("preview.png").Any()) + // .Select(x => File.ReadAllText(x.GetFiles("pathname").First().FullName)) + // .Select(Path.GetExtension) + // .Distinct(); + // + // var distinctExtensionsWithoutPreview = di.GetDirectories("*", SearchOption.TopDirectoryOnly) + // .Where(x => !x.GetFiles("preview.png").Any()) + // .Select(x => File.ReadAllText(x.GetFiles("pathname").First().FullName)) + // .Select(Path.GetExtension) + // .Distinct(); + // + // Debug.Log("Extensions with preview.png files:\n" + string.Join("\n", distinctExtensionsWithPreview)); + // Debug.Log("Extensions without preview.png files:\n" + string.Join("\n", distinctExtensionsWithoutPreview)); + // } + // } + + private static bool IncludePreviewImages = true; + + // TODO figure out a better way / find someone who knows which assets actually get preview.png generated + // derived experimentally for now by exporting a giant .unitypackage from an entire project and checking what happens. + // reason for a block list and not an allow list: ScriptedImporters can be for anything. + private static string[] extensionsWithoutThumbnails = new string[] + { + ".shader", + ".cs", + ".anim", + ".unity", + ".asset", + ".playable", + ".lighting", + ".usdc", + ".usda", + ".usd", + ".usdz", + ".asmdef", + ".asmref", + ".bundle", + ".controller", + ".dll", + ".md", + ".xml", + ".json", + ".txt", + ".manifest", + ".jslib", + ".java", + ".ttf", + ".exp", + ".usdz", + ".mtl", + ".fbx", + ".fbm", + ".pdb", + ".usd", + ".prefab", + ".assbin", + ".mm", + ".iobj", + ".lib", + ".overrideController", + ".so", + ".plist", + ".zip", + ".7z", + ".unitypackage", + ".ipdb", + ".url", + ".shadergraph" + }; + + public static void AddToUnityPackage(string pathToFileOrDirectory, string targetDir, ref Dictionary guidToFile) + { + if (!File.Exists(pathToFileOrDirectory) && !Directory.Exists(pathToFileOrDirectory)) + { + Debug.LogError("File " + pathToFileOrDirectory + " does not exist"); + return; + } + if (Directory.Exists(targetDir)) + { + Directory.CreateDirectory(targetDir); + } + + if (guidToFile.ContainsValue(pathToFileOrDirectory)) + { + throw new ArgumentException($"Duplicate Path exported! {pathToFileOrDirectory}"); + } + + var isFile = File.Exists(pathToFileOrDirectory); + if (pathToFileOrDirectory.EndsWith(".meta", StringComparison.Ordinal)) return; + var metaPath = pathToFileOrDirectory + ".meta"; + var guid = default(string); + var hasMetaFile = File.Exists(metaPath); + if (hasMetaFile) + { + using (var reader = new StreamReader(metaPath)) + { + var line = reader.ReadLine(); + while(line != null) + { + if (line.StartsWith("guid:", StringComparison.Ordinal)) + { + guid = line.Substring("guid:".Length).Trim(); + if (guidToFile.ContainsKey(guid)) + throw new ArgumentException($"Duplicate GUID in AssetDatabase ({guid})?! Existing: {guidToFile[guid]}, new: {pathToFileOrDirectory}"); + guidToFile.Add(guid, pathToFileOrDirectory); + break; + } + line = reader.ReadLine(); + } + } + } + else + { + if (File.Exists(pathToFileOrDirectory)) + { + var bytes = File.ReadAllBytes(pathToFileOrDirectory); + using (var md5 = MD5.Create()) { + md5.TransformFinalBlock(bytes, 0, bytes.Length); + var hash = md5.Hash; + // guid = BitConverter.ToString(hash).Replace("-","");//(md5.Hash); + + guid = new Guid(hash).ToString("N"); + int maxTries = 200; + while (guidToFile.ContainsKey(guid)) + { + Debug.LogWarning($"GUID collision ({guid}), Existing: {guidToFile[guid]}, new: {pathToFileOrDirectory}"); + hash[0]++; + guid = new Guid(hash).ToString("N"); + maxTries--; + if (maxTries < 0) + { + throw new ArgumentException($"GUID collision on file: {pathToFileOrDirectory} with GUID {guid} even after 200 attempts of finding a new one. Aborting."); + } + } + guidToFile.Add(guid, pathToFileOrDirectory); + } + } + } + + if (guid == null) Debug.LogError("No guid for " + pathToFileOrDirectory); + pathToFileOrDirectory = pathToFileOrDirectory.Replace("\\", "/"); + var projectPath = Path.GetFullPath(Application.dataPath + "/../").Replace("\\", "/"); + var relPath = pathToFileOrDirectory; + if (relPath.StartsWith(projectPath, StringComparison.Ordinal)) relPath = relPath.Substring(projectPath.Length); + + var outDir = targetDir + "/" + guid; + if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); + var pathNameFilePath = outDir + "/pathname"; + if(File.Exists(pathNameFilePath)) File.Delete(pathNameFilePath); + File.WriteAllText(pathNameFilePath, relPath); + if(isFile) File.Copy(pathToFileOrDirectory, outDir + "/asset", true); + if (hasMetaFile) File.Copy(metaPath, outDir + "/asset.meta", true); + + if(IncludePreviewImages && isFile && !extensionsWithoutThumbnails.Contains(Path.GetExtension(pathToFileOrDirectory).ToLowerInvariant())) + { +#if UNITY_2020_1_OR_NEWER + var preview = AssetPreview.GetAssetPreviewFromGUID(guid); +#else + var assetPath = AssetDatabase.GUIDToAssetPath(guid); + var asset = string.IsNullOrEmpty(assetPath) ? null : AssetDatabase.LoadAssetAtPath(assetPath); + var preview = asset ? AssetPreview.GetAssetPreview(asset) : default; +#endif + if (preview) + { + var thumbnailWidth = Mathf.Min(preview.width, 128); + var thumbnailHeight = Mathf.Min(preview.height, 128); + var rt = RenderTexture.GetTemporary(thumbnailWidth, thumbnailHeight, 0, RenderTextureFormat.Default, RenderTextureReadWrite.sRGB); + + var copy = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);//, preview.graphicsFormat, preview.mipmapCount, TextureCreationFlags.None); + + RenderTexture.active = rt; + GL.Clear(true, true, new Color(0, 0, 0, 0)); + Graphics.Blit(preview, rt); + copy.ReadPixels(new Rect(0, 0, copy.width, copy.height), 0, 0, false); + copy.Apply(); + RenderTexture.active = null; + + var bytes = copy.EncodeToPNG(); + if (bytes != null && bytes.Length > 0) + { + File.WriteAllBytes(outDir + "/preview.png", bytes); + } + + RenderTexture.ReleaseTemporary(rt); + } + } + } + } +} \ No newline at end of file diff --git a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderAsync.cs.meta b/Packages/com.needle.upm-in-unitypackage/Editor/UnitypackageExport.cs.meta similarity index 83% rename from Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderAsync.cs.meta rename to Packages/com.needle.upm-in-unitypackage/Editor/UnitypackageExport.cs.meta index d6fdea44..8e412b5f 100644 --- a/Packages/com.mygamedevtools.scene-loader/Runtime/SceneLoaders/SceneLoaderAsync.cs.meta +++ b/Packages/com.needle.upm-in-unitypackage/Editor/UnitypackageExport.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f802bf78b50900147ac7055768fe668d +guid: 75df106947e68c74dad4cc3b8c28b51e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Zipper.cs b/Packages/com.needle.upm-in-unitypackage/Editor/Zipper.cs new file mode 100644 index 00000000..d8cd3552 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Zipper.cs @@ -0,0 +1,123 @@ +using System.Diagnostics; +using System.IO; +using UnityEditor; +using Debug = UnityEngine.Debug; + +namespace Needle.HybridPackages +{ + public static class Zipper + { + public enum CompressionStrength + { + Fastest = 1, + Fast = 3, + Normal = 5, + Maximum = 7, + Ultra = 9 + } + + public static bool TryCreateUnityPackageForPackage(string packageDirectory, string packageName, string targetPath) + { + var temp = Path.GetTempPath() + "/" + packageName; + if (Directory.Exists(temp)) Directory.Delete(temp, true); + Debug.Log(temp); + CopyFilesRecursively(packageDirectory, temp); + var res = TryCreateTgz(temp, targetPath); + if (res) Directory.Delete(temp, true); + return res; + } + + private static void CopyFilesRecursively(string sourcePath, string targetPath) + { + foreach (var dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories)) + { + Directory.CreateDirectory(dirPath.Replace(sourcePath, targetPath)); + } + + foreach (var newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories)) + { + File.Copy(newPath, newPath.Replace(sourcePath, targetPath), true); + } + } + + public static bool TryCreateTgz(string contentDirectory, string outputFilePath, CompressionStrength strength = CompressionStrength.Normal) + { + if (Zip(contentDirectory, outputFilePath, strength)) + return true; + return false; + } + + public static bool DebugLog = false; + + private static bool Zip(string directoryPath, string outputFilePath, CompressionStrength strength) + { + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Packing " + outputFilePath, 0f); + + var zipper = Get7zPath(); + outputFilePath = Path.GetFullPath(outputFilePath); + + if (File.Exists(outputFilePath)) + File.Delete(outputFilePath); + + int RunWith(string args) + { + if (DebugLog) + Debug.Log(zipper + " " + args); + var processStartInfo = new ProcessStartInfo(zipper, args); + // processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; + if (directoryPath != null) + processStartInfo.WorkingDirectory = directoryPath; + processStartInfo.UseShellExecute = DebugLog; + processStartInfo.CreateNoWindow = !DebugLog; + var process = Process.Start(processStartInfo); + process?.WaitForExit(); + var res = process?.ExitCode; + if (res.HasValue && res == 0) return res.Value; + if (DebugLog) + Debug.LogError("Result: " + res + " for " + processStartInfo); + return res ?? -1; + } + + // Command line syntax: + // https://sevenzip.osdn.jp/chm/cmdline/syntax.htm + + // Compression switches: + // https://sevenzip.osdn.jp/chm/cmdline/switches/method.htm + + var files = directoryPath + "/*"; // string.Join(" ", filenames.Select(f => "\"" + f.Replace("\\", "/") + "\"").ToArray()); + var tarPath = Path.GetDirectoryName(outputFilePath) + "/archtemp.tar"; + if (File.Exists(tarPath)) File.Delete(tarPath); + var args_tar = $"a -ttar \"{tarPath}\" \"{files}\""; + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Packing .tar file for " + outputFilePath, 0.1f); + var code = RunWith(args_tar); + if (code == 0) + { + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Packing .tar.gz file for " + outputFilePath + ", compression: " + strength, 0.4f); + var args_tgz = $"a -tgzip \"{outputFilePath}\" \"{tarPath}\" -mx" + (int) strength; + if (File.Exists(outputFilePath)) File.Delete(outputFilePath); + code = RunWith(args_tgz); + if (DebugLog) + Debug.Log(code); + var success = code == 0; + if (success) File.Delete(tarPath); + } + + EditorUtility.DisplayProgressBar("Creating .unitypackage", "Done", 1f); + EditorUtility.ClearProgressBar(); + return code == 0; + } + + private static string Get7zPath() + { +#if (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX) + string execFilename = "7za"; +#else + string execFilename = "7z.exe"; +#endif + string zipper = EditorApplication.applicationContentsPath + "/Tools/" + execFilename; + if (!File.Exists(zipper)) + throw new FileNotFoundException("Could not find " + zipper); + return zipper; + } + } +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Editor/Zipper.cs.meta b/Packages/com.needle.upm-in-unitypackage/Editor/Zipper.cs.meta new file mode 100644 index 00000000..2f52403f --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Editor/Zipper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 97d7acb6c08f42adb166739a4a2307ea +timeCreated: 1620044445 \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/LICENSE.md b/Packages/com.needle.upm-in-unitypackage/LICENSE.md new file mode 100644 index 00000000..2f7a9d28 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Needle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/ScriptTemplates/73-My Scripts__Entities__System-NewSystem.cs.txt.meta b/Packages/com.needle.upm-in-unitypackage/LICENSE.md.meta similarity index 75% rename from Assets/ScriptTemplates/73-My Scripts__Entities__System-NewSystem.cs.txt.meta rename to Packages/com.needle.upm-in-unitypackage/LICENSE.md.meta index 10d788fc..a3195ede 100644 --- a/Assets/ScriptTemplates/73-My Scripts__Entities__System-NewSystem.cs.txt.meta +++ b/Packages/com.needle.upm-in-unitypackage/LICENSE.md.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 31054eadc4870474988606b245b7463e +guid: 1d67a253fac9f9d4581f1063f3b7e6fa TextScriptImporter: externalObjects: {} userData: diff --git a/Packages/com.needle.upm-in-unitypackage/Readme.md b/Packages/com.needle.upm-in-unitypackage/Readme.md new file mode 100644 index 00000000..fc25810a --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Readme.md @@ -0,0 +1,367 @@ +# Hybrid Packages + +![Unity Version Compatibility](https://img.shields.io/badge/Unity-2018.4%20%E2%80%94%202022.1-brightgreen) + +Unity has two separate package formats: +- `.unitypackage`, a zip-based file format that is used on the Asset Store +- `UPM package`, to prepare modules for Unity's package manager. + +The latter is newer, enforces better code and directory structure (AsmDefs required), and generally much easier to work with / add / remove / update. + +So far, it has been impossible to ship UPM packages on the Asset Store or via `.unitypackage` files. +This package fixes that by introducing **Hybrid Packages**, regular .unitypackage files that contain the correct directory structures for UPM. +After installing this package, you can select assets and folders from the Packages folder to be exported, which +- allows packages to be uploaded to the Asset Store through the regular Asset Store Tools +- enables Assets/Export Package to export stuff from package folders directly + +The resulting .unitypackage files _do not require any additional setup for users_. This package here is only required for creating those `.unitypackage` files, not for importing them. + +**If you switch to Hybrid Packages today, the transition to "registry-based" packages will be much more painless, as all your code and content will be ready on day 1.** + +## Update (October 2022): Unity has listened and added Hybrid Packages support to their Asset Store Tools! + +It's experimental and needs to be explcitily enabled. There's two ways: + +- either add the Hybrid Packages package (this one)! +- or add the scripting define `UNITY_ASTOOLS_EXPERIMENTAL` in Project Settings. + +> **Note**: We still recommend installing the Hybrid Packages package as it fixes some current issues in Unity's tool, like selecting packages with `file:..` references. + +This will unlock a new option in the Asset Store Uploader window: + +![20221030-024915_Unity](https://user-images.githubusercontent.com/2693840/198858071-9e3fc114-3636-4049-a2cf-d451f51297e9.png) + +**Fun fact:** the Asset Store Tools ship as Hybrid Package themselves! + +![image](https://user-images.githubusercontent.com/2693840/198858153-57f5f9ba-c1c7-406e-9fb6-06594876a522.png) + + +## Installation 💾 +1. +
+ Add the OpenUPM registry with the com.needle scope to your project + + - open Edit/Project Settings/Package Manager + - add a new Scoped Registry: + ``` + Name: OpenUPM + URL: https://package.openupm.com/ + Scope(s): com.needle + ``` + - click Save +
+2. Add this package: + - open Window/Package Manager + - click + + - click Add package from git URL or Add package by name + - paste `com.needle.upm-in-unitypackage` + - click Add + +
+Alternative: git package (no PackMan updates, not recommended) + + - open Window/Package Manager + - click + + - click Add package from git URL or Add package by name + - Add `https://github.com/needle-tools/upm-in-unitypackage.git` in Package Manager + +
+ +## How to use 💡 + +### Export a .unitypackage that contains files in Packages or entire packages +1. select what you want to export +2. hit Assets/Export Package (also available via right click on Assets/Folders). + +### Upload Packages to Asset Store directly + +1. Install the Asset Store Tools as usual: https://assetstore.unity.com/packages/tools/utilities/asset-store-tools-115 +2. Open Asset Store Tools/Asset Store Uploader +3. Find your draft package in the list (must have already created on Unity Publisher Portal) +4. Choose the "Local UPM Package" upload type +5. Use the "Browse" button to select your package directory +6. Select additional packages as needed in the "Extra Packages" section +7. Press Upload + +#### Using an Upload Config to create and upload .unitypackage files + +Using a configuration file makes it easier to specify settings for export, and allows for "Package Bundles" (multiple packages in one `.unitypackage`). + +Here's how it works: + +1. Create a folder for your "package collection" in Assets, e.g. "My Package Collection". +2. In that folder, right click and create a `Needle/Asset Store Upload Config`. +3. Add entries to the `Selection`" array and drag the folders/files into the `Item` field. + For packages, drag in the `package.json` since package folders can't be drag-dropped. + This can be a single file, a folder, one or multiple packages, or a combination of these. +4. To test your Hybrid Package locally, select your config, and click Export for Local Testing. + This produces exactly the same .unitypackage as on Store upload, so you can test this one by importing it into a different/empty project. +5. Open Asset Store Tools/Asset Store Uploader +4. Choose the "Pre-exported unitypackage" upload type +5. Select the .unitypackage you already exported that contains package data +7. Press Upload + +## Known Issues / Limitations +- The optional Validate step isn't supported yet. Export your package via Right Click/Export Package or an Upload Config and test in a separate project for now. +- Dependencies into other packages shouldn't be exported, so you must turn off "Include Dependencies" when exporting a package. +- The `package.json` of your package can [define dependencies](https://docs.unity3d.com/Manual/upm-manifestPrj.html). However, only dependencies from the Unity Registry will be automatically resolved in empty projects - we'll need to think of a separate mechanism / guidance for people to add dependencies from scoped registries. For now, it's recommended that you guard against missing dependencies via [Version Defines](https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html#define-symbols). +- .unitypackage preview images for hidden folders will not be exported unless you're on 2020.1+ and had that folder in the AssetDatabase in the current session (e.g. the folder was named "Samples" and then "Samples~" to hide it before export). +- There's experimental support for .gitignore and .npmignore, but the behaviour isn't exactly the same as with npm/git (e.g. when multiple of these are in different folders, the order they are applied isn't always correct). You can turn this on on the UploadConfig asset. +- The AssetStore Tools sometimes get stuck in an endless loop when trying to export nearly empty folders or empty multi-package sets. This seems to be an AssetStore Tools bug. + +---------- + +## FAQ / Why should I use this? + +Hybrid Packages are an in-between solution. Unity is still not ready for a proper, registry-based package workflow for the Asset Store. Hybrid Packages allow Asset Store developers to switch to a package-based workflow today, with some (but not all) of the benefits of that, with no (known) downsides compared to the current workflow. +If you switch to Hybrid Packages today, the transition to "registry-based" packages will be much more painless, as all your code and content will be ready on day 1. + +### How are these packaged up by your tool during submission? +Nothing changes, same process as the regular "Export > Unity Package" flow or "Asset Store Tools > Upload" (which are the same). Our tooling mostly just disables the check for "is this in assets?" and thus allows you to upload your embedded/local packages to the AssetStore. + +### When they are unpacked during installation, where do the assets wind up? +The files that before went into +`Assets/YourContent/` +now end up in +`Packages/com.your.content/ `. +This is what's called an embedded package. It is mutable, that is, users can change the files. It is not in the library, and files don't get duplicated into the `Library/PackageCache` folder. Also, this folder is not (and should not) be excluded from source control. From a file system perspective, it's really just a move from `Assets/` to `Packages/`, bringing some of the package benefits with it. + +Here's an example of how this looks for the Asset Store Tools themselves, which also ship as Hybrid Package: +![image](https://user-images.githubusercontent.com/2693840/198858135-1795f67d-9121-4835-95e4-214c237ecfb7.png) + +### How does Unity treat these assets when they are placed in the new (and non-standard) location? +For assets, nothing changes, no new/different rules. This is the same as if a user makes a `Packages/com.your.content/` folder and moves the files there (what a good number of users are already doing anyways). For scripts, Unity's rules for packages apply: code needs to be in AsmDefs to be compiled. This enforces better code structure, faster compilation, and is benefictial no matter if in "Assets" or "Packages". + +### Do these packages appear in the Package Manager at all? If so, can I use the "Install Sample" (or whatever it is) feature? How does that work? +Yes, this is one of the main points! Hybrid Packages +- show up in PackMan +- can use package.json dependencies +- can ship samples that can be installed via Package Manager. Samples are shipped with your .unitypackage in a folder called `Samples~` and set up via package.json. (see below for more on this) + +### How does this differ from the package lifecycle for packages installed via Package Manager? +Local Packages don't come from a registry, they're just "local". That is, they can't be updated via `PackageManager/In Project`. They still get updated by users from `Package Manager/My Assets` by downloading the new version and it gets "unpacked" over the old, as before. So, same rules still apply for updates: if you removed files, ask users to delete the folder before importing. + +_Before_ the existance of Hybrid Packages, installing Asset Store Content in user projects was mostly a fire-and-forget operation: +Users download a package, install it, and then neither the user nor Package Manager have any information that this content is actually in the project (of course the user can look for the folder, but the point is there's no real "entry point" for the content). + +_Now_, with Hybrid Packages, the content actually shows up in clear, structured places after installation: +- as a package in the project, under `Packages/Your Content` in the Project Window +- in the `In Project` section in Package Manager, with the ability to install Samples +- Updates are still done in the `My Assets` section as before. + +When the package is _not_ installed, it only shows up in "My Assets", as before. No change here. + +### How do I prepare my asset for the package workflow? +You create a local or embedded package: you define your own package.json file and add the relevant details such as your package name/version/description/author, set up "Runtime" and "Editor" folders. + +You move your code and assets over: make sure that all scripts are part of AsmDef files, that are properly marked for "Runtime" or "Editor". Mostly, that's it! + +_Recommended:_ Add a documentationUrl in your package.json, pointing at your docs either locally or on the web. This will be opened when people click on "Documentation" for your package in Package Manager. + +Also see Guide to Packages. + +### Now that dependencies can be specified via package.json, what happens to the "Include Dependencies" functionality in the Asset Store Tools? +The "Include Dependencies" is now redundant. It never worked great (sometimes including way too many dependencies), and you have much more fine-grained control by adding exactly the dependencies you need to your package.json. +This has the additional benefit that dependencies aren't forcefully added to user project manifests (as with the Asset Store solution) - they are only resolved as long as your package is actually in the project. + +### How do I add samples that can be installed via Package Manager? +In your package.json, you can declare an array of samples for your package: + +```"samples": [ { "displayName" : "..", "description":"...", "path":"Samples~/..." } ]``` + +Samples are stored in folders. These all live in a folder called `Samples~` (note the tilde), which is hidden in Unity. +While you work on your samples, you simply rename the folder to `Samples`, and before submitting, you rename it back to `Samples~`. + +The advantage of shipping samples this way is that while samples are already downloaded and ready to be used, they don't clutter the asset database of user projects – only once people import the sample is it copied over to their Assets folders, ready to be adjusted as needed. + +### What differences, if any, are there regarding Unity's Special Folders? Is the functionality the same? Do Gizmos and other folders still work as expected? + +### Future: How do I prepare my asset for the future "registry-based" package workflow? + +_Note: some of the below depends on how Unity implements this for Asset Store publishers._ + +The main change with "registry-based" packages is that they are immutable, which means that users can't change the files in the package (they can still "embed" the package and make it locally editable, like you can for all Unity packages). + +But the goal is that your package is a single thing, nobody changes the content of it. Users then compose their project out of these assets as usual, e.g. they use animation files, models, materials, make new prefab variants, use components, ... + +One thing that you can't do anymore at this point is write your own files (e.g. settings) into your package once it's in users hands. Thus, your settings should live in a proper place depending on whether they need to be accessible in the Editor only (ProjectSettings/UserSettings) or at runtime (Assets/Resources). +If your code reads/writes from a settings file, this is a good point in time to modernize this, if you haven't already. Make sure settings are accessible via a SettingsProvider](https://docs.unity3d.com/ScriptReference/SettingsProvider.html?), and are either stored in "ProjectSettings", "UserSettings" or "Assets/Resources" (for settings that need to be available at runtime). + +## Technical Details + +This is tested with Unity 2018.4, 2019.4, 2020.3 and Asset Store Tools 5.0.4. + +All the functionality to use packages in .unitypackages is already provided by Unity. Just the tooling to create them has too many incorrect/outdated safety checks - so all we're doing here is bypassing those. It's still the same Unity APIs creating / exporting / importing packages. + +## Ideas for Future Development +- Immutable Packages could be shipped in `.unitypackage` as well as `Packages/com.my.package.tgz`, but this needs a bit more work to create an additional archive and include that in the exported package. +- ~~More safeguards around accidental inclusion of dependencies from other packages~~ +- Ability to show hints/warnigs for people to ask them to manually install dependencies from scoped registries. The Unity Terms of Service currently prohibit doing this automatically. + +## If you're Unity + +We're happy to provide guidance on what we needed to change here. This took only a few hours to create, and ideally wouldn't be necessary - `AssetStoreTools.dll` and `.unitypackage` utilities in Unity could just work. + +## Guide to Packages + + +**Option 1: Single-Project Workflow** +A single project where you work on your asset. + +``` +Your Test Project +├── Assets +└── Packages + ├── manifest.json + ├── manifest-lock.json + └── com.your.package "Your package root folder" + ├── package.json "Specify package name, version, author, dependencies, samples, documentationUrl here" + ├── Changelog.md "This should follow SemVer conventions. See sample" + ├── Readme.md "Some basic info to get started" + ├── Runtime + │ ├── Your.Package.asmdef + │ └── "your runtime code and assets" + ├── Editor + │ │── Your.Package.Editor.asmdef "This AsmDef must be set to Editor-only" + │ └── "your editor code and assets" + └── Samples~ "This folder is hidden, samples get specified in package.json" + ├── Simple Sample + │ └── "your sample code and files" + └── Complex Sample + └── "your sample code and files" +``` + +**Option 2: Multi-Project Workflow (recommended)** +Many packages need to support multiple Unity versions. This has traditionally been pretty cumbersome to maintain, with multiple submodules in different projects, copy-pasting code over, or just hoping everything works. +One of the biggest advantages of a package-based workflow is that cross-version development becomes incredibly easy, as the same package on disk can be referenced by multiple projects. Testing code is as simple as focussing the right Unity Editor instance. + +``` +Your Content Development Folder "often the git repository root" +├── Your Test Project on Unity 2019.4 +│ ├── Assets +│ └── Packages +│ ├── manifest.json "contains the line: " "com.your.package":"file:../../com.your.package" +│ └── manifest-lock.json +│ +├── Your Test Project on Unity 2020.3 +│ ├── Assets +│ └── Packages +│ ├── manifest.json "contains the line: " "com.your.package":"file:../../com.your.package" +│ └── manifest-lock.json +│ +├── Your Test Project on Unity 2021.3 +│ ├── Assets +│ └── Packages +│ ├── manifest.json "contains the line: " "com.your.package":"file:../../com.your.package" +│ └── manifest-lock.json +│ +└── com.your.package "Your package root folder" + ├── package.json "Specify package name, version, author, dependencies, samples, documentationUrl here" + ├── Changelog.md "This should follow SemVer conventions. See sample" + ├── Readme.md "Some basic info to get started" + ├── Runtime + │ ├── Your.Package.asmdef + │ └── "your runtime code and assets" + ├── Editor + │ │── Your.Package.Editor.asmdef "This AsmDef must be set to Editor-only" + │ └── "your editor code and assets" + └── Samples~ "This folder is hidden, samples get specified in package.json" + ├── Simple Sample + │ └── "your sample code and files" + └── Complex Sample + └── "your sample code and files" + +``` + +**Complete Example: `package.json`** + +```json +{ + "name": "com.needle.my-package", + "version": "2.3.0", + "displayName": "My Package", + "description": "Shows how to set up a Package", + "author": + { + "name": "Needle", + "email": "hi@needle.tools", + "url": "https://needle.tools" + }, + "unity": "2019.4", + "type": "tool", + "documentationUrl": "https://github.com/needle-tools/upm-in-unitypackage#readme", + "samples": + [ + { + "displayName": "Simple Sample", + "description": "A very simple example, enough to get started.", + "path": "Samples~/Simple Sample" + }, + { + "displayName": "Complex Sample", + "description": "Shows everything this package can do.", + "path": "Samples~/Complex Sample" + } + ] +} +``` + +**Complete Example: `Changelog.md`** + +```md +# Changelog +All notable changes to this package will be documented in this file. +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [2.0.0] - 2021-02-12 +- added: new horse +- fixed: old horse sometimes lost teeth + +## [1.1.0] - 2021-01-08 +- added: horse controller and sample +- fixed: sample didn't actually explain how everything works + +## [1.0.0] - 2021-01-05 +- initial release with one horse +``` + +**Complete Example: Single-Project Folder Structure with settings** + +``` +Your Test Project +├── Assets +│ └── Resources +│ └── YourPackageRuntimeSettings.asset "Your package should generate this if needed. Note, Users might move it somewhere else!" +├── Packages +│ ├── manifest.json +│ ├── manifest-lock.json +│ └── com.your.package "Your package root folder" +│ ├── package.json "Specify package name, version, author, dependencies, samples, documentationUrl here" +│ ├── Changelog.md "This should follow SemVer conventions. See sample" +│ ├── Readme.md "Some basic info to get started" +│ ├── Runtime +│ │ ├── Your.Package.asmdef +│ │ └── "your runtime code and assets" +│ ├── Editor +│ │ │── Your.Package.Editor.asmdef "This AsmDef must be set to Editor-only" +│ │ └── "your editor code and assets" +│ └── Samples~ "This folder is hidden, samples get specified in package.json" +│ ├── Simple Sample +│ │ └── "your sample code and files" +│ └── Complex Sample +│ └── "your sample code and files" +├── ProjectSettings +│ └── YourPackageProjectSettings.asset "If your package has project-specific settings, put them here" +└── UserSettings + └── YourPackageUserSettings.asset "If your package has user-specific settings, put them here" +``` + +**Complete Example: Settings Provider** +```TODO // Move somewhere else``` + +## Contact ✒️ +[🌵 needle — tools for unity](https://needle.tools) • +[@NeedleTools](https://twitter.com/NeedleTools) • +[@marcel_wiessler](https://twitter.com/marcel_wiessler) • +[@hybridherbst](https://twitter.com/hybridherbst) • +[Needle Discord](https://discord.gg/CFZDp4b) diff --git a/Packages/com.needle.upm-in-unitypackage/Readme.md.meta b/Packages/com.needle.upm-in-unitypackage/Readme.md.meta new file mode 100644 index 00000000..36783671 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Readme.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1a0dd248cfa2c0045a4100b8e3f8c0f8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config.meta new file mode 100644 index 00000000..8c5fc221 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0974992eb90174042a6ea1a8a00c7d26 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config/Hybrid Packages Upload Config.asset b/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config/Hybrid Packages Upload Config.asset new file mode 100644 index 00000000..6b6c6047 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config/Hybrid Packages Upload Config.asset @@ -0,0 +1,17 @@ +%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: 72b48b51417c2fb4390f04d9a1d34a86, type: 3} + m_Name: Hybrid Packages Upload Config + m_EditorClassIdentifier: + items: + - {fileID: 2100000, guid: f9fa06aeedf24f042a4b5cec1c389bb9, type: 2} + - {fileID: 8385607101436470782, guid: e7d8125c437c58147941d1b4abeba86b, type: 3} diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config/Hybrid Packages Upload Config.asset.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config/Hybrid Packages Upload Config.asset.meta new file mode 100644 index 00000000..340459d4 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Asset Store Upload Config/Hybrid Packages Upload Config.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c1e8454340c979d43b37eb1ae65e92f7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples.meta new file mode 100644 index 00000000..4c3706ce --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a46b2fe2794a20343b063cf14fb01d07 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Changelog.md b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Changelog.md new file mode 100644 index 00000000..9023e7f1 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Changelog.md @@ -0,0 +1,5 @@ +# Changelog +All notable changes to this package will be documented in this file. +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2022-10-30 \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Changelog.md.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Changelog.md.meta new file mode 100644 index 00000000..d82aeb6c --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Changelog.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7ae9e90a780483e45942e4e3ecac7caf +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor.meta new file mode 100644 index 00000000..1e7d23f8 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3ff447a850e31f41b14e2241e3af81f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/MySampleComponentEditor.cs b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/MySampleComponentEditor.cs new file mode 100644 index 00000000..ce1610e2 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/MySampleComponentEditor.cs @@ -0,0 +1,14 @@ +using UnityEditor; + +namespace Needle.MyPackage +{ + [CustomEditor(typeof(MySampleComponent))] + public class MySampleComponentEditor : Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.LabelField("My Sample Component", EditorStyles.boldLabel); + DrawDefaultInspector(); + } + } +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/MySampleComponentEditor.cs.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/MySampleComponentEditor.cs.meta new file mode 100644 index 00000000..c6431285 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/MySampleComponentEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 819d0ed84c86a814c9bad15002131906 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/Needle.MyPackage.Editor.asmdef b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/Needle.MyPackage.Editor.asmdef new file mode 100644 index 00000000..b6163941 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/Needle.MyPackage.Editor.asmdef @@ -0,0 +1,18 @@ +{ + "name": "Needle.MyPackage.Editor", + "rootNamespace": "", + "references": [ + "GUID:e58729a9bca53b54381c73ba388f7dcb" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/Needle.MyPackage.Editor.asmdef.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/Needle.MyPackage.Editor.asmdef.meta new file mode 100644 index 00000000..f828df03 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Editor/Needle.MyPackage.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c770dedabc19b16419e49cca957dbd80 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Readme - Move me to the Packages folder.txt b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Readme - Move me to the Packages folder.txt new file mode 100644 index 00000000..e69de29b diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Readme - Move me to the Packages folder.txt.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Readme - Move me to the Packages folder.txt.meta new file mode 100644 index 00000000..8c8a7948 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Readme - Move me to the Packages folder.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ee144de55cff3dc48ba017c35c71ffbb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime.meta new file mode 100644 index 00000000..d0184756 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 55aff9eb31ebf4e47b5fb1c8d1d184d8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/MySampleComponent.cs b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/MySampleComponent.cs new file mode 100644 index 00000000..16d52fac --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/MySampleComponent.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace Needle.MyPackage +{ + public class MySampleComponent : MonoBehaviour + { + [Tooltip("A Sample Setting")] + public bool sampleSetting; + } +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/MySampleComponent.cs.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/MySampleComponent.cs.meta new file mode 100644 index 00000000..4990ab52 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/MySampleComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8fcae18749b2ad043b84f303276ec49a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/Needle.MyPackage.asmdef b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/Needle.MyPackage.asmdef new file mode 100644 index 00000000..f057f06d --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/Needle.MyPackage.asmdef @@ -0,0 +1,14 @@ +{ + "name": "Needle.MyPackage", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/Needle.MyPackage.asmdef.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/Needle.MyPackage.asmdef.meta new file mode 100644 index 00000000..05de21d7 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Runtime/Needle.MyPackage.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e58729a9bca53b54381c73ba388f7dcb +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample.meta new file mode 100644 index 00000000..7daf45c6 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b2720cccf509a54bbd3c3dfd32b39c1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 01.txt b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 01.txt new file mode 100644 index 00000000..e69de29b diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 01.txt.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 01.txt.meta new file mode 100644 index 00000000..127d6540 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 01.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 988785e6d499caa4fbb4be444c6940d5 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 02.txt b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 02.txt new file mode 100644 index 00000000..e69de29b diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 02.txt.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 02.txt.meta new file mode 100644 index 00000000..b4cc0fec --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Complex Sample/Incredibly complex sample with TWO files - 02.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9b3f71dd47b9f8d40a29d16348c0d0f3 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample.meta new file mode 100644 index 00000000..fb21e274 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2022e6cf63b014e4fb3a23fe6cb22432 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample/A very simple sample with just one file.txt b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample/A very simple sample with just one file.txt new file mode 100644 index 00000000..e69de29b diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample/A very simple sample with just one file.txt.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample/A very simple sample with just one file.txt.meta new file mode 100644 index 00000000..1913899a --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/Samples~/Simple Sample/A very simple sample with just one file.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f7a1f116f78d5e149b2dca9beac78cad +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/package.json b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/package.json new file mode 100644 index 00000000..85246ef9 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/package.json @@ -0,0 +1,28 @@ +{ + "name": "com.needle.my-package", + "version": "2.3.0", + "displayName": "My Package", + "description": "Shows how to set up a package.json", + "author": + { + "name": "Needle", + "email": "hi@needle.tools", + "url": "https://needle.tools" + }, + "unity": "2019.4", + "type": "tool", + "documentationUrl": "https://github.com/needle-tools/upm-in-unitypackage#readme", + "samples": + [ + { + "displayName": "Simple Sample", + "description": "A very simple example, enough to get started.", + "path": "Samples~/Simple Sample" + }, + { + "displayName": "Complex Sample", + "description": "Shows everything this package can do.", + "path": "Samples~/Complex Sample" + } + ] + } \ No newline at end of file diff --git a/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/package.json.meta b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/package.json.meta new file mode 100644 index 00000000..04dd8a34 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/Samples~/Package with Samples/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 619849b78037ee544a837405cb1959df +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.needle.upm-in-unitypackage/package.json b/Packages/com.needle.upm-in-unitypackage/package.json new file mode 100644 index 00000000..697df388 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/package.json @@ -0,0 +1,30 @@ +{ + "displayName": "Hybrid Packages", + "name": "com.needle.upm-in-unitypackage", + "version": "0.6.3", + "unity": "2018.4", + "description": "Export UPM packages as .unitypackage files and upload them to the AssetStore", + "author": { + "name": "Needle", + "email": "contact@needle.tools", + "url": "https://needle.tools" + }, + "category": "Libraries", + "documentationUrl": "https://github.com/needle-tools/upm-in-unitypackage#readme", + "samples": [ + { + "displayName": "Asset Store Upload Config", + "description": "Example for uploading multiple assets/folders/packages to the Asset Store.", + "path": "Samples~/Asset Store Upload Config" + }, + { + "displayName": "Package with Samples", + "description": "Basic package example with samples.", + "path": "Samples~/Package with Samples" + } + ], + "type": "library", + "publishConfig": { + "registry": "https://package.openupm.com" + } +} diff --git a/Packages/com.needle.upm-in-unitypackage/package.json.meta b/Packages/com.needle.upm-in-unitypackage/package.json.meta new file mode 100644 index 00000000..0338e3d5 --- /dev/null +++ b/Packages/com.needle.upm-in-unitypackage/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e7d8125c437c58147941d1b4abeba86b +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/CHANGELOG.md b/Packages/com.unity.asset-store-tools/CHANGELOG.md new file mode 100644 index 00000000..d51cbe89 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/CHANGELOG.md @@ -0,0 +1,324 @@ +# Changelog +All notable changes to this package will be documented in this file. + +## [12.0.1] - 2025-01-16 + +### Preview Generator changes +- Updated generated preview collection UI to display the asset extension +- Fixed an issue with some prefab and model asset types not generating previews +- Fixed an error that could occur when changing scenes after deleting a preview source asset + +## [12.0.0] - 2025-01-13 + +### General changes +- The code comprising the Asset Store Publishing Tools has been refactored. +- Added dependency on Newtonsoft Json + +### Uploader changes +- Updated window to retain its state if closed unless a domain reload occurs +- Added option to generate higher resolution asset previews when exporting +- Fixed a rare issue where authentication would fail +- Minor UI tweaks + +### Validator changes +- Added validation tests for: + - Package naming + - Project Template assets +- Updated the Type Namespace validation test to check for Unity top level namespaces + +### Exporter changes +- Updated how asset previews are generated/included for the package that is being exported + +### Preview Generator +- Added a Preview Generator window that can be used to pre-generate and inspect package previews before exporting + +## [11.4.4] - 2024-11-29 + +### Validator Changes +- The validator UI window description section can now be expanded or shrunk to take up less screen space +- Updated severity of the Model Importer Logs validation test + +### Exporter Changes +- Updated exporter to always exclude hidden files and folders beginning with the dot symbol (e.g.: .hiddenFolder/ or .hiddenfile.txt) +- Updated exporter to explicitly exclude extended attribute files when exporting packages on macOS systems + +### Other +- Moved the Asset Store Tools toolbar items into the Tools section +- Fixed several window-related compilation warnings when using Unity 6 versions of the Editor + +## [11.4.3] - 2024-08-01 + +### Validator Changes +- Hotfix: Remove non-ascii characters from the demo scene validation + +## [11.4.2] - 2024-07-30 + +### Validator Changes +- Check for nested .unitypackage files in the demo scene validation +- Prevent normal map test from erroring when misc importer types are detected +- Remove Templates category from the uncompressed images requirement list + +## [11.4.1] - 2024-05-10 + +### Exporter Changes +- Fixed an issue with bundled plugin folder contents not being exported + +### Other +- Miscellaneous internal changes + +## [11.4.0] - 2024-01-23 + +### Uploader Changes +- Added prevention of uploading packages larger than 6 GB +- Added a prompt to allow automatically generating meta files within hidden folders +- Fixed some obsolete API usage warnings in newer Unity versions + +### Validator Changes +- Added validation tests for: + - Animation Clip take names + - Model import logs + - Uncompressed Package size +- Updated the fail severity of Audio Clipping validation test +- Updated the Demo Scene test to treat default scenes with custom skyboxes as valid demo scenes +- Fixed some obsolete API usage warnings in newer Unity versions + +### Other +- Added an option to check for Asset Store Publishing Tools updates + +## [11.3.1] - 2023-08-14 + +### Uploader Changes +- Added the option to select indirect package dependencies from the project (e.g. Mathematics package installed by the Burst package) + +### Validator Changes +- Updated the Texture Dimensions test to ignore 'Sprite' and 'Editor GUI' texture types + +### Exporter Changes +- Updated exporter to ignore the 'ProjectSettings/ProjectVersion.txt' asset when exporting 'Complete Project' category packages + +## [11.3.0] - 2023-07-04 + +### Uploader Changes + +- Added the option to validate a pre-exported package +- Added the option to export a .unitypackage file without uploading +- Updated the dependency selection UI + +### Validator Changes + +- Added the option to validate several asset paths at once + - Note: when validating package that is comprised of several folders (e.g. Assets/MyPackage + + Assets/StreamingAssets + Assets/WebGLTemplates), please select all applicable paths that would be included in the package +- Added several new validation tests for: + - File Menu Names + - Compressed files + - Model Types + - Texture Dimensions + - Particle Systems + - Normal Map Textures + - Audio Clipping + - Path Lengths + - Script Compilation +- Updated validation test severities based on package category +- Updated validation tests to each have their own test logic class +- Updated validation tests to be displayed in alphabetical order +- Fixed several issues with the namespace check test +- Fixed scenes in Samples~ folders not being taken into account for the sample scene check test +- Other internal changes + +### Exporter Changes + +- Package exporter is now a separate module (similar to Uploader and Validator) +- Fixed hidden folders being included when exporting package content + - Note: this prevents an issue with the Unity Editor, where exported hidden folders would appear in the Project window + as empty folders when imported, despite having content on disk. Content nested within hidden folders is still collected, + provided it contains unique .meta files + +## [11.2.2] - 2023-02-23 + +### Validator Changes + +- Updated the 'LOD Setup' test to address some issues + - Added additional checks for LOD renderers (inactive renderer check, LOD Group reference check, relative hierarchy position to LOD Group check) + - LOD Group Component is no longer required to be on the root of the Prefab + - Updated the test result message interface when invalid Prefabs are found + +## [11.2.1] - 2023-01-17 + +### Uploader Changes + +- Added a more informative error when exporting content with clashing guid meta files in hidden folders +- Fixed a compilation issue for Unity 2020.1 and 2020.2 +- Fixed a rare error condition when queueing multiple package uploads in quick succession +- Fixed Asset Store Uploader state not being properly reset if the uploading process fails + +### Validator Changes + +- Updated the Asset Store Validator description +- Fixed a rare memory overflow issue when performing package validation + +## [11.2.0] - 2022-11-03 + +### Uploader Changes + +- Uploader will now use the custom package exporter by default + - An option to use the legacy (native) exporter can be found in the Asset Store Publishing Tools' settings window +- When exporting from the Assets folder, package dependencies can now be selected individually instead of being a choice between 'All' or 'None' + - This option is only available with the custom exporter +- Changed the way the Uploader reports completed uploading tasks + - Modal pop-up has been replaced by a new UI view state + - Added an option to the Asset Store Publishing Tools' Settings to display the pop-up after a completed upload +- Changed exported .unitypackage files to have distinguishable file names +- Fixed the Uploader window indefinitely stalling at 100% upload progress when a response from the Asset Store server is not received +- Fixed native package exporter producing broken packages when the export path contained hidden folders +- Fixed an issue with high CPU usage when uploading packages +- Fixed Asset Store Publishing Tools' settings not being saved between Editor sessions on macOS +- Other minor changes and tweaks + +### Validator Changes + +- Added two new tests: + - 'Types have namespaces': checks whether scripts and native libraries under the validated path are nested under a namespace + - 'Consistent line endings': checks whether scripts under the validated path have consistent line endings. This is similar to the warning from the Unity Editor compilation pipeline when a script contains both Windows and UNIX line endings. +- Improved 'Reset Prefabs' test to display and be more informative about prefabs with unusually low transform values +- Improved 'SpeedTree asset inclusion' test to search for '.st' files +- Improved 'Documentation inclusion' test to treat '.md' files as valid documentation files +- Improved 'Lossy audio file inclusion' test to treat '.aif' and '.aiff' files as valid non-lossy audio files +- Improved 'Lossy audio file inclusion' test to search the project for non-lossy variants of existing lossy audio files +- Removed 'Duplicate animation names' test +- Tweaked validation severities for several tests +- Other minor changes and tweaks + +## [11.1.0] - 2022-09-14 + +### Uploader Changes + +- Package Publisher Portal links can now be opened for all packages regardless of package status +- External Dependency Manager can now be selected as a 'Special Folder' if found in the root Assets folder + +### Validator Changes + +- Added category selection for the Validator + - Categories help determine the outcome of package validation more accurately. For example, documentation is not crucial for art packages, but is required for tooling packages. +- Added a list of prefabs with missing mesh references to 'Meshes have Prefabs' test when the test fails +- Corrected the message for a passing 'Shader compilation errors' test +- Improved the floating point precision accuracy of 'Reset Prefabs' test +- Fixed 'Missing Components in Assets' test checking all project folders instead of only the set path +- Fixed 'Prefabs for meshes' test not checking meshes in certain paths +- Fixed 'Reset Prefabs' test failing because of Prefabs with a Rect Transform Component +- Fixed 'Reset Prefabs' test ignoring Transform rotation +- Fixed test description text overlapping in some cases +- Other minor changes and tweaks + +## [11.0.2] - 2022-08-09 + +- Corrected some namespaces which were causing issues when deriving classes from Editor class + +## [11.0.1] - 2022-08-05 + +### Uploader Changes + +- Added Settings window (Asset Store Tools > Settings) +- Added Soft/Junction Symlink support (enable through Settings) +- Added workflow and path selection serialization (workflow saved locally, paths locally and online) +- No more logs when using the `-nullable` compiler option (thanks @alfish) +- Some API refactoring in preparation for CLI support +- Other minor fixes/improvements + +**Note:** when updating Asset Store Tools from the Package Manager, don't forget to remove the old version from the project (V11.0.0) before importing the new one (V11.0.1) + + +## [11.0.0] - 2022-07-20 + +### Uploader changes + +- UI has been reworked using UI Toolkit +- New login window, allowing to login using Unity Cloud Services +- Improved top bar, including search and sorting +- Draft packages moved to the top +- Added category, size, and last modified date next to the package +- Added a link to the publishing portal next to the package +- New uploading flow: “Pre-exported .unitypackage” +- Previous uploading flow (folder selection) has been renamed to “From Assets Folder” +- Dependencies check has been renamed to “Include Package Manifest” for clarity +- Special Folders can now be selected and uploaded together with the package’s main folder (i.e. StreamingAssets, Plugins) +- You can now upload to multiple packages at the same time without waiting for the first one to finish +- Package can now be validated in the Uploading window by pressing the “Validate” button +- Added refresh and logout buttons to the bottom toolbar for easier access +- Packages caching - package information will no longer be redownloaded every time you open the Uploader window during the same Editor session +- (Experimental) Custom exporter - will export your package ~2 times faster, but may miss some asset previews in the final product. To enable it - click three dots on the top left side of the window and enable “Use Custom Exporting” + + +### Validator changes + +- UI has been reworked using UI Toolkit +- New tests based on the new guidelines +- Updated tests’ titles, descriptions, and error reporting + +## [5.0.5] - 2021-11-04 + +- Fixed namespace issues + +## [5.0.4] - 2020-07-28 + +- Fixed issues with Unity 2020.1 + +## [5.0.3] - 2020-05-07 + +- Remove "Remove Standard Assets" check + +## [5.0.2] - 2020-04-21 + +- Enable auto login with Unity account +- Upload package with thread + +## [5.0.1] - 2020-03-23 + +- Fix domain resolve issue + +## [5.0.0] - 2019-10-09 + +- Added "Package Validator" tool +- Added Help window +- Added logout confirmation popup +- Updated toolbar menu layout +- Removed "Mass Labeler" tool +- Updated layout of Login and Package Upload windows +- Error messages are now more elaborate and user-friendly +- Removed deprecated "Main Assets" step from the Package Upload window +- Package Upload window now has a step for including package manager dependencies +- Tooltips are now added to each upload process step + + +## [4.1.0] - 2018-05-14 + +- Made Tool compatible with 2017.1 + +## [4.0.7] - 2017-07-10 + +- Tweaked menu items. + +## [4.0.6] - 2016-07-15 + +- Improved error messages. + +## [4.0.5] - 2016-03-17 + +- Enabling upload of fbm files. + +## [4.0.4] - 2015-11-16 + +- Login improvements + +## [4.0.3] - 2015-11-16 + +- Prepare the Tools for Unity 5.3 + +## [4.0.2] - 2015-10-23 + +- Fixed issue where Upload button would not work for some projects. +- Fixed issues for publishers that only had one package. + +## [4.0.0] - 2015-09-01 + +- Replaced Package Manager with Package Upload. Package management is now handled by Publisher Administration \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/CHANGELOG.md.meta b/Packages/com.unity.asset-store-tools/CHANGELOG.md.meta new file mode 100644 index 00000000..9ca86c3d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/CHANGELOG.md.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 06607220dbd46414e8f66bf9c5e3eb79 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/CHANGELOG.md + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor.meta b/Packages/com.unity.asset-store-tools/Editor.meta new file mode 100644 index 00000000..8521ad69 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 166da5c6fc70e814a8262463903b2714 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Api.meta b/Packages/com.unity.asset-store-tools/Editor/Api.meta new file mode 100644 index 00000000..0cf8e3fb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d48a2325d352e7a4cae56d3f8eeaab2d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions.meta new file mode 100644 index 00000000..80ccfb13 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 25799fb31cd475347af7f5442c231797 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs new file mode 100644 index 00000000..84d1fa83 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs @@ -0,0 +1,48 @@ +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using UnityEngine; + +namespace AssetStoreTools.Api +{ + internal abstract class AuthenticationBase : IAuthenticationType + { + protected Uri LoginUrl = ApiUtility.CreateUri(Constants.Api.AuthenticateUrl, true); + protected FormUrlEncodedContent AuthenticationContent; + + protected FormUrlEncodedContent GetAuthenticationContent(params KeyValuePair[] content) + { + var baseContent = Constants.Api.DefaultAssetStoreQuery(); + + try { baseContent.Add("license_hash", ApiUtility.GetLicenseHash()); } catch { ASDebug.LogWarning("Could not retrieve license hash"); } + try { baseContent.Add("hardware_hash", ApiUtility.GetHardwareHash()); } catch { ASDebug.LogWarning("Could not retrieve hardware hash"); } + + foreach (var extraContent in content) + { + baseContent.Add(extraContent.Key, extraContent.Value); + } + + return new FormUrlEncodedContent(baseContent); + } + + protected AuthenticationResponse ParseResponse(HttpResponseMessage response) + { + try + { + response.EnsureSuccessStatusCode(); + var responseString = response.Content.ReadAsStringAsync().Result; + return new AuthenticationResponse(responseString); + } + catch (HttpRequestException e) + { + return new AuthenticationResponse(response.StatusCode, e) { Success = false }; + } + } + + public abstract Task Authenticate(IAssetStoreClient client, CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs.meta new file mode 100644 index 00000000..2607489c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f677e03f1be1048439a1fa5e7a0a37b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/AuthenticationBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs new file mode 100644 index 00000000..86db5cdb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs @@ -0,0 +1,21 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Api.Responses; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal interface IAssetStoreApi + { + Task GetLatestAssetStoreToolsVersion(CancellationToken cancellationToken = default); + Task Authenticate(IAuthenticationType authenticationType, CancellationToken cancellationToken = default); + void Deauthenticate(); + Task GetPackages(CancellationToken cancellationToken = default); + Task GetCategories(CancellationToken cancellationToken = default); + Task GetPackageThumbnail(Package package, CancellationToken cancellationToken = default); + Task RefreshPackageMetadata(Package package, CancellationToken cancellationToken = default); + Task GetPackageUploadedVersions(Package package, CancellationToken cancellationToken = default); + Task UploadPackage(IPackageUploader uploader, IProgress progress = null, CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs.meta new file mode 100644 index 00000000..6caa9aaa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e616488c25d278741bb0d08168219309 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreApi.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs new file mode 100644 index 00000000..f6a6d3e1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs @@ -0,0 +1,18 @@ +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal interface IAssetStoreClient + { + void SetSessionId(string sessionId); + void ClearSessionId(); + + Task Get(Uri uri, CancellationToken cancellationToken = default); + Task Post(Uri uri, HttpContent content, CancellationToken cancellationToken = default); + Task Put(Uri uri, HttpContent content, CancellationToken cancellationToken = default); + Task Send(HttpRequestMessage request, CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs.meta new file mode 100644 index 00000000..eeb360c3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b2bbadec62178cc4189e605367b219e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAssetStoreClient.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs new file mode 100644 index 00000000..8fa5c78e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs @@ -0,0 +1,11 @@ +using AssetStoreTools.Api.Responses; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal interface IAuthenticationType + { + Task Authenticate(IAssetStoreClient client, CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs.meta new file mode 100644 index 00000000..a713c84f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0000dcd6975bc8e4abc546a19f194040 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IAuthenticationType.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs new file mode 100644 index 00000000..ef7c89f9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs @@ -0,0 +1,12 @@ +using AssetStoreTools.Api.Responses; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal interface IPackageUploader + { + Task Upload(IAssetStoreClient client, IProgress progress, CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs.meta new file mode 100644 index 00000000..b8c5fa08 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0fc6c47b1c0a65540a40efbf1491193b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/IPackageUploader.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs new file mode 100644 index 00000000..e26bfc18 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs @@ -0,0 +1,59 @@ +using AssetStoreTools.Api.Responses; +using System; +using System.IO; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal abstract class PackageUploaderBase : IPackageUploader + { + protected const int UploadChunkSizeBytes = 32768; + protected const int UploadResponseTimeoutMs = 10000; + + protected abstract void ValidateSettings(); + public abstract Task Upload(IAssetStoreClient client, IProgress progress = null, CancellationToken cancellationToken = default); + + protected void EnsureSuccessResponse(HttpResponseMessage response) + { + try + { + response.EnsureSuccessStatusCode(); + } + catch + { + throw new Exception(response.Content.ReadAsStringAsync().Result); + } + } + + protected void WaitForUploadCompletion(Task response, FileStream requestFileStream, IProgress progress, CancellationToken cancellationToken) + { + // Progress tracking + int updateIntervalMs = 100; + bool allBytesSent = false; + DateTime timeOfCompletion = default; + + while (!response.IsCompleted) + { + float uploadProgress = (float)requestFileStream.Position / requestFileStream.Length * 100; + progress?.Report(uploadProgress); + Thread.Sleep(updateIntervalMs); + + // A timeout for rare cases, when package uploading reaches 100%, but Put task IsComplete value remains 'False' + if (requestFileStream.Position == requestFileStream.Length) + { + if (!allBytesSent) + { + allBytesSent = true; + timeOfCompletion = DateTime.UtcNow; + } + else if (DateTime.UtcNow.Subtract(timeOfCompletion).TotalMilliseconds > UploadResponseTimeoutMs) + { + throw new TimeoutException(); + } + } + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs.meta new file mode 100644 index 00000000..3b255ee9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2718ddd16e425ba4a82ab973724bcff7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Abstractions/PackageUploaderBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs new file mode 100644 index 00000000..545d6d47 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs @@ -0,0 +1,76 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditorInternal; + +namespace AssetStoreTools.Api +{ + internal class ApiUtility + { + public static Uri CreateUri(string url, bool includeDefaultAssetStoreQuery) => CreateUri(url, null, includeDefaultAssetStoreQuery); + public static Uri CreateUri(string url, IDictionary queryParameters, bool includeDefaultAssetStoreQuery) + { + IDictionary fullQueryParameters = includeDefaultAssetStoreQuery ? + Constants.Api.DefaultAssetStoreQuery() : new Dictionary(); + + if (queryParameters != null && queryParameters.Count > 0) + { + foreach (var kvp in queryParameters) + fullQueryParameters.Add(kvp); + } + + var builder = new UriBuilder(url); + if (fullQueryParameters.Count == 0) + return builder.Uri; + + var fullQueryParameterString = string.Empty; + foreach (var queryParam in fullQueryParameters) + { + var escapedValue = queryParam.Value != null ? Uri.EscapeDataString(queryParam.Value) : string.Empty; + fullQueryParameterString += $"{queryParam.Key}={escapedValue}&"; + } + fullQueryParameterString = fullQueryParameterString.Remove(fullQueryParameterString.Length - 1); + + builder.Query = fullQueryParameterString; + return builder.Uri; + } + + public static List CombinePackageData(List mainPackageData, List extraPackageData, List categoryData) + { + foreach (var package in mainPackageData) + { + var extraData = extraPackageData.FirstOrDefault(x => package.PackageId == x.PackageId); + + if (extraData == null) + { + ASDebug.LogWarning($"Could not find extra data for Package {package.PackageId}"); + continue; + } + + var categoryId = extraData.CategoryId; + var category = categoryData.FirstOrDefault(x => x.Id.ToString() == categoryId); + if (category != null) + package.Category = category.Name; + else + package.Category = "Unknown"; + + package.Modified = extraData.Modified; + package.Size = extraData.Size; + } + + return mainPackageData; + } + + public static string GetLicenseHash() + { + return InternalEditorUtility.GetAuthToken().Substring(0, 40); + } + + public static string GetHardwareHash() + { + return InternalEditorUtility.GetAuthToken().Substring(40, 40); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs.meta new file mode 100644 index 00000000..0259bfc3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5becec0b3c0ba274fb0b01544e63b6c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/ApiUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs new file mode 100644 index 00000000..a8530dcc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs @@ -0,0 +1,268 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Api.Responses; +using Newtonsoft.Json.Linq; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal class AssetStoreApi : IAssetStoreApi + { + private IAssetStoreClient _client; + + public AssetStoreApi(IAssetStoreClient client) + { + _client = client; + } + + public async Task GetLatestAssetStoreToolsVersion(CancellationToken cancellationToken = default) + { + try + { + var uri = ApiUtility.CreateUri(Constants.Api.AssetStoreToolsLatestVersionUrl, false); + var response = await _client.Get(uri, cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + response.EnsureSuccessStatusCode(); + var responseStr = response.Content.ReadAsStringAsync().Result; + return new AssetStoreToolsVersionResponse(responseStr); + } + catch (OperationCanceledException e) + { + return new AssetStoreToolsVersionResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new AssetStoreToolsVersionResponse() { Success = false, Exception = e }; + } + } + + public async Task Authenticate(IAuthenticationType authenticationType, CancellationToken cancellationToken = default) + { + try + { + var loginResponse = await authenticationType.Authenticate(_client, cancellationToken); + if (loginResponse.Success) + { + _client.SetSessionId(loginResponse.User.SessionId); + } + + return loginResponse; + } + catch (OperationCanceledException e) + { + return new AuthenticationResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new AuthenticationResponse() { Success = false, Exception = e }; + } + } + + public void Deauthenticate() + { + _client.ClearSessionId(); + } + + public async Task GetPackages(CancellationToken cancellationToken = default) + { + try + { + var mainDataResponse = await GetPackageDataMain(cancellationToken); + if (!mainDataResponse.Success) + throw mainDataResponse.Exception; + var additionalDataResponse = await GetPackageDataExtra(cancellationToken); + if (!additionalDataResponse.Success) + throw additionalDataResponse.Exception; + var categoryDataResponse = await GetCategories(cancellationToken); + if (!categoryDataResponse.Success) + throw categoryDataResponse.Exception; + + var joinedData = ApiUtility.CombinePackageData(mainDataResponse.Packages, additionalDataResponse.Packages, categoryDataResponse.Categories); + return new PackagesDataResponse() { Success = true, Packages = joinedData }; + } + catch (OperationCanceledException e) + { + return new PackagesDataResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new PackagesDataResponse() { Success = false, Exception = e }; + } + } + + private async Task GetPackageDataMain(CancellationToken cancellationToken) + { + try + { + var uri = ApiUtility.CreateUri(Constants.Api.GetPackagesUrl, true); + var response = await _client.Get(uri, cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + response.EnsureSuccessStatusCode(); + + var responseStr = response.Content.ReadAsStringAsync().Result; + return new PackagesDataResponse(responseStr); + } + catch (OperationCanceledException e) + { + return new PackagesDataResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new PackagesDataResponse() { Success = false, Exception = e }; + } + } + + private async Task GetPackageDataExtra(CancellationToken cancellationToken) + { + try + { + var uri = ApiUtility.CreateUri(Constants.Api.GetPackagesAdditionalDataUrl, true); + var response = await _client.Get(uri, cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + response.EnsureSuccessStatusCode(); + + var responseStr = response.Content.ReadAsStringAsync().Result; + return new PackagesAdditionalDataResponse(responseStr); + } + catch (OperationCanceledException e) + { + return new PackagesAdditionalDataResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new PackagesAdditionalDataResponse() { Success = false, Exception = e }; + } + } + + public async Task GetCategories(CancellationToken cancellationToken) + { + try + { + var uri = ApiUtility.CreateUri(Constants.Api.GetCategoriesUrl, true); + var response = await _client.Get(uri, cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + response.EnsureSuccessStatusCode(); + + var responseStr = response.Content.ReadAsStringAsync().Result; + return new CategoryDataResponse(responseStr); + } + catch (OperationCanceledException e) + { + return new CategoryDataResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new CategoryDataResponse() { Success = false, Exception = e }; + } + } + + public async Task GetPackageThumbnail(Package package, CancellationToken cancellationToken = default) + { + try + { + if (string.IsNullOrEmpty(package.IconUrl)) + throw new Exception($"Could not retrieve thumbnail for package {package.PackageId} - icon url is null"); + + var response = await _client.Get(new Uri(package.IconUrl), cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + response.EnsureSuccessStatusCode(); + + var responseBytes = response.Content.ReadAsByteArrayAsync().Result; + return new PackageThumbnailResponse(responseBytes); + } + catch (OperationCanceledException e) + { + return new PackageThumbnailResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new PackageThumbnailResponse() { Success = false, Exception = e }; + } + } + + public async Task RefreshPackageMetadata(Package package, CancellationToken cancellationToken = default) + { + try + { + var refreshedPackage = JObject.FromObject(package).DeepClone().ToObject(); + + var packagesResponse = await GetPackageDataExtra(cancellationToken); + if (!packagesResponse.Success) + throw packagesResponse.Exception; + + // Find the updated package data in the latest data json + var packageRefreshSource = packagesResponse.Packages.FirstOrDefault(x => x.PackageId == refreshedPackage.PackageId); + if (packageRefreshSource == null) + return new RefreshedPackageDataResponse() { Success = false, Exception = new MissingMemberException($"Unable to find downloaded package data for package id {package.PackageId}") }; + + // Retrieve the category map + var categoryData = await GetCategories(cancellationToken); + if (!categoryData.Success) + return new RefreshedPackageDataResponse() { Success = false, Exception = packagesResponse.Exception }; + + // Update the package data + refreshedPackage.Name = packageRefreshSource.Name; + refreshedPackage.Status = packageRefreshSource.Status; + var newCategory = categoryData.Categories.FirstOrDefault(x => x.Id.ToString() == packageRefreshSource.CategoryId); + refreshedPackage.Category = newCategory != null ? newCategory.Name : "Unknown"; + refreshedPackage.Modified = packageRefreshSource.Modified; + refreshedPackage.Size = packageRefreshSource.Size; + + return new RefreshedPackageDataResponse() { Success = true, Package = refreshedPackage }; + } + catch (OperationCanceledException) + { + return new RefreshedPackageDataResponse() { Success = false, Cancelled = true }; + } + catch (Exception e) + { + return new RefreshedPackageDataResponse() { Success = false, Exception = e }; + } + } + + public async Task GetPackageUploadedVersions(Package package, CancellationToken cancellationToken = default) + { + try + { + var uri = ApiUtility.CreateUri(Constants.Api.GetPackageUploadedVersionsUrl(package.PackageId, package.VersionId), true); + var response = await _client.Get(uri, cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + response.EnsureSuccessStatusCode(); + + var responseStr = response.Content.ReadAsStringAsync().Result; + return new PackageUploadedUnityVersionDataResponse(responseStr); + } + catch (OperationCanceledException e) + { + return new PackageUploadedUnityVersionDataResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new PackageUploadedUnityVersionDataResponse() { Success = false, Exception = e }; + } + } + + public async Task UploadPackage(IPackageUploader uploader, IProgress progress = null, CancellationToken cancellationToken = default) + { + try + { + return await uploader.Upload(_client, progress, cancellationToken); + } + catch (OperationCanceledException e) + { + return new PackageUploadResponse() { Success = false, Cancelled = true, Exception = e }; + } + catch (Exception e) + { + return new PackageUploadResponse() { Success = false, Exception = e }; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs.meta new file mode 100644 index 00000000..3763396d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 684fca3fffd79d944a32d9b3adbfc007 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreApi.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs new file mode 100644 index 00000000..f71bff81 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs @@ -0,0 +1,55 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal class AssetStoreClient : IAssetStoreClient + { + private HttpClient _httpClient; + + public AssetStoreClient() + { + ServicePointManager.DefaultConnectionLimit = 500; + _httpClient = new HttpClient(); + _httpClient.DefaultRequestHeaders.ConnectionClose = false; + _httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); + _httpClient.Timeout = TimeSpan.FromMinutes(1320); + } + + public void SetSessionId(string sessionId) + { + ClearSessionId(); + + if (!string.IsNullOrEmpty(sessionId)) + _httpClient.DefaultRequestHeaders.Add("X-Unity-Session", sessionId); + } + + public void ClearSessionId() + { + _httpClient.DefaultRequestHeaders.Remove("X-Unity-Session"); + } + + public Task Get(Uri uri, CancellationToken cancellationToken = default) + { + return _httpClient.GetAsync(uri, cancellationToken); + } + + public Task Post(Uri uri, HttpContent content, CancellationToken cancellationToken = default) + { + return _httpClient.PostAsync(uri, content, cancellationToken); + } + + public Task Put(Uri uri, HttpContent content, CancellationToken cancellationToken = default) + { + return _httpClient.PutAsync(uri, content, cancellationToken); + } + + public Task Send(HttpRequestMessage request, CancellationToken cancellationToken = default) + { + return _httpClient.SendAsync(request, cancellationToken); + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs.meta new file mode 100644 index 00000000..10ea6ae6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 80b4527c908161a4b9f06dc393b502f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/AssetStoreClient.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs b/Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs new file mode 100644 index 00000000..5a1bd5e7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs @@ -0,0 +1,25 @@ +using AssetStoreTools.Api.Responses; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal class CloudTokenAuthentication : AuthenticationBase + { + public CloudTokenAuthentication(string cloudToken) + { + AuthenticationContent = GetAuthenticationContent( + new KeyValuePair("user_access_token", cloudToken) + ); + } + + public override async Task Authenticate(IAssetStoreClient client, CancellationToken cancellationToken) + { + var result = await client.Post(LoginUrl, AuthenticationContent, cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + + return ParseResponse(result); + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs.meta new file mode 100644 index 00000000..06064fcc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 99f1baec74f26a34bb972b19c92d523f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/CloudTokenAuthentication.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs b/Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs new file mode 100644 index 00000000..2c515059 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs @@ -0,0 +1,26 @@ +using AssetStoreTools.Api.Responses; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal class CredentialsAuthentication : AuthenticationBase + { + public CredentialsAuthentication(string email, string password) + { + AuthenticationContent = GetAuthenticationContent( + new KeyValuePair("user", email), + new KeyValuePair("pass", password) + ); + } + + public override async Task Authenticate(IAssetStoreClient client, CancellationToken cancellationToken) + { + var result = await client.Post(LoginUrl, AuthenticationContent, cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + + return ParseResponse(result); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs.meta new file mode 100644 index 00000000..53e59db3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 353e556b63fd441428f387bc85aa612c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/CredentialsAuthentication.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Models.meta new file mode 100644 index 00000000..bfcab0b6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f83e4b5507886f4b873c22c146b8f6a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs new file mode 100644 index 00000000..2cb1298e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs @@ -0,0 +1,58 @@ +using Newtonsoft.Json.Serialization; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Models +{ + internal class Category + { + public int Id { get; set; } + public string Name { get; set; } + public string Status { get; set; } + + public class AssetStoreCategoryResolver : DefaultContractResolver + { + private Dictionary _propertyConversions; + + public AssetStoreCategoryResolver() + { + _propertyConversions = new Dictionary() + { + { nameof(Category.Name), "assetstore_name" } + }; + } + + protected override string ResolvePropertyName(string propertyName) + { + if (_propertyConversions.ContainsKey(propertyName)) + return _propertyConversions[propertyName]; + + return base.ResolvePropertyName(propertyName); + } + } + + public class CachedCategoryResolver : DefaultContractResolver + { + private static CachedCategoryResolver _instance; + public static CachedCategoryResolver Instance => _instance ?? (_instance = new CachedCategoryResolver()); + + private Dictionary _propertyConversion; + + private CachedCategoryResolver() + { + this.NamingStrategy = new SnakeCaseNamingStrategy(); + _propertyConversion = new Dictionary() + { + { nameof(Category.Name), "name" } + }; + } + + protected override string ResolvePropertyName(string propertyName) + { + if (_propertyConversion.ContainsKey(propertyName)) + return _propertyConversion[propertyName]; + + return base.ResolvePropertyName(propertyName); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs.meta new file mode 100644 index 00000000..8a88ac86 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5897866bc65f5834dab1f17371daada7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Models/Category.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs new file mode 100644 index 00000000..442c919d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs @@ -0,0 +1,80 @@ +using Newtonsoft.Json.Serialization; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Models +{ + internal class Package + { + public string PackageId { get; set; } + public string VersionId { get; set; } + public string Name { get; set; } + public string Status { get; set; } + public string Category { get; set; } + public bool IsCompleteProject { get; set; } + public string RootGuid { get; set; } + public string RootPath { get; set; } + public string ProjectPath { get; set; } + public string Modified { get; set; } + public string Size { get; set; } + public string IconUrl { get; set; } + + public class AssetStorePackageResolver : DefaultContractResolver + { + private static AssetStorePackageResolver _instance; + public static AssetStorePackageResolver Instance => _instance ?? (_instance = new AssetStorePackageResolver()); + + private Dictionary _propertyConversions; + + private AssetStorePackageResolver() + { + _propertyConversions = new Dictionary() + { + { nameof(Package.VersionId), "id" }, + { nameof(Package.IsCompleteProject), "is_complete_project" }, + { nameof(Package.RootGuid), "root_guid" }, + { nameof(Package.RootPath), "root_path" }, + { nameof(Package.ProjectPath), "project_path" }, + { nameof(Package.IconUrl), "icon_url" } + }; + } + + protected override string ResolvePropertyName(string propertyName) + { + if (_propertyConversions.ContainsKey(propertyName)) + return _propertyConversions[propertyName]; + + return base.ResolvePropertyName(propertyName); + } + } + + public class CachedPackageResolver : DefaultContractResolver + { + private static CachedPackageResolver _instance; + public static CachedPackageResolver Instance => _instance ?? (_instance = new CachedPackageResolver()); + + private Dictionary _propertyConversion; + + private CachedPackageResolver() + { + this.NamingStrategy = new SnakeCaseNamingStrategy(); + _propertyConversion = new Dictionary() + { + { nameof(Package.PackageId), "package_id" }, + { nameof(Package.VersionId), "version_id" }, + { nameof(Package.IsCompleteProject), "is_complete_project" }, + { nameof(Package.RootGuid), "root_guid" }, + { nameof(Package.RootPath), "root_path" }, + { nameof(Package.IconUrl), "icon_url" } + }; + } + + protected override string ResolvePropertyName(string propertyName) + { + if (_propertyConversion.ContainsKey(propertyName)) + return _propertyConversion[propertyName]; + + return base.ResolvePropertyName(propertyName); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs.meta new file mode 100644 index 00000000..79fb6c2b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7e9f0b99820061b49abf6e8cf544a727 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Models/Package.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs new file mode 100644 index 00000000..8686ccc1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json.Serialization; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Models +{ + internal class PackageAdditionalData + { + public string Name { get; set; } + public string Status { get; set; } + public string PackageId { get; set; } + public string VersionId { get; set; } + public string CategoryId { get; set; } + public string Modified { get; set; } + public string Size { get; set; } + + public class AssetStorePackageResolver : DefaultContractResolver + { + private static AssetStorePackageResolver _instance; + public static AssetStorePackageResolver Instance => _instance ?? (_instance = new AssetStorePackageResolver()); + + private Dictionary _propertyConversions; + + private AssetStorePackageResolver() + { + _propertyConversions = new Dictionary() + { + { nameof(PackageAdditionalData.PackageId), "id" }, + { nameof(PackageAdditionalData.CategoryId), "category_id" } + }; + } + + protected override string ResolvePropertyName(string propertyName) + { + if (_propertyConversions.ContainsKey(propertyName)) + return _propertyConversions[propertyName]; + + return base.ResolvePropertyName(propertyName); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs.meta new file mode 100644 index 00000000..41f8b1f0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0663f29f3fcd0e34ab77338d1bdbb528 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Models/PackageAdditionalData.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs new file mode 100644 index 00000000..c80a5067 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs @@ -0,0 +1,51 @@ +using Newtonsoft.Json.Serialization; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Models +{ + internal class User + { + public string Id { get; set; } + public string SessionId { get; set; } + public string Name { get; set; } + public string Username { get; set; } + public string PublisherId { get; set; } + public bool IsPublisher => !string.IsNullOrEmpty(PublisherId); + + public override string ToString() + { + return + $"{nameof(Id)}: {Id}\n" + + $"{nameof(Name)}: {Name}\n" + + $"{nameof(Username)}: {Username}\n" + + $"{nameof(PublisherId)}: {PublisherId}\n" + + $"{nameof(IsPublisher)}: {IsPublisher}\n" + + $"{nameof(SessionId)}: [HIDDEN]"; + } + + public class AssetStoreUserResolver : DefaultContractResolver + { + private static AssetStoreUserResolver _instance; + public static AssetStoreUserResolver Instance => _instance ?? (_instance = new AssetStoreUserResolver()); + + private Dictionary _propertyConversions; + + private AssetStoreUserResolver() + { + _propertyConversions = new Dictionary() + { + { nameof(User.SessionId), "xunitysession" }, + { nameof(User.PublisherId), "publisher" } + }; + } + + protected override string ResolvePropertyName(string propertyName) + { + if (_propertyConversions.ContainsKey(propertyName)) + return _propertyConversions[propertyName]; + + return base.ResolvePropertyName(propertyName); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs.meta new file mode 100644 index 00000000..76244dac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: caf38df5cd685a345a1ebec8f7651c93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Models/User.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses.meta new file mode 100644 index 00000000..534c529f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 49581213e7b6ca645955cce8ce23ac4b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs new file mode 100644 index 00000000..2e7a6b24 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs @@ -0,0 +1,45 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; + +namespace AssetStoreTools.Api.Responses +{ + /// + /// A structure used to return the success outcome and the result of Asset Store API calls + /// + internal class AssetStoreResponse + { + public bool Success { get; set; } = false; + public bool Cancelled { get; set; } = false; + public Exception Exception { get; set; } + + public AssetStoreResponse() { } + + public AssetStoreResponse(Exception e) : this() + { + Exception = e; + } + + protected void ValidateAssetStoreResponse(string json) + { + var dict = JsonConvert.DeserializeObject(json); + if (dict == null) + throw new Exception("Response is empty"); + + // Some json responses return an error field on error + if (dict.ContainsKey("error")) + { + // Server side error message + // Do not write to console since this is an error that + // is "expected" ie. can be handled by the gui. + throw new Exception(dict.GetValue("error").ToString()); + } + // Some json responses return status+message fields instead of an error field. Go figure. + else if (dict.ContainsKey("status") && dict.GetValue("status").ToString() != "ok" + && dict.ContainsKey("message")) + { + throw new Exception(dict.GetValue("message").ToString()); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs.meta new file mode 100644 index 00000000..11f75b6f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ee338db031a0cfb459f7cac7f41a5d75 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs new file mode 100644 index 00000000..ec3bb87d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs @@ -0,0 +1,38 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; + +namespace AssetStoreTools.Api.Responses +{ + internal class AssetStoreToolsVersionResponse : AssetStoreResponse + { + public string Version { get; set; } + + public AssetStoreToolsVersionResponse() : base() { } + public AssetStoreToolsVersionResponse(Exception e) : base(e) { } + + public AssetStoreToolsVersionResponse(string json) + { + try + { + ValidateAssetStoreResponse(json); + ParseVersion(json); + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + + private void ParseVersion(string json) + { + var dict = JsonConvert.DeserializeObject(json); + if (!dict.ContainsKey("version")) + throw new Exception("Version was not found"); + + Version = dict.GetValue("version").ToString(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs.meta new file mode 100644 index 00000000..64eb6257 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 40558675926f913478a654350149209e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/AssetStoreToolsVersionResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs new file mode 100644 index 00000000..09c786c2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs @@ -0,0 +1,74 @@ +using AssetStoreTools.Api.Models; +using Newtonsoft.Json; +using System; +using System.Net; +using System.Net.Http; + +namespace AssetStoreTools.Api.Responses +{ + internal class AuthenticationResponse : AssetStoreResponse + { + public User User { get; set; } + + public AuthenticationResponse() : base() { } + + public AuthenticationResponse(Exception e) : base(e) { } + + public AuthenticationResponse(HttpStatusCode statusCode, HttpRequestException fallbackException) + { + string message; + switch (statusCode) + { + case HttpStatusCode.Unauthorized: + message = "Incorrect email and/or password. Please try again."; + break; + case HttpStatusCode.InternalServerError: + message = "Authentication request failed\nIf you were logging in with your Unity Cloud account, please make sure you are still logged in.\n" + + "This might also be caused by too many invalid login attempts - if that is the case, please try again later."; + break; + default: + Exception = fallbackException; + return; + } + + Exception = new Exception(message); + } + + public AuthenticationResponse(string json) + { + try + { + ValidateAssetStoreResponse(json); + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = User.AssetStoreUserResolver.Instance + }; + User = JsonConvert.DeserializeObject(json, serializerSettings); + ValidateLoginData(); + ValidatePublisher(); + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + + private void ValidateLoginData() + { + if (string.IsNullOrEmpty(User.Id) + || string.IsNullOrEmpty(User.SessionId) + || string.IsNullOrEmpty(User.Name) + || string.IsNullOrEmpty(User.Username)) + throw new Exception("Could not parse the necessary publisher information from the response."); + } + + private void ValidatePublisher() + { + if (!User.IsPublisher) + throw new Exception($"Your Unity ID {User.Name} is not currently connected to a publisher account. " + + $"Please create a publisher profile."); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs.meta new file mode 100644 index 00000000..a37ebf9b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ec3a5cb59a7e78646b07f800d317874d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/AuthenticationResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs new file mode 100644 index 00000000..4ff740bc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs @@ -0,0 +1,43 @@ +using AssetStoreTools.Api.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Responses +{ + internal class CategoryDataResponse : AssetStoreResponse + { + public List Categories { get; set; } + + public CategoryDataResponse() : base() { } + public CategoryDataResponse(Exception e) : base(e) { } + + public CategoryDataResponse(string json) + { + try + { + var categoryArray = JsonConvert.DeserializeObject(json); + + Categories = new List(); + var serializer = new JsonSerializer() + { + ContractResolver = new Category.AssetStoreCategoryResolver() + }; + + foreach (var categoryData in categoryArray) + { + var category = categoryData.ToObject(serializer); + Categories.Add(category); + } + + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs.meta new file mode 100644 index 00000000..9684d202 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e3789323453f1604286b436f77bdca97 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/CategoryDataResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs new file mode 100644 index 00000000..f4e8ac9e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs @@ -0,0 +1,31 @@ +using System; +using UnityEngine; + +namespace AssetStoreTools.Api.Responses +{ + internal class PackageThumbnailResponse : AssetStoreResponse + { + public Texture2D Thumbnail { get; set; } + public PackageThumbnailResponse() : base() { } + public PackageThumbnailResponse(Exception e) : base(e) { } + + public PackageThumbnailResponse(byte[] textureBytes) + { + try + { + var tex = new Texture2D(1, 1, TextureFormat.RGBA32, false); + var success = tex.LoadImage(textureBytes); + if (!success) + throw new Exception("Could not retrieve image from the provided texture bytes"); + + Thumbnail = tex; + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs.meta new file mode 100644 index 00000000..2f957f59 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: dacfba636b3757e408514b850d715e18 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageThumbnailResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs new file mode 100644 index 00000000..4f57d645 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs @@ -0,0 +1,44 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Responses +{ + internal class PackageUploadedUnityVersionDataResponse : AssetStoreResponse + { + public List UnityVersions { get; set; } + + public PackageUploadedUnityVersionDataResponse() : base() { } + public PackageUploadedUnityVersionDataResponse(Exception e) : base(e) { } + + public PackageUploadedUnityVersionDataResponse(string json) + { + try + { + ValidateAssetStoreResponse(json); + ParseVersionData(json); + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + + private void ParseVersionData(string json) + { + var data = JsonConvert.DeserializeObject(json); + try + { + var content = data.GetValue("content").ToObject(); + UnityVersions = content.GetValue("unity_versions").ToObject>(); + } + catch + { + throw new Exception("Could not parse the unity versions array"); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs.meta new file mode 100644 index 00000000..fa263ee5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2552f659a600e124aa952f3ba760ddf3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackageUploadedUnityVersionDataResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs new file mode 100644 index 00000000..df01e70d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs @@ -0,0 +1,59 @@ +using AssetStoreTools.Api.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Responses +{ + internal class PackagesAdditionalDataResponse : AssetStoreResponse + { + public List Packages { get; set; } + + public PackagesAdditionalDataResponse() : base() { } + public PackagesAdditionalDataResponse(Exception e) : base(e) { } + + public PackagesAdditionalDataResponse(string json) + { + try + { + ValidateAssetStoreResponse(json); + ParseExtraData(json); + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + + private void ParseExtraData(string json) + { + var packageDict = JsonConvert.DeserializeObject(json); + if (!packageDict.ContainsKey("packages")) + throw new Exception("Response did not not contain the list of packages"); + + Packages = new List(); + var serializer = new JsonSerializer() + { + ContractResolver = PackageAdditionalData.AssetStorePackageResolver.Instance + }; + + var packageArray = packageDict.GetValue("packages").ToObject(); + foreach (var packageData in packageArray) + { + var package = packageData.ToObject(serializer); + + // Some fields are based on the latest version in the json + var latestVersion = packageData["versions"].ToObject().Last; + + package.VersionId = latestVersion["id"].ToString(); + package.Modified = latestVersion["modified"].ToString(); + package.Size = latestVersion["size"].ToString(); + + Packages.Add(package); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs.meta new file mode 100644 index 00000000..0590efe4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 88d58ad5e0eea6345b5c83f30ee8ebd5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesAdditionalDataResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs new file mode 100644 index 00000000..d9fb47c1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs @@ -0,0 +1,59 @@ +using AssetStoreTools.Api.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Api.Responses +{ + internal class PackagesDataResponse : AssetStoreResponse + { + public List Packages { get; set; } + + public PackagesDataResponse() : base() { } + public PackagesDataResponse(Exception e) : base(e) { } + + public PackagesDataResponse(string json) + { + try + { + ValidateAssetStoreResponse(json); + ParseMainData(json); + Success = true; + } + catch (Exception e) + { + Success = false; + Exception = e; + } + } + + private void ParseMainData(string json) + { + var packageDict = JsonConvert.DeserializeObject(json); + if (!packageDict.ContainsKey("packages")) + throw new Exception("Response did not not contain the list of packages"); + + Packages = new List(); + var serializer = new JsonSerializer() + { + ContractResolver = Package.AssetStorePackageResolver.Instance + }; + + foreach (var packageToken in packageDict["packages"]) + { + var property = (JProperty)packageToken; + var packageData = property.Value.ToObject(serializer); + + // Package Id is the key of the package object + packageData.PackageId = property.Name; + + // Package Icon Url is returned without the https: prefix + if (!string.IsNullOrEmpty(packageData.IconUrl)) + packageData.IconUrl = $"https:{packageData.IconUrl}"; + + Packages.Add(packageData); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs.meta new file mode 100644 index 00000000..f780da1d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 705ec748e689148479f54666993cd79d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/PackagesDataResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs new file mode 100644 index 00000000..a0479a03 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs @@ -0,0 +1,12 @@ +using AssetStoreTools.Api.Models; +using System; + +namespace AssetStoreTools.Api.Responses +{ + internal class RefreshedPackageDataResponse : AssetStoreResponse + { + public Package Package { get; set; } + public RefreshedPackageDataResponse() { } + public RefreshedPackageDataResponse(Exception e) : base(e) { } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs.meta new file mode 100644 index 00000000..06075058 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 20f710024d5ed514db02672f12ac361c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/RefreshedPackageDataResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs new file mode 100644 index 00000000..3fa21600 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs @@ -0,0 +1,28 @@ +using System; + +namespace AssetStoreTools.Api.Responses +{ + internal class PackageUploadResponse : AssetStoreResponse + { + public UploadStatus Status { get; set; } + + public PackageUploadResponse() : base() { } + public PackageUploadResponse(Exception e) : base(e) { } + + public PackageUploadResponse(string json) + { + try + { + ValidateAssetStoreResponse(json); + Status = UploadStatus.Success; + Success = true; + } + catch (Exception e) + { + Success = false; + Status = UploadStatus.Fail; + Exception = e; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs.meta new file mode 100644 index 00000000..8b619704 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8f1758cfa8119cf49a61b010a04352e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/Responses/UploadResponse.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs b/Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs new file mode 100644 index 00000000..eb5e54cb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs @@ -0,0 +1,25 @@ +using AssetStoreTools.Api.Responses; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal class SessionAuthentication : AuthenticationBase + { + public SessionAuthentication(string sessionId) + { + AuthenticationContent = GetAuthenticationContent( + new KeyValuePair("reuse_session", sessionId) + ); + } + + public override async Task Authenticate(IAssetStoreClient client, CancellationToken cancellationToken) + { + var result = await client.Post(LoginUrl, AuthenticationContent, cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + + return ParseResponse(result); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs.meta new file mode 100644 index 00000000..ca64f186 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 02e970f660088cc4b89003608d59cd06 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/SessionAuthentication.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs b/Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs new file mode 100644 index 00000000..17c765f2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs @@ -0,0 +1,99 @@ +using AssetStoreTools.Api.Responses; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Api +{ + internal class UnityPackageUploadSettings + { + public string VersionId { get; set; } + public string UnityPackagePath { get; set; } + public string RootGuid { get; set; } + public string RootPath { get; set; } + public string ProjectPath { get; set; } + } + + internal class UnityPackageUploader : PackageUploaderBase + { + private UnityPackageUploadSettings _settings; + private Uri _uploadUri; + + public UnityPackageUploader(UnityPackageUploadSettings settings) + { + _settings = settings; + } + + protected override void ValidateSettings() + { + if (string.IsNullOrEmpty(_settings.VersionId)) + throw new Exception("Version Id is unset"); + + if (string.IsNullOrEmpty(_settings.UnityPackagePath) + || !File.Exists(_settings.UnityPackagePath)) + throw new Exception("Package file could not be found"); + + if (!_settings.UnityPackagePath.EndsWith(".unitypackage")) + throw new Exception("Provided package file is not .unitypackage"); + } + + public override async Task Upload(IAssetStoreClient client, IProgress progress = null, CancellationToken cancellationToken = default) + { + try + { + ValidateSettings(); + + var endpoint = Constants.Api.UploadUnityPackageUrl(_settings.VersionId); + var query = new Dictionary() + { + { "root_guid", _settings.RootGuid }, + { "root_path", _settings.RootPath }, + { "project_path", _settings.ProjectPath } + }; + + _uploadUri = ApiUtility.CreateUri(endpoint, query, true); + } + catch (Exception e) + { + return new PackageUploadResponse() { Success = false, Status = UploadStatus.Fail, Exception = e }; + } + + return await Task.Run(() => UploadTask(client, progress, cancellationToken)); + } + + private PackageUploadResponse UploadTask(IAssetStoreClient client, IProgress progress, CancellationToken cancellationToken) + { + try + { + using (FileStream requestFileStream = new FileStream(_settings.UnityPackagePath, FileMode.Open, FileAccess.Read)) + { + var content = new StreamContent(requestFileStream, UploadChunkSizeBytes); + + var response = client.Put(_uploadUri, content, cancellationToken); + WaitForUploadCompletion(response, requestFileStream, progress, cancellationToken); + + cancellationToken.ThrowIfCancellationRequested(); + EnsureSuccessResponse(response.Result); + + var responseStr = response.Result.Content.ReadAsStringAsync().Result; + return new PackageUploadResponse(responseStr); + } + } + catch (OperationCanceledException e) + { + return new PackageUploadResponse() { Success = false, Cancelled = true, Status = UploadStatus.Cancelled, Exception = e }; + } + catch (TimeoutException e) + { + return new PackageUploadResponse() { Success = true, Status = UploadStatus.ResponseTimeout, Exception = e }; + } + catch (Exception e) + { + return new PackageUploadResponse() { Success = false, Exception = e, Status = UploadStatus.Fail }; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs.meta new file mode 100644 index 00000000..cdc262ae --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 95bd0284375397f41a2065e07d4ba526 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/UnityPackageUploader.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs b/Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs new file mode 100644 index 00000000..cc3adf44 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs @@ -0,0 +1,11 @@ +namespace AssetStoreTools.Api +{ + internal enum UploadStatus + { + Default = 0, + Success = 1, + Fail = 2, + Cancelled = 3, + ResponseTimeout = 4 + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs.meta new file mode 100644 index 00000000..83a03101 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0a121831a941cb64a8a9d21ca6fda9c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Api/UploadStatus.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs new file mode 100644 index 00000000..81fbd086 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Runtime.CompilerServices; +[assembly: InternalsVisibleTo("AssetStoreTools.Tests")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] +[assembly: InternalsVisibleTo("ab-builder")] +[assembly: InternalsVisibleTo("Inspector-Editor")] diff --git a/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs.meta new file mode 100644 index 00000000..e3d24b45 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ccfd7faf75ab3c74a98015e772288d86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/AssemblyInfo.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs new file mode 100644 index 00000000..373ac329 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs @@ -0,0 +1,82 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.UI; +using AssetStoreTools.Uploader; +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.UI; +using System; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools +{ + internal static class AssetStoreTools + { + [MenuItem("Tools/Asset Store/Uploader", false, 0)] + public static void ShowAssetStoreToolsUploader() + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + var wnd = EditorWindow.GetWindow(inspectorType); + wnd.Show(); + } + + [MenuItem("Tools/Asset Store/Validator", false, 1)] + public static void ShowAssetStoreToolsValidator() + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + var wnd = EditorWindow.GetWindow(typeof(UploaderWindow), inspectorType); + wnd.Show(); + } + + public static void ShowAssetStoreToolsValidator(ValidationSettings settings, ValidationResult result) + { + ShowAssetStoreToolsValidator(); + EditorWindow.GetWindow().Load(settings, result); + } + + [MenuItem("Tools/Asset Store/Preview Generator", false, 2)] + public static void ShowAssetStoreToolsPreviewGenerator() + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + var wnd = EditorWindow.GetWindow(inspectorType); + wnd.Show(); + } + + public static void ShowAssetStoreToolsPreviewGenerator(PreviewGenerationSettings settings) + { + ShowAssetStoreToolsPreviewGenerator(); + EditorWindow.GetWindow().Load(settings); + } + + [MenuItem("Tools/Asset Store/Publisher Portal", false, 20)] + public static void OpenPublisherPortal() + { + Application.OpenURL("https://publisher.unity.com/"); + } + + [MenuItem("Tools/Asset Store/Submission Guidelines", false, 21)] + public static void OpenSubmissionGuidelines() + { + Application.OpenURL("https://assetstore.unity.com/publishing/submission-guidelines/"); + } + + [MenuItem("Tools/Asset Store/Provide Feedback", false, 22)] + public static void OpenFeedback() + { + Application.OpenURL("https://forum.unity.com/threads/new-asset-store-tools-version-coming-july-20th-2022.1310939/"); + } + + [MenuItem("Tools/Asset Store/Check for Updates", false, 45)] + public static void OpenUpdateChecker() + { + var wnd = EditorWindow.GetWindowWithRect(new Rect(Screen.width / 2, Screen.height / 2, 400, 150), true); + wnd.Show(); + } + + [MenuItem("Tools/Asset Store/Settings", false, 50)] + public static void OpenSettings() + { + ASToolsPreferencesProvider.OpenSettings(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs.meta new file mode 100644 index 00000000..1d99f813 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6060eef206afc844caaa1732538e8890 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/AssetStoreTools.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs new file mode 100644 index 00000000..43f3c117 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs @@ -0,0 +1,23 @@ +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools +{ + internal abstract class AssetStoreToolsWindow : EditorWindow + { + protected abstract string WindowTitle { get; } + + private void DefaultInit() + { + titleContent = new GUIContent(WindowTitle); + Init(); + } + + protected abstract void Init(); + + private void OnEnable() + { + DefaultInit(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs.meta new file mode 100644 index 00000000..2dc3a121 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c1057a05baaa45942808573065c02a03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/AssetStoreToolsWindow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Constants.cs b/Packages/com.unity.asset-store-tools/Editor/Constants.cs new file mode 100644 index 00000000..d2c777a7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Constants.cs @@ -0,0 +1,178 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; + +namespace AssetStoreTools +{ + internal class Constants + { +#if UNITY_EDITOR_OSX + public static readonly string UnityPath = System.IO.Path.Combine(EditorApplication.applicationPath, "Contents", "MacOS", "Unity"); +#else + public static readonly string UnityPath = EditorApplication.applicationPath; +#endif + public static readonly string RootProjectPath = Application.dataPath.Substring(0, Application.dataPath.Length - "Assets".Length); + + private static bool GetArgument(string argumentName, out string argumentValue) + { + argumentValue = string.Empty; + var args = Environment.GetCommandLineArgs(); + + for (int i = 0; i < args.Length; i++) + { + if (!args[i].Equals(argumentName, StringComparison.OrdinalIgnoreCase)) + continue; + + if (i + 1 >= args.Length) + return false; + + argumentValue = args[i + 1]; + break; + } + + return !string.IsNullOrEmpty(argumentValue); + } + + public class Api + { + public static readonly string ApiVersion = $"V{PackageInfo.FindForAssetPath("Packages/com.unity.asset-store-tools").version}"; + public const string AssetStoreToolsLatestVersionUrl = "https://api.assetstore.unity3d.com/package/latest-version/115"; + + private const string AssetStoreBaseUrlDefault = "https://kharma.unity3d.com"; + private const string AssetStoreBaseUrlOverrideArgument = "-assetStoreUrl"; + public static readonly string AssetStoreBaseUrl = !GetArgument(AssetStoreBaseUrlOverrideArgument, out var overriddenUrl) + ? AssetStoreBaseUrlDefault + : overriddenUrl; + + public static readonly string AuthenticateUrl = $"{AssetStoreBaseUrl}/login"; + public static readonly string GetPackagesUrl = $"{AssetStoreBaseUrl}/api/asset-store-tools/metadata/0.json"; + public static readonly string GetPackagesAdditionalDataUrl = $"{AssetStoreBaseUrl}/api/management/packages.json"; + public static readonly string GetCategoriesUrl = $"{AssetStoreBaseUrl}/api/management/categories.json"; + + public static string GetPackageUploadedVersionsUrl(string packageId, string versionId) => + $"{AssetStoreBaseUrl}/api/content/preview/{packageId}/{versionId}.json"; + public static string UploadUnityPackageUrl(string versionId) => + $"{AssetStoreBaseUrl}/api/asset-store-tools/package/{versionId}/unitypackage.json"; + + public static IDictionary DefaultAssetStoreQuery() + { + var dict = new Dictionary() + { + { "unityversion", Application.unityVersion }, + { "toolversion", ApiVersion } + }; + return dict; + } + } + + public class Updater + { + public const string AssetStoreToolsUrl = "https://assetstore.unity.com/packages/tools/utilities/asset-store-publishing-tools-115"; + } + + public class Cache + { + public const string SessionTokenKey = "kharma.sessionid"; + public const string TempCachePath = "Temp/AssetStoreToolsCache"; + public const string PersistentCachePath = "Library/AssetStoreToolsCache"; + + public const string PackageDataFileName = "PackageMetadata.json"; + public const string CategoryDataFile = "Categories.json"; + public const string ValidationResultFile = "ValidationStateData.asset"; + + public static string PackageThumbnailFileName(string packageId) => $"{packageId}.png"; + public static string WorkflowStateDataFileName(string packageId) => $"{packageId}-workflowStateData.asset"; + } + + public class Uploader + { + public const string MinRequiredUnitySupportVersion = "2021.3"; + public const long MaxPackageSizeBytes = 6576668672; // 6 GB + 128MB of headroom + public const string AccountRegistrationUrl = "https://publisher.unity.com/access"; + public const string AccountForgottenPasswordUrl = "https://id.unity.com/password/new"; + + public class Analytics + { + public const string VendorKey = "unity.assetStoreTools"; + public const int MaxEventsPerHour = 20; + public const int MaxNumberOfElements = 1000; + + public class AuthenticationAnalytics + { + public const string EventName = "assetStoreToolsLogin"; + public const int EventVersion = 1; + } + + public class PackageUploadAnalytics + { + public const string EventName = "assetStoreTools"; + public const int EventVersion = 3; + } + } + } + + public class Validator + { + public const string SubmissionGuidelinesUrl = "https://assetstore.unity.com/publishing/submission-guidelines#Overview"; + public const string SupportTicketUrl = "https://support.unity.com/hc/en-us/requests/new?ticket_form_id=65905"; + + public class Tests + { + public const string TestDefinitionsPath = "Packages/com.unity.asset-store-tools/Editor/Validator/Tests"; + public const string TestMethodsPath = "Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods"; + + public static readonly string GenericTestMethodsPath = $"{TestMethodsPath}/Generic"; + public static readonly string UnityPackageTestMethodsPath = $"{TestMethodsPath}/UnityPackage"; + } + } + + public class Previews + { + public const string PreviewDatabaseFile = "PreviewDatabase.json"; + + public static readonly string DefaultOutputPath = $"{Cache.TempCachePath}/AssetPreviews"; + public const FileNameFormat DefaultFileNameFormat = FileNameFormat.Guid; + + public class Native + { + public static readonly string DefaultOutputPath = $"{Previews.DefaultOutputPath}/Native"; + public const PreviewFormat DefaultFormat = PreviewFormat.PNG; + public const bool DefaultWaitForPreviews = true; + public const bool DefaultChunkedPreviewLoading = true; + public const int DefaultChunkSize = 100; + } + + public class Custom + { + public static readonly string DefaultOutputPath = $"{Previews.DefaultOutputPath}/Custom"; + public const PreviewFormat DefaultFormat = PreviewFormat.JPG; + public const int DefaultWidth = 300; + public const int DefaultHeight = 300; + public const int DefaultDepth = 32; + + public const int DefaultNativeWidth = 900; + public const int DefaultNativeHeight = 900; + + public static readonly Color DefaultAudioSampleColor = new Color(1f, 0.55f, 0); + public static readonly Color DefaultAudioBackgroundColor = new Color(0.32f, 0.32f, 0.32f); + } + } + + public class WindowStyles + { + public const string UploaderStylesPath = "Packages/com.unity.asset-store-tools/Editor/Uploader/Styles"; + public const string ValidatorStylesPath = "Packages/com.unity.asset-store-tools/Editor/Validator/Styles"; + public const string ValidatorIconsPath = "Packages/com.unity.asset-store-tools/Editor/Validator/Icons"; + public const string PreviewGeneratorStylesPath = "Packages/com.unity.asset-store-tools/Editor/Previews/Styles"; + public const string UpdaterStylesPath = "Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater"; + } + + public class Debug + { + public const string DebugModeKey = "ASTDebugMode"; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Constants.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Constants.cs.meta new file mode 100644 index 00000000..9fa06571 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Constants.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a4ee1f78505bda748ae24b3dfd2606ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Constants.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter.meta new file mode 100644 index 00000000..4e1143b8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5f5ca981958937a43997a9f365759edf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions.meta new file mode 100644 index 00000000..ac18e6c5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2072d354c04b19c48b22593536b3ebcf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs new file mode 100644 index 00000000..0201a8ea --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace AssetStoreTools.Exporter +{ + internal interface IPackageExporter + { + PackageExporterSettings Settings { get; } + + Task Export(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs.meta new file mode 100644 index 00000000..2285d4b7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 41bc3a111ed1fd64c8b9acef211d9e51 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPackageExporter.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs new file mode 100644 index 00000000..ba503d8d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs @@ -0,0 +1,7 @@ +namespace AssetStoreTools.Exporter +{ + internal interface IPreviewInjector + { + void Inject(string temporaryPackagePath); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs.meta new file mode 100644 index 00000000..7f4182ed --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: dcff58dc716351f43b2709cfacdfebba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/IPreviewInjector.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs new file mode 100644 index 00000000..885a188b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs @@ -0,0 +1,134 @@ +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; + +namespace AssetStoreTools.Exporter +{ + internal abstract class PackageExporterBase : IPackageExporter + { + public PackageExporterSettings Settings { get; private set; } + + public const string ProgressBarTitle = "Exporting Package"; + public const string ProgressBarStepSavingAssets = "Saving Assets..."; + public const string ProgressBarStepGatheringFiles = "Gathering files..."; + public const string ProgressBarStepGeneratingPreviews = "Generating previews..."; + public const string ProgressBarStepCompressingPackage = "Compressing package..."; + + private static readonly string[] PluginFolderExtensions = { "androidlib", "bundle", "plugin", "framework", "xcframework" }; + + public PackageExporterBase(PackageExporterSettings settings) + { + Settings = settings; + } + + public async Task Export() + { + try + { + ValidateSettings(); + } + catch (Exception e) + { + return new PackageExporterResult() { Success = false, Exception = e }; + } + + return await ExportImpl(); + } + + protected virtual void ValidateSettings() + { + if (Settings == null) + throw new ArgumentException("Settings cannot be null"); + + if (string.IsNullOrEmpty(Settings.OutputFilename)) + throw new ArgumentException("Output path cannot be null"); + + if (Settings.OutputFilename.EndsWith("/") || Settings.OutputFilename.EndsWith("\\")) + throw new ArgumentException("Output path must be a valid filename and not end with a directory separator character"); + } + + protected abstract Task ExportImpl(); + + protected string[] GetAssetPaths(string rootPath) + { + // To-do: slight optimization is possible in the future by having a list of excluded folders/file extensions + List paths = new List(); + + // Add files within given directory + var filePaths = Directory.GetFiles(rootPath).Select(p => p.Replace('\\', '/')).ToArray(); + paths.AddRange(filePaths); + + // Add directories within given directory + var directoryPaths = Directory.GetDirectories(rootPath).Select(p => p.Replace('\\', '/')).ToArray(); + foreach (var nestedDirectory in directoryPaths) + paths.AddRange(GetAssetPaths(nestedDirectory)); + + // Add the given directory itself if it is not empty + if (filePaths.Length > 0 || directoryPaths.Length > 0) + paths.Add(rootPath); + + return paths.ToArray(); + } + + protected string GetAssetGuid(string assetPath, bool generateIfPlugin, bool scrapeFromMeta) + { + if (!FileUtility.ShouldHaveMeta(assetPath)) + return string.Empty; + + // Skip ProjectVersion.txt file specifically as it may introduce + // project compatibility issues when imported + if (string.Compare(assetPath, "ProjectSettings/ProjectVersion.txt", StringComparison.OrdinalIgnoreCase) == 0) + return string.Empty; + + // Attempt retrieving guid from the Asset Database first + var guid = AssetDatabase.AssetPathToGUID(assetPath); + if (guid != string.Empty) + return guid; + + // Some special folders (e.g. SomeName.framework) do not have meta files inside them. + // Their contents should be exported with any arbitrary GUID so that Unity Importer could pick them up + if (generateIfPlugin && PathBelongsToPlugin(assetPath)) + return GUID.Generate().ToString(); + + // Files in hidden folders (e.g. Samples~) are not part of the Asset Database, + // therefore GUIDs need to be scraped from the .meta file. + // Note: only do this for non-native exporter since the native exporter + // will not be able to retrieve the asset path from a hidden folder + if (scrapeFromMeta) + { + var metaPath = $"{assetPath}.meta"; + + if (!File.Exists(metaPath)) + return string.Empty; + + using (StreamReader reader = new StreamReader(metaPath)) + { + string line; + while ((line = reader.ReadLine()) != string.Empty) + { + if (!line.StartsWith("guid:")) + continue; + var metaGuid = line.Substring("guid:".Length).Trim(); + return metaGuid; + } + } + } + + return string.Empty; + } + + private bool PathBelongsToPlugin(string assetPath) + { + return PluginFolderExtensions.Any(extension => assetPath.ToLower().Contains($".{extension}/")); + } + + protected virtual void PostExportCleanup() + { + EditorUtility.ClearProgressBar(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs.meta new file mode 100644 index 00000000..da3072cc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: aab20a0b596e60b40b1f7f7e0f54858e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs new file mode 100644 index 00000000..6197ba56 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs @@ -0,0 +1,7 @@ +namespace AssetStoreTools.Exporter +{ + internal abstract class PackageExporterSettings + { + public string OutputFilename; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs.meta new file mode 100644 index 00000000..d6041f44 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 82c350daaabdc784e95e09cdc8511e23 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/Abstractions/PackageExporterSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs new file mode 100644 index 00000000..82a10ac1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs @@ -0,0 +1,11 @@ +using AssetStoreTools.Previews.Generators; + +namespace AssetStoreTools.Exporter +{ + internal class DefaultExporterSettings : PackageExporterSettings + { + public string[] ExportPaths; + public string[] Dependencies; + public IPreviewGenerator PreviewGenerator; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs.meta new file mode 100644 index 00000000..4f784d27 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 92cbd0e60b4bb9049bcf1e9fd92ccae6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultExporterSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs new file mode 100644 index 00000000..c8d6c428 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs @@ -0,0 +1,304 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Utility; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; +using CacheConstants = AssetStoreTools.Constants.Cache; + +namespace AssetStoreTools.Exporter +{ + internal class DefaultPackageExporter : PackageExporterBase + { + private const string TemporaryExportPathName = "CustomExport"; + + private DefaultExporterSettings _defaultExportSettings; + + public DefaultPackageExporter(DefaultExporterSettings settings) : base(settings) + { + _defaultExportSettings = settings; + } + + protected override void ValidateSettings() + { + base.ValidateSettings(); + + if (_defaultExportSettings.ExportPaths == null || _defaultExportSettings.ExportPaths.Length == 0) + throw new ArgumentException("Export paths array cannot be empty"); + } + + protected override async Task ExportImpl() + { + return await this.Export(); + } + + private new async Task Export() + { + ASDebug.Log("Using custom package exporter"); + + // Save assets before exporting + EditorUtility.DisplayProgressBar(ProgressBarTitle, ProgressBarStepSavingAssets, 0.1f); + AssetDatabase.SaveAssets(); + + try + { + // Create a temporary export path + PostExportCleanup(); + var temporaryExportPath = GetTemporaryExportPath(); + if (!Directory.Exists(temporaryExportPath)) + Directory.CreateDirectory(temporaryExportPath); + + // Construct an unzipped package structure + CreateTempPackageStructure(temporaryExportPath); + + var previewGenerationResult = await GeneratePreviews(); + InjectPreviews(previewGenerationResult, temporaryExportPath); + + // Build a .unitypackage file from the temporary folder + CreateUnityPackage(temporaryExportPath, _defaultExportSettings.OutputFilename); + + EditorUtility.RevealInFinder(_defaultExportSettings.OutputFilename); + + ASDebug.Log($"Package file has been created at {_defaultExportSettings.OutputFilename}"); + return new PackageExporterResult() { Success = true, ExportedPath = _defaultExportSettings.OutputFilename, PreviewGenerationResult = previewGenerationResult }; + } + catch (Exception e) + { + return new PackageExporterResult() { Success = false, Exception = e }; + } + finally + { + PostExportCleanup(); + } + } + + private string GetTemporaryExportPath() + { + return $"{CacheConstants.TempCachePath}/{TemporaryExportPathName}"; + } + + private void CreateTempPackageStructure(string tempOutputPath) + { + EditorUtility.DisplayProgressBar(ProgressBarTitle, ProgressBarStepGatheringFiles, 0.4f); + var pathGuidPairs = GetPathGuidPairs(_defaultExportSettings.ExportPaths); + + foreach (var pair in pathGuidPairs) + { + var originalAssetPath = pair.Key; + var outputAssetPath = $"{tempOutputPath}/{pair.Value}"; + + if (Directory.Exists(outputAssetPath)) + { + var path1 = File.ReadAllText($"{outputAssetPath}/pathname"); + var path2 = originalAssetPath; + throw new InvalidOperationException($"Multiple assets with guid {pair.Value} have been detected " + + $"when exporting the package. Please resolve the guid conflicts and try again:\n{path1}\n{path2}"); + } + + Directory.CreateDirectory(outputAssetPath); + + // Every exported asset has a pathname file + using (StreamWriter writer = new StreamWriter($"{outputAssetPath}/pathname")) + writer.Write(originalAssetPath); + + // Only files (not folders) have an asset file + if (File.Exists(originalAssetPath)) + File.Copy(originalAssetPath, $"{outputAssetPath}/asset"); + + // Most files and folders have an asset.meta file (but ProjectSettings folder assets do not) + if (File.Exists($"{originalAssetPath}.meta")) + File.Copy($"{originalAssetPath}.meta", $"{outputAssetPath}/asset.meta"); + + // To-do: handle previews in hidden folders as they are not part of the AssetDatabase + var previewObject = AssetDatabase.LoadAssetAtPath(originalAssetPath); + if (previewObject == null) + continue; + } + + if (_defaultExportSettings.Dependencies == null || _defaultExportSettings.Dependencies.Length == 0) + return; + + var exportDependenciesDict = new JObject(); + var allRegistryPackages = PackageUtility.GetAllRegistryPackages(); + + foreach (var exportDependency in _defaultExportSettings.Dependencies) + { + var registryPackage = allRegistryPackages.FirstOrDefault(x => x.name == exportDependency); + if (registryPackage == null) + { + // Package is either not from a registry source or does not exist in the project + UnityEngine.Debug.LogWarning($"Found an unsupported Package Manager dependency: {exportDependency}.\n" + + "This dependency is not supported in the project's manifest.json and will be skipped."); + continue; + } + + exportDependenciesDict[registryPackage.name] = registryPackage.version; + } + + if (exportDependenciesDict.Count == 0) + return; + + var exportManifestJson = new JObject(); + exportManifestJson["dependencies"] = exportDependenciesDict; + + var tempManifestDirectoryPath = $"{tempOutputPath}/packagemanagermanifest"; + Directory.CreateDirectory(tempManifestDirectoryPath); + var tempManifestFilePath = $"{tempManifestDirectoryPath}/asset"; + + File.WriteAllText(tempManifestFilePath, exportManifestJson.ToString()); + } + + private Dictionary GetPathGuidPairs(string[] exportPaths) + { + var pathGuidPairs = new Dictionary(); + + foreach (var exportPath in exportPaths) + { + var assetPaths = GetAssetPaths(exportPath); + + foreach (var assetPath in assetPaths) + { + var guid = GetAssetGuid(assetPath, true, true); + if (string.IsNullOrEmpty(guid)) + continue; + + pathGuidPairs.Add(assetPath, guid); + } + } + + return pathGuidPairs; + } + + private async Task GeneratePreviews() + { + if (_defaultExportSettings.PreviewGenerator == null) + return null; + + void ReportProgress(float progress) + { + EditorUtility.DisplayProgressBar(ProgressBarTitle, ProgressBarStepGeneratingPreviews, progress); + } + + _defaultExportSettings.PreviewGenerator.OnProgressChanged += ReportProgress; + var result = await _defaultExportSettings.PreviewGenerator.Generate(); + _defaultExportSettings.PreviewGenerator.OnProgressChanged -= ReportProgress; + EditorUtility.ClearProgressBar(); + + if (!result.Success) + { + UnityEngine.Debug.LogWarning($"An error was encountered while generating previews. Exported package may be missing previews.\n{result.Exception}"); + } + + return result; + } + + private void InjectPreviews(PreviewGenerationResult result, string temporaryExportPath) + { + if (result == null || !result.Success) + return; + + var injector = new PreviewInjector(result); + injector.Inject(temporaryExportPath); + } + + private void CreateUnityPackage(string pathToArchive, string outputPath) + { + if (Directory.GetDirectories(pathToArchive).Length == 0) + throw new InvalidOperationException("Unable to export package. The specified path is empty"); + + EditorUtility.DisplayProgressBar(ProgressBarTitle, ProgressBarStepCompressingPackage, 0.8f); + + // Archiving process working path will be set to the + // temporary package path so adjust the output path accordingly + if (!Path.IsPathRooted(outputPath)) + outputPath = $"{Application.dataPath.Substring(0, Application.dataPath.Length - "/Assets".Length)}/{outputPath}"; + +#if UNITY_EDITOR_WIN + CreateUnityPackageUniversal(pathToArchive, outputPath); +#elif UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX + CreateUnityPackageOsxLinux(pathToArchive, outputPath); +#endif + } + + private void CreateUnityPackageUniversal(string pathToArchive, string outputPath) + { + var _7zPath = EditorApplication.applicationContentsPath; +#if UNITY_EDITOR_WIN + _7zPath = Path.Combine(_7zPath, "Tools", "7z.exe"); +#elif UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX + _7zPath = Path.Combine(_7zPath, "Tools", "7za"); +#endif + if (!File.Exists(_7zPath)) + throw new FileNotFoundException("Archiving utility was not found in your Unity installation directory"); + + var argumentsTar = $"a -r -ttar -y -bd archtemp.tar ."; + var result = StartProcess(_7zPath, argumentsTar, pathToArchive); + if (result != 0) + throw new Exception("Failed to compress the package"); + + // Create a GZIP archive + var argumentsGzip = $"a -tgzip -bd -y \"{outputPath}\" archtemp.tar"; + result = StartProcess(_7zPath, argumentsGzip, pathToArchive); + if (result != 0) + throw new Exception("Failed to compress the package"); + } + +#if UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX + private void CreateUnityPackageOsxLinux(string pathToArchive, string outputPath) + { + var tarPath = "/usr/bin/tar"; + + if (!File.Exists(tarPath)) + { + // Fallback to the universal export method + ASDebug.LogWarning("'/usr/bin/tar' executable not found. Falling back to 7za"); + CreateUnityPackageUniversal(pathToArchive, outputPath); + return; + } + + // Create a TAR archive + var arguments = $"-czpf \"{outputPath}\" ."; + var result = StartProcess(tarPath, arguments, pathToArchive); + if (result != 0) + throw new Exception("Failed to compress the package"); + } +#endif + + private int StartProcess(string processPath, string arguments, string workingDirectory) + { + var info = new ProcessStartInfo() + { + FileName = processPath, + Arguments = arguments, + WorkingDirectory = workingDirectory, + CreateNoWindow = true, + UseShellExecute = false + }; + +#if UNITY_EDITOR_OSX + // Prevent OSX-specific archive pollution + info.EnvironmentVariables.Add("COPYFILE_DISABLE", "1"); +#endif + + using (Process process = Process.Start(info)) + { + process.WaitForExit(); + return process.ExitCode; + } + } + + protected override void PostExportCleanup() + { + base.PostExportCleanup(); + + var tempExportPath = GetTemporaryExportPath(); + if (Directory.Exists(tempExportPath)) + Directory.Delete(tempExportPath, true); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs.meta new file mode 100644 index 00000000..76233204 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 32f50122a1b2bc2428cf8fba321e2414 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/DefaultPackageExporter.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs new file mode 100644 index 00000000..52a7cadc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs @@ -0,0 +1,8 @@ +namespace AssetStoreTools.Exporter +{ + internal class LegacyExporterSettings : PackageExporterSettings + { + public string[] ExportPaths; + public bool IncludeDependencies; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs.meta new file mode 100644 index 00000000..e87e08c9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c7dea1cfe45989e4eab6fc5fd18c1e10 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyExporterSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs new file mode 100644 index 00000000..17200439 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs @@ -0,0 +1,109 @@ +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Exporter +{ + internal class LegacyPackageExporter : PackageExporterBase + { + private const string ExportMethodWithoutDependencies = "UnityEditor.PackageUtility.ExportPackage"; + private const string ExportMethodWithDependencies = "UnityEditor.PackageUtility.ExportPackageAndPackageManagerManifest"; + + private LegacyExporterSettings _legacyExportSettings; + + public LegacyPackageExporter(LegacyExporterSettings settings) : base(settings) + { + _legacyExportSettings = settings; + } + + protected override void ValidateSettings() + { + base.ValidateSettings(); + + if (_legacyExportSettings.ExportPaths == null || _legacyExportSettings.ExportPaths.Length == 0) + throw new ArgumentException("Export paths array cannot be empty"); + } + + protected override async Task ExportImpl() + { + return await this.Export(); + } + + private async new Task Export() + { + ASDebug.Log("Using native package exporter"); + + try + { + var guids = GetGuids(_legacyExportSettings.ExportPaths, out bool onlyFolders); + + if (guids.Length == 0 || onlyFolders) + throw new ArgumentException("Package Exporting failed: provided export paths are empty or only contain empty folders"); + + string exportMethod = ExportMethodWithoutDependencies; + if (_legacyExportSettings.IncludeDependencies) + exportMethod = ExportMethodWithDependencies; + + var split = exportMethod.Split('.'); + var assembly = Assembly.Load(split[0]); // UnityEditor + var typeName = $"{split[0]}.{split[1]}"; // UnityEditor.PackageUtility + var methodName = split[2]; // ExportPackage or ExportPackageAndPackageManagerManifest + + var type = assembly.GetType(typeName); + var method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public, + null, new Type[] { typeof(string[]), typeof(string) }, null); + + ASDebug.Log("Invoking native export method"); + + method?.Invoke(null, new object[] { guids, _legacyExportSettings.OutputFilename }); + + // The internal exporter methods are asynchronous, therefore + // we need to wait for exporting to finish before returning + await Task.Run(() => + { + while (!File.Exists(_legacyExportSettings.OutputFilename)) + Thread.Sleep(100); + }); + + ASDebug.Log($"Package file has been created at {_legacyExportSettings.OutputFilename}"); + return new PackageExporterResult() { Success = true, ExportedPath = _legacyExportSettings.OutputFilename }; + } + catch (Exception e) + { + return new PackageExporterResult() { Success = false, Exception = e }; + } + finally + { + PostExportCleanup(); + } + } + + private string[] GetGuids(string[] exportPaths, out bool onlyFolders) + { + var guids = new List(); + onlyFolders = true; + + foreach (var exportPath in exportPaths) + { + var assetPaths = GetAssetPaths(exportPath); + + foreach (var assetPath in assetPaths) + { + var guid = GetAssetGuid(assetPath, false, false); + if (string.IsNullOrEmpty(guid)) + continue; + + guids.Add(guid); + if (onlyFolders == true && (File.Exists(assetPath))) + onlyFolders = false; + } + } + + return guids.ToArray(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs.meta new file mode 100644 index 00000000..61f20571 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3200380dff2de104aa79620e4b41dc70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/LegacyPackageExporter.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs new file mode 100644 index 00000000..a0ae7a5d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs @@ -0,0 +1,13 @@ +using AssetStoreTools.Previews.Data; +using System; + +namespace AssetStoreTools.Exporter +{ + internal class PackageExporterResult + { + public bool Success; + public string ExportedPath; + public PreviewGenerationResult PreviewGenerationResult; + public Exception Exception; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs.meta new file mode 100644 index 00000000..549deb00 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e685b1c322eab4540919d4fc970e812d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/PackageExporterResult.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs b/Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs new file mode 100644 index 00000000..69e06da3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs @@ -0,0 +1,41 @@ +using AssetStoreTools.Previews.Data; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace AssetStoreTools.Exporter +{ + internal class PreviewInjector : IPreviewInjector + { + private PreviewGenerationResult _result; + + public PreviewInjector(PreviewGenerationResult result) + { + _result = result; + } + + public void Inject(string temporaryPackagePath) + { + if (_result == null || !_result.Success) + return; + + var previews = _result.Previews.Where(x => x.Type == _result.GenerationType && x.Exists()); + InjectFilesIntoGuidFolders(previews, temporaryPackagePath); + } + + private void InjectFilesIntoGuidFolders(IEnumerable previews, string temporaryPackagePath) + { + foreach (var assetFolder in Directory.EnumerateDirectories(temporaryPackagePath)) + { + var guid = assetFolder.Replace("\\", "/").Split('/').Last(); + var generatedPreview = previews.FirstOrDefault(x => x.Guid.Equals(guid)); + + if (generatedPreview == null) + continue; + + // Note: Unity Importer and Asset Store only operate with .png extensions + File.Copy(generatedPreview.Path, $"{assetFolder}/preview.png", true); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs.meta new file mode 100644 index 00000000..1f7fe2e9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 772db784128e32d4792bb680258c71df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Exporter/PreviewInjector.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews.meta b/Packages/com.unity.asset-store-tools/Editor/Previews.meta new file mode 100644 index 00000000..747d5eb9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 13e8cd63112e52d43a7e65949f0143a4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts.meta new file mode 100644 index 00000000..f95e49f0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cbe1aebea6551424997b361fab69f266 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data.meta new file mode 100644 index 00000000..89f1356f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae99e2e3b5a83d1469110306c96f4c58 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs new file mode 100644 index 00000000..27058752 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs @@ -0,0 +1,19 @@ +using UnityEngine; + +namespace AssetStoreTools.Previews.Data +{ + internal class CustomPreviewGenerationSettings : PreviewGenerationSettings + { + public override GenerationType GenerationType => GenerationType.Custom; + + public int Width; + public int Height; + public int Depth; + + public int NativeWidth; + public int NativeHeight; + + public Color AudioSampleColor; + public Color AudioBackgroundColor; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs.meta new file mode 100644 index 00000000..027edf9a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2ccb1292c1c4ba94cb6f4022ecfdfa50 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/CustomPreviewGenerationSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs new file mode 100644 index 00000000..cb841a86 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs @@ -0,0 +1,9 @@ +namespace AssetStoreTools.Previews.Data +{ + internal enum FileNameFormat + { + Guid = 0, + FullAssetPath = 1, + AssetName = 2, + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs.meta new file mode 100644 index 00000000..48065984 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 38a1babecfeaf524f98e8d67882acf48 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/FileNameFormat.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs new file mode 100644 index 00000000..fef979f7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs @@ -0,0 +1,9 @@ +namespace AssetStoreTools.Previews.Data +{ + internal enum GenerationType + { + Unknown = 0, + Native = 1, + Custom = 2 + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs.meta new file mode 100644 index 00000000..310ce823 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 66697a5d16404d948ba3191ddfc60bd9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/GenerationType.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs new file mode 100644 index 00000000..fff204ee --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs @@ -0,0 +1,10 @@ +namespace AssetStoreTools.Previews.Data +{ + internal class NativePreviewGenerationSettings : PreviewGenerationSettings + { + public override GenerationType GenerationType => GenerationType.Native; + public bool WaitForPreviews; + public bool ChunkedPreviewLoading; + public int ChunkSize; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs.meta new file mode 100644 index 00000000..a6119eaa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5b2ef019acae6fe43b5565858e15433a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/NativePreviewGenerationSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs new file mode 100644 index 00000000..cabc56c1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace AssetStoreTools.Previews.Data +{ + internal class PreviewDatabase + { + public List Previews; + + public PreviewDatabase() + { + Previews = new List(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs.meta new file mode 100644 index 00000000..43055403 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cf8cef28a68324742a7e4b47efc87563 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewDatabase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs new file mode 100644 index 00000000..e68f29a4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs @@ -0,0 +1,8 @@ +namespace AssetStoreTools.Previews.Data +{ + internal enum PreviewFormat + { + JPG = 0, + PNG = 1 + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs.meta new file mode 100644 index 00000000..2ffac1dc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0500e4459ebfe8448a13194af49f89fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewFormat.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs new file mode 100644 index 00000000..6fb77911 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Previews.Data +{ + internal class PreviewGenerationResult + { + public GenerationType GenerationType; + public bool Success; + public IEnumerable GeneratedPreviews; + public IEnumerable Previews; + public Exception Exception; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs.meta new file mode 100644 index 00000000..22f1136d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e040f2cdf0177824dacb158b23a63374 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationResult.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs new file mode 100644 index 00000000..920ac139 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs @@ -0,0 +1,12 @@ +namespace AssetStoreTools.Previews.Data +{ + internal abstract class PreviewGenerationSettings + { + public abstract GenerationType GenerationType { get; } + public string[] InputPaths; + public string OutputPath; + public PreviewFormat Format; + public FileNameFormat PreviewFileNamingFormat; + public bool OverwriteExisting; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs.meta new file mode 100644 index 00000000..30ef418e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7e578ae6616505a4795da8f632d63229 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewGenerationSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs new file mode 100644 index 00000000..a7ba227e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs @@ -0,0 +1,17 @@ +using System.IO; + +namespace AssetStoreTools.Previews.Data +{ + internal class PreviewMetadata + { + public GenerationType Type; + public string Guid; + public string Name; + public string Path; + + public bool Exists() + { + return File.Exists(Path); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs.meta new file mode 100644 index 00000000..437956a7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4ff6be4e277d8314e921baff52ea25bc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Data/PreviewMetadata.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators.meta new file mode 100644 index 00000000..7019d5cb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed651159a2004574789e97726da5090c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom.meta new file mode 100644 index 00000000..cac3d999 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f675855c3d971694785806c0c7a463be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs new file mode 100644 index 00000000..f46e4062 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom +{ + internal class AudioChannel + { + private int _yMin; + private int _yMax; + + private int _yBaseline; + private int _yAmplitude; + + private List _samples; + + public AudioChannel(int minY, int maxY, List samples) + { + _yMin = minY; + _yMax = maxY; + + _yBaseline = (_yMin + _yMax) / 2; + _yAmplitude = _yMax - _yBaseline; + + _samples = samples; + } + + public IEnumerable GetCoordinateData(int desiredWidth) + { + var coordinates = new List(); + var step = Mathf.RoundToInt((float)_samples.Count / desiredWidth); + + for (int i = 0; i < desiredWidth; i++) + { + var startIndex = i * step; + var endIndex = (i + 1) * step; + var sampleChunk = CreateChunk(startIndex, endIndex); + + if (sampleChunk.Count() == 0) + break; + + DownsampleMax(sampleChunk, out var aboveBaseline, out var belowBaseline); + + var yAboveBaseline = SampleToCoordinate(aboveBaseline); + var yBelowBaseline = SampleToCoordinate(belowBaseline); + + coordinates.Add(new AudioChannelCoordinate(i, _yBaseline, yAboveBaseline, yBelowBaseline)); + } + + // If there weren't enough samples to complete the desired width - fill out the rest with zeroes + for (int i = coordinates.Count; i < desiredWidth; i++) + coordinates.Add(new AudioChannelCoordinate(i, _yBaseline, 0, 0)); + + return coordinates; + } + + private IEnumerable CreateChunk(int startIndex, int endIndex) + { + var chunk = new List(); + for (int i = startIndex; i < endIndex; i++) + { + if (i >= _samples.Count) + break; + + chunk.Add(_samples[i]); + } + + return chunk; + } + + private void DownsampleMax(IEnumerable samples, out float valueAboveBaseline, out float valueBelowBaseline) + { + valueAboveBaseline = 0; + valueBelowBaseline = 0; + + foreach (var sample in samples) + { + if (sample > 0 && sample > valueAboveBaseline) + { + valueAboveBaseline = sample; + continue; + } + + if (sample < 0 && sample < valueBelowBaseline) + { + valueBelowBaseline = sample; + continue; + } + } + } + + private int SampleToCoordinate(float sample) + { + return _yBaseline + (int)(sample * _yAmplitude); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs.meta new file mode 100644 index 00000000..dbbceb38 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 82fab55b08a1be94cb2e18f3feae91ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannel.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs new file mode 100644 index 00000000..1030eed2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs @@ -0,0 +1,18 @@ +namespace AssetStoreTools.Previews.Generators.Custom +{ + internal struct AudioChannelCoordinate + { + public int X { get; private set; } + public int YBaseline { get; private set; } + public int YAboveBaseline { get; private set; } + public int YBelowBaseline { get; private set; } + + public AudioChannelCoordinate(int x, int yBaseline, int yAboveBaseline, int yBelowBaseline) + { + X = x; + YBaseline = yBaseline; + YAboveBaseline = yAboveBaseline; + YBelowBaseline = yBelowBaseline; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs.meta new file mode 100644 index 00000000..5c41aae9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b54462f6af82a2644944d6e4bde23c9e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/AudioChannelCoordinate.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters.meta new file mode 100644 index 00000000..91cfc9f9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c07070deed666d54cb72a89a5fcd7ef7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs new file mode 100644 index 00000000..ec7cd578 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.Screenshotters +{ + internal interface ISceneScreenshotter + { + SceneScreenshotterSettings Settings { get; } + + string Screenshot(string outputPath); + string Screenshot(GameObject target, string outputPath); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs.meta new file mode 100644 index 00000000..103f3a0c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 045ac265a792af243918af0849ee2ac8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/ISceneScreenshotter.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs new file mode 100644 index 00000000..a4462089 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.Screenshotters +{ + internal class MaterialScreenshotter : SceneScreenshotterBase + { + public MaterialScreenshotter(SceneScreenshotterSettings settings) : base(settings) { } + + public override void PositionCamera(GameObject target) + { + var renderers = target.GetComponentsInChildren(); + if (renderers == null || renderers.Length == 0) + return; + + var bounds = GetGlobalBounds(renderers); + + var materialSphereRadius = bounds.extents.y * 1.1f; + + var angle = Camera.fieldOfView / 2; + var sinAngle = Mathf.Sin(angle * Mathf.Deg2Rad); + var distance = materialSphereRadius / sinAngle; + + Camera.transform.position = new Vector3(bounds.center.x, bounds.center.y + distance, bounds.center.z); + Camera.transform.LookAt(bounds.center); + Camera.transform.RotateAround(bounds.center, Vector3.left, 60); + Camera.transform.RotateAround(bounds.center, Vector3.up, -45); + + Camera.nearClipPlane = 0.01f; + Camera.farClipPlane = 10000; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs.meta new file mode 100644 index 00000000..fc8ef16f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c2bd7b01b0cebeb43a6fbc53377f0ea6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MaterialScreenshotter.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs new file mode 100644 index 00000000..6ce59053 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs @@ -0,0 +1,33 @@ +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.Screenshotters +{ + internal class MeshScreenshotter : SceneScreenshotterBase + { + public MeshScreenshotter(SceneScreenshotterSettings settings) : base(settings) { } + + public override void PositionCamera(GameObject target) + { + var renderers = target.GetComponentsInChildren(); + if (renderers == null || renderers.Length == 0) + return; + + var bounds = GetGlobalBounds(renderers); + + var encapsulatingSphereDiameter = (bounds.max - bounds.min).magnitude; + var encapsulatingSphereRadius = encapsulatingSphereDiameter / 2; + + var angle = Camera.fieldOfView / 2; + var sinAngle = Mathf.Sin(angle * Mathf.Deg2Rad); + var distance = encapsulatingSphereRadius / sinAngle; + + Camera.transform.position = new Vector3(bounds.center.x, bounds.center.y + distance, bounds.center.z); + Camera.transform.LookAt(bounds.center); + Camera.transform.RotateAround(bounds.center, Vector3.left, 65); + Camera.transform.RotateAround(bounds.center, Vector3.up, 235); + + Camera.nearClipPlane = 0.01f; + Camera.farClipPlane = 10000; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs.meta new file mode 100644 index 00000000..7802999f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f0339d22d91b7c94ebc18b1de6f1e287 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/MeshScreenshotter.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs new file mode 100644 index 00000000..fb289f42 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs @@ -0,0 +1,124 @@ +using AssetStoreTools.Previews.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.Screenshotters +{ + internal abstract class SceneScreenshotterBase : ISceneScreenshotter + { + public SceneScreenshotterSettings Settings { get; } + + protected Camera Camera => GetCamera(); + private Camera _camera; + + public SceneScreenshotterBase(SceneScreenshotterSettings settings) + { + Settings = settings; + } + + private Camera GetCamera() + { + if (_camera == null) + { +#if UNITY_2022_3_OR_NEWER + _camera = GameObject.FindFirstObjectByType(FindObjectsInactive.Include); +#else + _camera = GameObject.FindObjectOfType(); +#endif + } + + return _camera; + } + + public virtual void ValidateSettings() + { + if (Settings.Width <= 0) + throw new ArgumentException("Width should be larger than 0"); + + if (Settings.Height <= 0) + throw new ArgumentException("Height should be larger than 0"); + + if (Settings.Depth <= 0) + throw new ArgumentException("Depth should be larger than 0"); + + if (Settings.NativeWidth <= 0) + throw new ArgumentException("Native width should be larger than 0"); + + if (Settings.NativeHeight <= 0) + throw new ArgumentException("Native height should be larger than 0"); + } + + public abstract void PositionCamera(GameObject target); + + public string Screenshot(string outputPath) + { + ValidateSettings(); + + var texture = GraphicsUtility.GetTextureFromCamera(Camera, Settings.NativeWidth, Settings.NativeHeight, Settings.Depth); + + if (Settings.Width < Settings.NativeWidth || Settings.Height < Settings.NativeHeight) + texture = GraphicsUtility.ResizeTexture(texture, Settings.Width, Settings.Height); + + var extension = PreviewConvertUtility.ConvertExtension(Settings.Format); + var writtenPath = $"{outputPath}.{extension}"; + var bytes = PreviewConvertUtility.ConvertTexture(texture, Settings.Format); + File.WriteAllBytes(writtenPath, bytes); + + return writtenPath; + } + + public string Screenshot(GameObject target, string outputPath) + { + PositionCamera(target); + PositionLighting(target); + return Screenshot(outputPath); + } + + private void PositionLighting(GameObject target) + { +#if UNITY_2022_3_OR_NEWER + var light = GameObject.FindFirstObjectByType(FindObjectsInactive.Include); +#else + var light = GameObject.FindObjectOfType(); +#endif + light.transform.position = Camera.transform.position; + light.transform.LookAt(target.transform); + light.transform.RotateAround(target.transform.position, Vector3.forward, 60f); + } + + protected Bounds GetGlobalBounds(IEnumerable renderers) + { + var center = Vector3.zero; + + foreach (var renderer in renderers) + { + center += renderer.bounds.center; + } + center /= renderers.Count(); + + var globalBounds = new Bounds(center, Vector3.zero); + + foreach (var renderer in renderers) + { + globalBounds.Encapsulate(renderer.bounds); + } + + return globalBounds; + } + + protected Bounds GetNormalizedBounds(Bounds bounds) + { + var largestExtent = Mathf.Max(bounds.extents.x, bounds.extents.y, bounds.extents.z); + var normalizedBounds = new Bounds() + { + center = bounds.center, + extents = new Vector3(largestExtent, largestExtent, largestExtent) + }; + + return normalizedBounds; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs.meta new file mode 100644 index 00000000..bf6bbf07 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ce77aefdce8a37f498d17d73da53d0a4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs new file mode 100644 index 00000000..82e0ec1d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs @@ -0,0 +1,16 @@ +using AssetStoreTools.Previews.Data; + +namespace AssetStoreTools.Previews.Generators.Custom.Screenshotters +{ + internal class SceneScreenshotterSettings + { + public int Width; + public int Height; + public int Depth; + + public int NativeWidth; + public int NativeHeight; + + public PreviewFormat Format; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs.meta new file mode 100644 index 00000000..04d76d7d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: aa34806e243bad949892d06dd47295e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/Screenshotters/SceneScreenshotterSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators.meta new file mode 100644 index 00000000..e13d7264 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b4bb2dd0960418d4a8d4efd34b92a418 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs new file mode 100644 index 00000000..36a6b215 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs @@ -0,0 +1,15 @@ +using AssetStoreTools.Previews.Data; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class AudioTypeGeneratorSettings : TypeGeneratorSettings + { + public int Width; + public int Height; + + public Color SampleColor; + public Color BackgroundColor; + public PreviewFormat Format; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs.meta new file mode 100644 index 00000000..fbf89c94 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5b7ab1b072d95be4daf221ee23af1c80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypeGeneratorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs new file mode 100644 index 00000000..a0f15453 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs @@ -0,0 +1,207 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class AudioTypePreviewGenerator : TypePreviewGeneratorBase + { + private AudioTypeGeneratorSettings _settings; + private Texture2D _texture; + + public override event Action OnAssetProcessed; + + public AudioTypePreviewGenerator(AudioTypeGeneratorSettings settings) : base(settings) + { + _settings = settings; + } + + public override void ValidateSettings() + { + base.ValidateSettings(); + + if (_settings.Width <= 0) + throw new ArgumentException("Width must be larger than 0"); + + if (_settings.Height <= 0) + throw new ArgumentException("Height must be larger than 0"); + } + + protected override IEnumerable CollectAssets() + { + var assets = new List(); + var materialGuids = AssetDatabase.FindAssets("t:audioclip", Settings.InputPaths); + foreach (var guid in materialGuids) + { + var audioClip = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + + // Skip nested audio clips + if (!AssetDatabase.IsMainAsset(audioClip)) + continue; + + // Skip materials with an error shader + if (!IsLoadTypeSupported(audioClip)) + { + Debug.LogWarning($"Audio clip '{audioClip}' is using a load type which cannot retrieve sample data. Preview will not be generated."); + continue; + } + + assets.Add(audioClip); + } + + return assets; + } + + private bool IsLoadTypeSupported(AudioClip audioClip) + { + if (audioClip.loadType == AudioClipLoadType.DecompressOnLoad) + return true; + + return false; + } + + protected override async Task> GenerateImpl(IEnumerable assets) + { + var generatedPreviews = new List(); + var audioClips = assets.ToList(); + for (int i = 0; i < audioClips.Count; i++) + { + var audioClip = audioClips[i] as AudioClip; + if (audioClip != null) + { + var texture = GenerateAudioClipTexture(audioClip); + + var outputPath = GenerateOutputPathWithExtension(audioClip, _settings.PreviewFileNamingFormat, _settings.Format); + var bytes = PreviewConvertUtility.ConvertTexture(texture, _settings.Format); + File.WriteAllBytes(outputPath, bytes); + generatedPreviews.Add(ObjectToMetadata(audioClip, outputPath)); + } + + OnAssetProcessed?.Invoke(i, audioClips.Count); + await Task.Yield(); + } + + return generatedPreviews; + } + + private Texture2D GenerateAudioClipTexture(AudioClip audioClip) + { + if (!audioClip.LoadAudioData()) + throw new Exception("Could not load audio data"); + + try + { + if (_texture == null) + _texture = new Texture2D(_settings.Width, _settings.Height); + else +#if UNITY_2021_3_OR_NEWER || UNITY_2022_1_OR_NEWER || UNITY_2021_2_OR_NEWER + _texture.Reinitialize(_settings.Width, _settings.Height); +#else + _texture.Resize(_settings.Width, _settings.Height); +#endif + + FillTextureBackground(); + FillTextureForeground(audioClip); + + _texture.Apply(); + return _texture; + } + finally + { + audioClip.UnloadAudioData(); + } + } + + private void FillTextureBackground() + { + for (int i = 0; i < _texture.width; i++) + { + for (int j = 0; j < _texture.height; j++) + { + _texture.SetPixel(i, j, _settings.BackgroundColor); + } + } + } + + private void FillTextureForeground(AudioClip audioClip) + { + var channels = CreateChannels(audioClip); + + for (int i = 0; i < channels.Count; i++) + { + DrawChannel(channels[i]); + } + } + + private List CreateChannels(AudioClip audioClip) + { + var channelSamples = GetChannelSamples(audioClip); + var sectionSize = _texture.height / audioClip.channels; + + var channels = new List(); + + for (int i = 0; i < audioClip.channels; i++) + { + var channelMaxY = (_texture.height - 1) - i * sectionSize; + var channelMinY = _texture.height - (i + 1) * sectionSize; + var channel = new AudioChannel(channelMinY, channelMaxY, channelSamples[i]); + channels.Add(channel); + } + + return channels; + } + + private List> GetChannelSamples(AudioClip audioClip) + { + var channelSamples = new List>(); + var allSamples = new float[audioClip.samples * audioClip.channels]; + + if (!audioClip.GetData(allSamples, 0)) + throw new Exception("Could not retrieve audio samples"); + + for (int i = 0; i < audioClip.channels; i++) + { + var samples = new List(); + var sampleIndex = i; + while (sampleIndex < allSamples.Length) + { + samples.Add(allSamples[sampleIndex]); + sampleIndex += audioClip.channels; + } + + channelSamples.Add(samples); + } + + return channelSamples; + } + + private void DrawChannel(AudioChannel channel) + { + var sectionData = channel.GetCoordinateData(_texture.width); + + foreach (var data in sectionData) + { + DrawVerticalColumn(data.X, data.YBaseline, data.YAboveBaseline, data.YBelowBaseline, _settings.SampleColor); + } + } + + private void DrawVerticalColumn(int x, int yBaseline, int y1, int y2, Color color) + { + _texture.SetPixel(x, yBaseline, color); + + var startIndex = y1 < y2 ? y1 : y2; + var endIndex = y1 < y2 ? y2 : y1; + + for (int i = startIndex; i < endIndex; i++) + { + _texture.SetPixel(x, i, color); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs.meta new file mode 100644 index 00000000..11499cf5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9ddf69bb2dca51a42aff247b3a471bb3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/AudioTypePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs new file mode 100644 index 00000000..bdd5056b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs @@ -0,0 +1,16 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal interface ITypePreviewGenerator + { + TypeGeneratorSettings Settings { get; } + + event Action OnAssetProcessed; + + Task> Generate(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs.meta new file mode 100644 index 00000000..8069f542 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7d9cd368dc73a23478390ee1332cb0be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ITypePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs new file mode 100644 index 00000000..13b44ec5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs @@ -0,0 +1,85 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class MaterialTypePreviewGenerator : TypePreviewGeneratorFromScene + { + public override event Action OnAssetProcessed; + + public MaterialTypePreviewGenerator(TypePreviewGeneratorFromSceneSettings settings) : base(settings) { } + + protected override IEnumerable CollectAssets() + { + var assets = new List(); + var materialGuids = AssetDatabase.FindAssets("t:material", Settings.InputPaths); + foreach (var guid in materialGuids) + { + var mat = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + + // Skip nested materials + if (!AssetDatabase.IsMainAsset(mat)) + continue; + + // Skip materials with an error shader + if (IsShaderInvalid(mat.shader)) + { + Debug.LogWarning($"Material '{mat}' is using an erroring shader. Preview will not be generated."); + continue; + } + + assets.Add(mat); + } + + return assets; + } + + protected override async Task> GeneratePreviewsInScene(IEnumerable assets) + { + var generatedPreviews = new List(); + var materials = assets.ToList(); + var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); + + var hasMeshRenderer = sphere.TryGetComponent(out var meshRenderer); + if (!hasMeshRenderer) + throw new Exception($"Could not find a MeshRenderer for {sphere}"); + + for (int i = 0; i < materials.Count; i++) + { + ThrowIfSceneChanged(); + + var material = materials[i] as Material; + + if (material != null) + { + meshRenderer.sharedMaterial = material; + var previewPath = Settings.Screenshotter.Screenshot(sphere, GenerateOutputPathWithoutExtension(material, Settings.PreviewFileNamingFormat)); + if (!string.IsNullOrEmpty(previewPath)) + generatedPreviews.Add(ObjectToMetadata(material, previewPath)); + } + + OnAssetProcessed?.Invoke(i, materials.Count); + await Task.Yield(); + } + + UnityEngine.Object.DestroyImmediate(sphere); + return generatedPreviews; + } + + private bool IsShaderInvalid(Shader shader) + { + if (ShaderUtil.ShaderHasError(shader)) + return true; + + if (!shader.isSupported) + return true; + + return false; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs.meta new file mode 100644 index 00000000..b4edb16a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a4e121bae63a199458e53a523dd18c8c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/MaterialTypePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs new file mode 100644 index 00000000..7d97607a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs @@ -0,0 +1,86 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class ModelTypePreviewGenerator : TypePreviewGeneratorFromScene + { + public override event Action OnAssetProcessed; + + public ModelTypePreviewGenerator(TypePreviewGeneratorFromSceneSettings settings) : base(settings) { } + + protected override IEnumerable CollectAssets() + { + var models = new List(); + var modelGuids = AssetDatabase.FindAssets("t:model", Settings.InputPaths); + + foreach (var guid in modelGuids) + { + var model = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + + // Skip nested models + if (!AssetDatabase.IsMainAsset(model)) + continue; + + // Skip models without renderers + if (model.GetComponentsInChildren().Length == 0) + continue; + + models.Add(model); + } + + return models; + } + + protected override async Task> GeneratePreviewsInScene(IEnumerable assets) + { + var generatedPreviews = new List(); + var models = assets.ToList(); + var referenceShader = GetDefaultObjectShader(); + + for (int i = 0; i < models.Count; i++) + { + ThrowIfSceneChanged(); + + var model = models[i] as GameObject; + + if (model != null) + { + var go = UnityEngine.Object.Instantiate(model, Vector3.zero, Quaternion.Euler(0, 0, 0)); + ReplaceShaders(go, referenceShader); + + var previewPath = Settings.Screenshotter.Screenshot(go, GenerateOutputPathWithoutExtension(model, Settings.PreviewFileNamingFormat)); + if (!string.IsNullOrEmpty(previewPath)) + generatedPreviews.Add(ObjectToMetadata(model, previewPath)); + + UnityEngine.Object.DestroyImmediate(go); + } + + OnAssetProcessed?.Invoke(i, models.Count); + await Task.Yield(); + } + + return generatedPreviews; + } + + private void ReplaceShaders(GameObject go, Shader shader) + { + var meshRenderers = go.GetComponentsInChildren(); + foreach (var mr in meshRenderers) + { + var materialArray = mr.sharedMaterials; + for (int i = 0; i < materialArray.Length; i++) + { + materialArray[i] = new Material(shader) { color = new Color(0.7f, 0.7f, 0.7f) }; + } + + mr.sharedMaterials = materialArray; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs.meta new file mode 100644 index 00000000..dacc7e3d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: fca8a1fa8a211874cb84d3d811a0158c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/ModelTypePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs new file mode 100644 index 00000000..f0eeb6b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs @@ -0,0 +1,113 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class PrefabTypePreviewGenerator : TypePreviewGeneratorFromScene + { + public override event Action OnAssetProcessed; + + public PrefabTypePreviewGenerator(TypePreviewGeneratorFromSceneSettings settings) : base(settings) { } + + protected override IEnumerable CollectAssets() + { + var prefabs = new List(); + var prefabGuids = AssetDatabase.FindAssets("t:prefab", Settings.InputPaths); + + foreach (var guid in prefabGuids) + { + var prefab = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + + // Skip nested prefabs + if (!AssetDatabase.IsMainAsset(prefab)) + continue; + + // Skip prefabs without renderers + if (prefab.GetComponentsInChildren().Length == 0) + continue; + + prefabs.Add(prefab); + } + + return prefabs; + } + + protected override async Task> GeneratePreviewsInScene(IEnumerable assets) + { + var generatedPreviews = new List(); + var prefabs = assets.ToList(); + var objectReferenceShader = GetDefaultObjectShader(); + var particleReferenceShader = GetDefaultParticleShader(); + + for (int i = 0; i < prefabs.Count; i++) + { + ThrowIfSceneChanged(); + + var prefab = prefabs[i] as GameObject; + if (prefab != null) + { + var go = UnityEngine.Object.Instantiate(prefab, Vector3.zero, Quaternion.Euler(0, 0, 0)); + + ReplaceMissingShaders(go, objectReferenceShader, particleReferenceShader); + + HandleParticleSystems(go); + + var previewPath = Settings.Screenshotter.Screenshot(go, GenerateOutputPathWithoutExtension(prefab, Settings.PreviewFileNamingFormat)); + if (!string.IsNullOrEmpty(previewPath)) + generatedPreviews.Add(ObjectToMetadata(prefab, previewPath)); + + UnityEngine.Object.DestroyImmediate(go); + } + + OnAssetProcessed?.Invoke(i, prefabs.Count); + await Task.Yield(); + } + + return generatedPreviews; + } + + private void ReplaceMissingShaders(GameObject go, Shader objectShader, Shader particleShader) + { + var meshRenderers = go.GetComponentsInChildren(); + foreach (var mr in meshRenderers) + { + var shaderToUse = mr is ParticleSystemRenderer ? particleShader : objectShader; + + var materialArray = mr.sharedMaterials; + for (int i = 0; i < materialArray.Length; i++) + { + if (materialArray[i] == null) + { + materialArray[i] = new Material(shaderToUse); + } + else if (!materialArray[i].shader.isSupported) + { + materialArray[i].shader = shaderToUse; + } + } + + mr.sharedMaterials = materialArray; + } + } + + private void HandleParticleSystems(GameObject go) + { + var particleSystems = go.GetComponentsInChildren(); + if (particleSystems.Length == 0) + return; + + foreach (var ps in particleSystems) + { + ps.Stop(); + ps.Clear(); + ps.randomSeed = 1; + ps.Simulate(10, false, true, false); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs.meta new file mode 100644 index 00000000..ce814043 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 24b15b10bc361c84581f46cb6dd644cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/PrefabTypePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs new file mode 100644 index 00000000..666b32dd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs @@ -0,0 +1,11 @@ +using AssetStoreTools.Previews.Data; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class TextureTypeGeneratorSettings : TypeGeneratorSettings + { + public int MaxWidth; + public int MaxHeight; + public PreviewFormat Format; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs.meta new file mode 100644 index 00000000..09acc0d5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 058d746982619b04eb5e200363003899 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypeGeneratorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs new file mode 100644 index 00000000..24e1102f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs @@ -0,0 +1,116 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class TextureTypePreviewGenerator : TypePreviewGeneratorBase + { + private TextureTypeGeneratorSettings _settings; + + public override event Action OnAssetProcessed; + + public TextureTypePreviewGenerator(TextureTypeGeneratorSettings settings) : base(settings) + { + _settings = settings; + } + + public override void ValidateSettings() + { + base.ValidateSettings(); + + if (_settings.MaxWidth <= 0) + throw new ArgumentException("Max width should be larger than 0"); + + if (_settings.MaxHeight <= 0) + throw new ArgumentException("Max height should be larger than 0"); + } + + protected override IEnumerable CollectAssets() + { + var textures = new List(); + var textureGuids = AssetDatabase.FindAssets("t:texture", Settings.InputPaths); + + foreach (var guid in textureGuids) + { + var texture = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + + // Skip nested textures + if (!AssetDatabase.IsMainAsset(texture)) + continue; + + textures.Add(texture); + } + + return textures; + } + + protected override async Task> GenerateImpl(IEnumerable assets) + { + var generatedPreviews = new List(); + var textures = assets.ToList(); + + for (int i = 0; i < textures.Count; i++) + { + var texture = textures[i] as Texture2D; + + if (texture != null) + { + Texture2D resizedTexture; + CalculateTextureSize(texture, out var resizeWidth, out var resizeHeight); + + var importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter; + if (importer != null && importer.textureType == TextureImporterType.NormalMap) + resizedTexture = GraphicsUtility.ResizeTextureNormalMap(texture, resizeWidth, resizeHeight); + else + resizedTexture = GraphicsUtility.ResizeTexture(texture, resizeWidth, resizeHeight); + + var previewPath = GenerateOutputPathWithExtension(texture, _settings.PreviewFileNamingFormat, _settings.Format); + + // Some textures may be transparent and need to be encoded as PNG to look correctly + var targetFormat = texture.alphaIsTransparency ? PreviewFormat.PNG : _settings.Format; + var bytes = PreviewConvertUtility.ConvertTexture(resizedTexture, targetFormat); + + File.WriteAllBytes(previewPath, bytes); + generatedPreviews.Add(ObjectToMetadata(texture, previewPath)); + } + + OnAssetProcessed?.Invoke(i, textures.Count); + await Task.Yield(); + } + + return generatedPreviews; + } + + private void CalculateTextureSize(Texture2D texture, out int width, out int height) + { + if (texture.width <= _settings.MaxWidth && texture.height <= _settings.MaxHeight) + { + width = texture.width; + height = texture.height; + return; + } + + var widthLongerThanHeight = texture.width > texture.height; + + if (widthLongerThanHeight) + { + var ratio = (float)texture.width / texture.height; + width = _settings.MaxWidth; + height = Mathf.RoundToInt(width / ratio); + } + else + { + var ratio = (float)texture.height / texture.width; + height = _settings.MaxHeight; + width = Mathf.RoundToInt(height / ratio); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs.meta new file mode 100644 index 00000000..90d58b7a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b04f55867ee575c489803356220feb31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TextureTypePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs new file mode 100644 index 00000000..1aaaa42d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs @@ -0,0 +1,12 @@ +using AssetStoreTools.Previews.Data; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal abstract class TypeGeneratorSettings + { + public string[] InputPaths; + public string[] IgnoredGuids; + public string OutputPath; + public FileNameFormat PreviewFileNamingFormat; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs.meta new file mode 100644 index 00000000..90f895de --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a224a4b41a8c7cf4cb53dd77d6f2518b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypeGeneratorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs new file mode 100644 index 00000000..a49d9686 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs @@ -0,0 +1,126 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal abstract class TypePreviewGeneratorBase : ITypePreviewGenerator + { + public TypeGeneratorSettings Settings { get; } + + public abstract event Action OnAssetProcessed; + + public TypePreviewGeneratorBase(TypeGeneratorSettings settings) + { + Settings = settings; + } + + public virtual void ValidateSettings() + { + if (Settings.InputPaths == null || Settings.InputPaths.Length == 0) + throw new ArgumentException("Input path cannot be null"); + + foreach (var path in Settings.InputPaths) + { + var inputPath = path.EndsWith("/") ? path.Remove(path.Length - 1) : path; + if (!AssetDatabase.IsValidFolder(inputPath)) + throw new ArgumentException($"Input path '{inputPath}' is not a valid ADB folder"); + } + + if (string.IsNullOrEmpty(Settings.OutputPath)) + throw new ArgumentException("Output path cannot be null"); + } + + public async Task> Generate() + { + var generatedPreviews = new List(); + ValidateSettings(); + + var assets = CollectAssets(); + assets = FilterIgnoredAssets(assets); + + if (assets.Count() == 0) + return generatedPreviews; + + return await GenerateImpl(assets); + } + + protected abstract IEnumerable CollectAssets(); + + private IEnumerable FilterIgnoredAssets(IEnumerable assets) + { + if (Settings.IgnoredGuids == null || Settings.IgnoredGuids.Length == 0) + return assets; + + var filteredAssets = new List(); + foreach (var asset in assets) + { + if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(asset, out var guid, out long _)) + continue; + + if (Settings.IgnoredGuids.Any(x => x == guid)) + continue; + + filteredAssets.Add(asset); + } + + return filteredAssets; + } + + protected abstract Task> GenerateImpl(IEnumerable assets); + + protected PreviewMetadata ObjectToMetadata(UnityEngine.Object obj, string previewPath) + { + if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj, out var guid, out long _)) + throw new Exception($"Could not retrieve guid for object {obj}"); + + return new PreviewMetadata() + { + Type = GenerationType.Custom, + Guid = guid, + Name = obj.name, + Path = previewPath + }; + } + + protected string GenerateOutputPathWithoutExtension(UnityEngine.Object asset, FileNameFormat fileNameFormat) + { + PrepareOutputFolder(Settings.OutputPath, false); + var directoryPath = Settings.OutputPath; + var fileName = PreviewConvertUtility.ConvertFilename(asset, fileNameFormat); + var fullPath = $"{directoryPath}/{fileName}"; + + return fullPath; + } + + protected string GenerateOutputPathWithExtension(UnityEngine.Object asset, FileNameFormat fileNameFormat, PreviewFormat previewFormat) + { + var partialOutputPath = GenerateOutputPathWithoutExtension(asset, fileNameFormat); + var extension = PreviewConvertUtility.ConvertExtension(previewFormat); + + return $"{partialOutputPath}.{extension}"; + } + + private void PrepareOutputFolder(string outputPath, bool cleanup) + { + var dir = new DirectoryInfo(outputPath); + + if (!dir.Exists) + { + dir.Create(); + return; + } + + if (!cleanup) + return; + + dir.Delete(true); + dir.Create(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs.meta new file mode 100644 index 00000000..8b3faa83 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c6fb2d639232bce4698338a252f47f3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs new file mode 100644 index 00000000..f9fe453e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs @@ -0,0 +1,111 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Utility; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal abstract class TypePreviewGeneratorFromScene : TypePreviewGeneratorBase + { + protected new TypePreviewGeneratorFromSceneSettings Settings; + + private CancellationTokenSource _cancellationTokenSource; + + public TypePreviewGeneratorFromScene(TypePreviewGeneratorFromSceneSettings settings) : base(settings) + { + Settings = settings; + } + + public override void ValidateSettings() + { + base.ValidateSettings(); + + if (Settings.Screenshotter == null) + throw new ArgumentException("Screenshotter cannot be null"); + } + + protected sealed override async Task> GenerateImpl(IEnumerable assets) + { + var originalScenePath = EditorSceneManager.GetActiveScene().path; + await PreviewSceneUtility.OpenPreviewSceneForCurrentPipeline(); + + try + { + _cancellationTokenSource = new CancellationTokenSource(); + EditorSceneManager.sceneOpened += SceneOpenedDuringGeneration; + return await GeneratePreviewsInScene(assets); + } + finally + { + EditorSceneManager.sceneOpened -= SceneOpenedDuringGeneration; + _cancellationTokenSource.Dispose(); + if (!string.IsNullOrEmpty(originalScenePath)) + EditorSceneManager.OpenScene(originalScenePath); + } + } + + protected abstract Task> GeneratePreviewsInScene(IEnumerable assets); + + private void SceneOpenedDuringGeneration(Scene _, OpenSceneMode __) + { + if (!_cancellationTokenSource.IsCancellationRequested) + _cancellationTokenSource.Cancel(); + } + + protected void ThrowIfSceneChanged() + { + if (_cancellationTokenSource.Token.IsCancellationRequested) + throw new Exception("Preview generation was aborted due to a change of the scene"); + } + + protected Shader GetDefaultObjectShader() + { + switch (RenderPipelineUtility.GetCurrentPipeline()) + { + case RenderPipeline.BiRP: + return Shader.Find("Standard"); + case RenderPipeline.URP: + return Shader.Find("Universal Render Pipeline/Lit"); + case RenderPipeline.HDRP: + return Shader.Find("HDRP/Lit"); + default: + throw new NotImplementedException("Undefined Render Pipeline"); + } + } + + protected Shader GetDefaultParticleShader() + { + switch (RenderPipelineUtility.GetCurrentPipeline()) + { + case RenderPipeline.BiRP: + return Shader.Find("Particles/Standard Unlit"); + case RenderPipeline.URP: + return Shader.Find("Universal Render Pipeline/Particles/Unlit"); + case RenderPipeline.HDRP: + return Shader.Find("HDRP/Unlit"); + default: + throw new NotImplementedException("Undefined Render Pipeline"); + } + } + + protected Shader GetDefaultTextureShader() + { + switch (RenderPipelineUtility.GetCurrentPipeline()) + { + case RenderPipeline.BiRP: + return Shader.Find("Unlit/Texture"); + case RenderPipeline.URP: + return Shader.Find("Universal Render Pipeline/Unlit"); + case RenderPipeline.HDRP: + return Shader.Find("HDRP/Unlit"); + default: + throw new NotImplementedException("Undefined Render Pipeline"); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs.meta new file mode 100644 index 00000000..263c5440 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 1bf0eb8d7ef65f340be785dae96e4b73 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromScene.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs new file mode 100644 index 00000000..36a2e6e0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs @@ -0,0 +1,9 @@ +using AssetStoreTools.Previews.Generators.Custom.Screenshotters; + +namespace AssetStoreTools.Previews.Generators.Custom.TypeGenerators +{ + internal class TypePreviewGeneratorFromSceneSettings : TypeGeneratorSettings + { + public ISceneScreenshotter Screenshotter; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs.meta new file mode 100644 index 00000000..d51befd5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a6b871798f99ad44d9fca46789239ec1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/Custom/TypeGenerators/TypePreviewGeneratorFromSceneSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs new file mode 100644 index 00000000..7a1ffebc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs @@ -0,0 +1,213 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Generators; +using AssetStoreTools.Previews.Generators.Custom.Screenshotters; +using AssetStoreTools.Previews.Generators.Custom.TypeGenerators; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; + +namespace AssetStoreTools.Previews +{ + internal class CustomPreviewGenerator : PreviewGeneratorBase + { + private CustomPreviewGenerationSettings _customSettings; + + public override event Action OnProgressChanged; + + public CustomPreviewGenerator(CustomPreviewGenerationSettings settings) + : base(settings) + { + _customSettings = settings; + } + + protected override void Validate() + { + base.Validate(); + + if (_customSettings.Width <= 0) + throw new ArgumentException("Width should be larger than 0"); + + if (_customSettings.Height <= 0) + throw new ArgumentException("Height should be larger than 0"); + + if (_customSettings.Depth <= 0) + throw new ArgumentException("Depth should be larger than 0"); + + if (_customSettings.NativeWidth <= 0) + throw new ArgumentException("Native width should be larger than 0"); + + if (_customSettings.NativeHeight <= 0) + throw new ArgumentException("Native height should be larger than 0"); + } + + protected override async Task GenerateImpl() + { + var result = new PreviewGenerationResult() + { + GenerationType = _customSettings.GenerationType + }; + + OnProgressChanged?.Invoke(0f); + + var generatedPreviews = new List(); + var existingPreviews = GetExistingPreviews(); + var generators = CreateGenerators(existingPreviews); + + var currentGenerator = 0; + Action generatorProgressCallback = null; + generatorProgressCallback = (currentAsset, totalAssets) => ReportProgress(currentGenerator, generators.Count(), currentAsset, totalAssets); + + try + { + foreach (var generator in generators) + { + generator.OnAssetProcessed += generatorProgressCallback; + var typeGeneratorPreviews = await generator.Generate(); + generatedPreviews.AddRange(typeGeneratorPreviews); + currentGenerator++; + } + + AssetDatabase.Refresh(); + + var allPreviews = new List(); + allPreviews.AddRange(generatedPreviews); + allPreviews.AddRange(existingPreviews); + + result.Success = true; + result.GeneratedPreviews = generatedPreviews; + result.Previews = allPreviews; + } + catch (Exception e) + { + result.Success = false; + result.Exception = e; + } + finally + { + foreach (var generator in generators) + generator.OnAssetProcessed -= generatorProgressCallback; + } + + return result; + } + + private IEnumerable GetExistingPreviews() + { + var existingPreviews = new List(); + + if (Settings.OverwriteExisting || !CachingService.GetCachedMetadata(out var database)) + return existingPreviews; + + var inputGuids = AssetDatabase.FindAssets("", _customSettings.InputPaths); + existingPreviews = database.Previews.Where(x => x.Type == GenerationType.Custom && x.Exists() && inputGuids.Any(y => y.Equals(x.Guid))).ToList(); + return existingPreviews; + } + + private IEnumerable CreateGenerators(IEnumerable existingPreviews) + { + var ignoredGuids = existingPreviews.Select(x => x.Guid).ToArray(); + + var generators = new ITypePreviewGenerator[] + { + CreateAudioPreviewGenerator(ignoredGuids), + CreateMaterialPreviewGenerator(ignoredGuids), + CreateModelPreviewGenerator(ignoredGuids), + CreatePrefabPreviewGenerator(ignoredGuids), + CreateTexturePreviewGenerator(ignoredGuids) + }; + + return generators; + } + + private ITypePreviewGenerator CreateAudioPreviewGenerator(string[] ignoredGuids) + { + var settings = new AudioTypeGeneratorSettings() + { + Width = _customSettings.Width, + Height = _customSettings.Height, + InputPaths = _customSettings.InputPaths, + OutputPath = _customSettings.OutputPath, + PreviewFileNamingFormat = _customSettings.PreviewFileNamingFormat, + Format = _customSettings.Format, + SampleColor = _customSettings.AudioSampleColor, + BackgroundColor = _customSettings.AudioBackgroundColor, + IgnoredGuids = ignoredGuids + }; + + return new AudioTypePreviewGenerator(settings); + } + + private ITypePreviewGenerator CreateMaterialPreviewGenerator(string[] ignoredGuids) + { + var settings = CreateSceneGeneratorSettings(new MaterialScreenshotter(CreateScreenshotterSettings()), ignoredGuids); + return new MaterialTypePreviewGenerator(settings); + } + + private ITypePreviewGenerator CreateModelPreviewGenerator(string[] ignoredGuids) + { + var settings = CreateSceneGeneratorSettings(new MeshScreenshotter(CreateScreenshotterSettings()), ignoredGuids); + return new ModelTypePreviewGenerator(settings); + } + + private ITypePreviewGenerator CreatePrefabPreviewGenerator(string[] ignoredGuids) + { + var settings = CreateSceneGeneratorSettings(new MeshScreenshotter(CreateScreenshotterSettings()), ignoredGuids); + return new PrefabTypePreviewGenerator(settings); + } + + private ITypePreviewGenerator CreateTexturePreviewGenerator(string[] ignoredGuids) + { + var settings = new TextureTypeGeneratorSettings() + { + MaxWidth = _customSettings.Width, + MaxHeight = _customSettings.Height, + InputPaths = _customSettings.InputPaths, + OutputPath = _customSettings.OutputPath, + Format = _customSettings.Format, + PreviewFileNamingFormat = _customSettings.PreviewFileNamingFormat, + IgnoredGuids = ignoredGuids + }; + + return new TextureTypePreviewGenerator(settings); + } + + private TypePreviewGeneratorFromSceneSettings CreateSceneGeneratorSettings(ISceneScreenshotter screenshotter, string[] ignoredGuids) + { + var settings = new TypePreviewGeneratorFromSceneSettings() + { + InputPaths = _customSettings.InputPaths, + OutputPath = _customSettings.OutputPath, + PreviewFileNamingFormat = _customSettings.PreviewFileNamingFormat, + Screenshotter = screenshotter, + IgnoredGuids = ignoredGuids + }; + + return settings; + } + + private SceneScreenshotterSettings CreateScreenshotterSettings() + { + var settings = new SceneScreenshotterSettings() + { + Width = _customSettings.Width, + Height = _customSettings.Height, + Depth = _customSettings.Depth, + Format = _customSettings.Format, + NativeWidth = _customSettings.NativeWidth, + NativeHeight = _customSettings.NativeHeight, + }; + + return settings; + } + + private void ReportProgress(int currentGenerator, int totalGenerators, int currentGeneratorAsset, int totalCurrentGeneratorAssets) + { + var completedGeneratorProgress = (float)currentGenerator / totalGenerators; + var currentGeneratorProgress = ((float)currentGeneratorAsset / totalCurrentGeneratorAssets) / totalGenerators; + var progressToReport = completedGeneratorProgress + currentGeneratorProgress; + OnProgressChanged?.Invoke(progressToReport); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs.meta new file mode 100644 index 00000000..4b18db3b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e5906f8cb3e4eec489a2f7a82844bb3f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/CustomPreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs new file mode 100644 index 00000000..b548bafb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs @@ -0,0 +1,15 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Threading.Tasks; + +namespace AssetStoreTools.Previews.Generators +{ + internal interface IPreviewGenerator + { + PreviewGenerationSettings Settings { get; } + + event Action OnProgressChanged; + + Task Generate(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs.meta new file mode 100644 index 00000000..c7178a8d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ebddaccb94ca6e34aa36b535d0a47249 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/IPreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs new file mode 100644 index 00000000..760e2d14 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs @@ -0,0 +1,362 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; +using UnityEngine.Tilemaps; + +namespace AssetStoreTools.Previews.Generators +{ + internal class NativePreviewGenerator : PreviewGeneratorBase + { + private const double InitialPreviewLoadingTimeoutSeconds = 10; + + private NativePreviewGenerationSettings _nativeSettings; + + private RenderTexture _renderTexture; + + private int _generatedPreviewsCount; + private int _totalPreviewsCount; + + public override event Action OnProgressChanged; + + public NativePreviewGenerator(NativePreviewGenerationSettings settings) + : base(settings) + { + _nativeSettings = settings; + } + + protected override void Validate() + { + base.Validate(); + + if (_nativeSettings.ChunkSize <= 0) + throw new ArgumentException("Chunk size must be larger than 0"); + } + + protected override async Task GenerateImpl() + { + var result = new PreviewGenerationResult() + { + GenerationType = _nativeSettings.GenerationType + }; + + OnProgressChanged?.Invoke(0f); + + try + { + var objects = GetObjectsRequiringPreviews(_nativeSettings.InputPaths); + var filteredObjects = new List(); + var reusedPreviews = new List(); + FilterObjects(objects, filteredObjects, reusedPreviews); + + _generatedPreviewsCount = 0; + _totalPreviewsCount = objects.Count; + + Directory.CreateDirectory(_nativeSettings.OutputPath); + + var generatedPreviews = new List(); + if (!_nativeSettings.WaitForPreviews) + { + WritePreviewsWithoutWaiting(filteredObjects, out generatedPreviews); + } + else + { + if (_nativeSettings.ChunkedPreviewLoading) + { + await WaitAndWritePreviewsChunked(filteredObjects, generatedPreviews); + } + else + { + await WaitAndWritePreviews(filteredObjects, generatedPreviews); + } + } + + var allPreviews = new List(); + allPreviews.AddRange(generatedPreviews); + allPreviews.AddRange(reusedPreviews); + + result.Success = true; + result.GeneratedPreviews = generatedPreviews; + result.Previews = allPreviews; + } + catch (Exception e) + { + result.Success = false; + result.Exception = e; + } + + return result; + } + + private List GetObjectsRequiringPreviews(string[] inputPaths) + { + var objects = new List(); + var guids = AssetDatabase.FindAssets("", inputPaths); + + foreach (var guid in guids) + { + if (objects.Any(x => x.Guid == guid)) + continue; + + var assetPath = AssetDatabase.GUIDToAssetPath(guid); + var obj = AssetDatabase.LoadAssetAtPath(assetPath); + if (!ShouldHavePreview(obj)) + continue; + + objects.Add(new PreviewMetadata() { Type = GenerationType.Native, Guid = guid }); + } + + return objects; + } + + private void FilterObjects(List objects, List filteredObjects, List reusedPreviews) + { + if (Settings.OverwriteExisting || !CachingService.GetCachedMetadata(out var database)) + { + filteredObjects.AddRange(objects); + return; + } + + foreach (var obj in objects) + { + var matchingEntry = database.Previews.FirstOrDefault(x => + x.Guid == obj.Guid + && x.Type == GenerationType.Native + && x.Exists()); + + if (matchingEntry == null) + { + filteredObjects.Add(obj); + } + else + { + reusedPreviews.Add(matchingEntry); + } + } + } + + private bool ShouldHavePreview(UnityEngine.Object asset) + { + if (asset == null) + return false; + + if (!AssetDatabase.IsMainAsset(asset)) + return false; + + switch (asset) + { + case AudioClip _: + case Material _: + case Mesh _: + case TerrainLayer _: + case Texture _: + case Tile _: + return true; + case GameObject go: + var renderers = go.GetComponentsInChildren(); + return renderers != null && renderers.Length > 0; + default: + return false; + } + } + + private PreviewMetadata WritePreviewToDisk(PreviewMetadata metadata, Texture2D texture) + { + var asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(metadata.Guid)); + var width = Mathf.Min(texture.width, 128); + var height = Mathf.Min(texture.height, 128); + var readableTexture = GraphicsUtility.ResizeTexture(texture, width, height); + var fileName = PreviewConvertUtility.ConvertFilenameWithExtension(asset, _nativeSettings.PreviewFileNamingFormat, _nativeSettings.Format); + var filePath = $"{_nativeSettings.OutputPath}/{fileName}"; + var bytes = PreviewConvertUtility.ConvertTexture(readableTexture, _nativeSettings.Format); + + File.WriteAllBytes(filePath, bytes); + + metadata.Type = GenerationType.Native; + metadata.Name = asset.name; + metadata.Path = filePath; + + return metadata; + } + + private void WritePreviewsWithoutWaiting(List objects, out List generatedPreviews) + { + generatedPreviews = new List(); + + foreach (var obj in objects) + { + var texture = GetAssetPreviewFromGuid(obj.Guid); + if (texture == null) + continue; + + var generatedPreview = WritePreviewToDisk(obj, texture); + generatedPreviews.Add(generatedPreview); + } + } + + private Texture2D GetAssetPreviewFromGuid(string guid) + { + var method = typeof(AssetPreview).GetMethod("GetAssetPreviewFromGUID", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(string) }, null); + var args = new object[] { guid }; + + return method?.Invoke(null, args) as Texture2D; + } + + private async Task WaitAndWritePreviewsChunked(List objects, List generatedPreviews) + { + var chunks = objects.Count / _nativeSettings.ChunkSize; + var remainder = objects.Count % _nativeSettings.ChunkSize; + if (remainder != 0) + chunks += 1; + + for (int i = 0; i < chunks; i++) + { + var chunkObjects = new List(); + + for (int j = 0; j < _nativeSettings.ChunkSize; j++) + { + var index = i * _nativeSettings.ChunkSize + j; + if (index == objects.Count) + break; + + chunkObjects.Add(objects[index]); + } + + var generatedPreviewsChunk = new List(); + await WaitAndWritePreviews(chunkObjects, generatedPreviewsChunk); + generatedPreviews.AddRange(generatedPreviewsChunk); + } + } + + private async Task WaitAndWritePreviews(List objects, List generatedPreviews) + { + var initialObjectCount = objects.Count(); + if (initialObjectCount == 0) + return; + + await WaitAndWritePreviewIteration(objects, generatedPreviews); + var remainingObjectCount = objects.Count; + + // First iteration may take longer to start loading objects + var firstIterationStartTime = EditorApplication.timeSinceStartup; + while (true) + { + if (remainingObjectCount < initialObjectCount) + break; + + if (EditorApplication.timeSinceStartup - firstIterationStartTime > InitialPreviewLoadingTimeoutSeconds) + throw new Exception("Preview loading timed out."); + + await WaitAndWritePreviewIteration(objects, generatedPreviews); + remainingObjectCount = objects.Count; + } + + if (remainingObjectCount == 0) + return; + + while (true) + { + await WaitForEndOfFrame(1); + await WaitAndWritePreviewIteration(objects, generatedPreviews); + + // If no more previews are being loaded, try one more time before quitting + if (objects.Count == remainingObjectCount) + { + await WaitForEndOfFrame(1); + await WaitAndWritePreviewIteration(objects, generatedPreviews); + + if (objects.Count == remainingObjectCount) + { + var missingObjects = string.Join("\n", objects.Select(x => AssetDatabase.GUIDToAssetPath(x.Guid))); + Debug.LogWarning($"Unity Editor failed to fetch previews for {objects.Count} objects:\n{missingObjects}"); + break; + } + } + + remainingObjectCount = objects.Count; + + // Exit when all previews are loaded + if (remainingObjectCount == 0) + break; + } + } + + private async Task WaitAndWritePreviewIteration(List objects, List generatedPreviews) + { + var cacheSize = Mathf.Max(_nativeSettings.ChunkSize * 2, objects.Count() + _nativeSettings.ChunkSize); + AssetPreview.SetPreviewTextureCacheSize(cacheSize); + + // Initial queueing + foreach (var obj in objects) + { + var asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(obj.Guid)); + AssetPreview.GetAssetPreview(asset); + } + + await WaitForEndOfFrame(); + + // Waiting (NOTE: works inconsistently across Unity streams) + foreach (var obj in objects) + { + var asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(obj.Guid)); + if (AssetPreview.IsLoadingAssetPreview(asset.GetInstanceID())) + { + await WaitForEndOfFrame(); + } + } + + // Writing + for (int i = 0; i < objects.Count; i++) + { + var obj = objects[i]; + + var asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(obj.Guid)); + var texture = AssetPreview.GetAssetPreview(asset); + if (texture == null) + continue; + + WritePreviewToDisk(obj, texture); + generatedPreviews.Add(obj); + _generatedPreviewsCount++; + OnProgressChanged?.Invoke((float)_generatedPreviewsCount / _totalPreviewsCount); + } + + // Removing written objects from the list + for (int i = objects.Count - 1; i >= 0; i--) + { + if (objects[i].Exists()) + objects.RemoveAt(i); + } + } + + private async Task WaitForEndOfFrame(double atLeastSeconds) + { + var startTime = EditorApplication.timeSinceStartup; + while (EditorApplication.timeSinceStartup - startTime <= atLeastSeconds) + { + await WaitForEndOfFrame(); + } + } + + private async Task WaitForEndOfFrame() + { + var isNextFrame = false; + EditorApplication.CallbackFunction callback = null; + callback = () => + { + EditorApplication.update -= callback; + isNextFrame = true; + }; + + EditorApplication.update += callback; + while (!isNextFrame) + await Task.Yield(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs.meta new file mode 100644 index 00000000..0d6454db --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: dd6eeb2f97a2ed34db51ab5ac0b3ffa1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/NativePreviewGenerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs new file mode 100644 index 00000000..02d779d3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs @@ -0,0 +1,45 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Services; +using System; +using System.Threading.Tasks; + +namespace AssetStoreTools.Previews.Generators +{ + internal abstract class PreviewGeneratorBase : IPreviewGenerator + { + public PreviewGenerationSettings Settings { get; } + protected ICachingService CachingService; + + public abstract event Action OnProgressChanged; + + public PreviewGeneratorBase(PreviewGenerationSettings settings) + { + Settings = settings; + CachingService = PreviewServiceProvider.Instance.GetService(); + } + + public async Task Generate() + { + Validate(); + + var result = await GenerateImpl(); + if (result.Success) + { + CachingService.CacheMetadata(result.GeneratedPreviews); + } + + return result; + } + + protected virtual void Validate() + { + if (Settings.InputPaths == null || Settings.InputPaths.Length == 0) + throw new ArgumentException("Input paths cannot be null"); + + if (string.IsNullOrEmpty(Settings.OutputPath)) + throw new ArgumentException("Output path cannot be null"); + } + + protected abstract Task GenerateImpl(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs.meta new file mode 100644 index 00000000..36e64a20 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cedf01448e0edcc4fb55f19f2e92b740 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Generators/PreviewGeneratorBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services.meta new file mode 100644 index 00000000..55ebe0c7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa18c820f185bfc4d8cd59e3418e2c4e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching.meta new file mode 100644 index 00000000..449835ad --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eb61a60f2ff91a448a7808ef2a25f871 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs new file mode 100644 index 00000000..10bb448e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs @@ -0,0 +1,87 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Utility; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace AssetStoreTools.Previews.Services +{ + internal class CachingService : ICachingService + { + public void CacheMetadata(IEnumerable previews) + { + var updatedDatabase = UpdatePreviewDatabase(previews); + + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = PreviewDatabaseContractResolver.Instance, + Converters = new List() { new StringEnumConverter() }, + Formatting = Formatting.Indented + }; + + CacheUtil.CreateFileInTempCache(Constants.Previews.PreviewDatabaseFile, JsonConvert.SerializeObject(updatedDatabase, serializerSettings), true); + } + + public bool GetCachedMetadata(out PreviewDatabase previewDatabase) + { + previewDatabase = null; + if (!CacheUtil.GetFileFromTempCache(Constants.Previews.PreviewDatabaseFile, out string filePath)) + return false; + + try + { + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = PreviewDatabaseContractResolver.Instance, + Converters = new List() { new StringEnumConverter() } + }; + + previewDatabase = JsonConvert.DeserializeObject(File.ReadAllText(filePath, Encoding.UTF8), serializerSettings); + return true; + } + catch + { + return false; + } + } + + private PreviewDatabase UpdatePreviewDatabase(IEnumerable previews) + { + PreviewDatabase database; + if (!GetCachedMetadata(out database)) + database = new PreviewDatabase(); + + // Delete missing previews + for (int i = database.Previews.Count - 1; i >= 0; i--) + { + if (database.Previews[i].Exists()) + continue; + + database.Previews.RemoveAt(i); + } + + // Append new previews & Replace existing previews + foreach (var preview in previews) + { + var matchingPreviews = database.Previews.Where(x => x.Guid == preview.Guid).ToList(); + foreach (var matchingPreview in matchingPreviews) + { + // Delete previously generated preview of the same type + if (matchingPreview.Type == preview.Type) + database.Previews.Remove(matchingPreview); + // Delete previously generated preview of a different type if the path matches + else if (matchingPreview.Path.Equals(preview.Path)) + database.Previews.Remove(matchingPreview); + } + + database.Previews.Add(preview); + } + + database.Previews = database.Previews.OrderBy(x => x.Guid).ThenBy(x => x.Type).ToList(); + return database; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs.meta new file mode 100644 index 00000000..ef9417ed --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e0b6cf909c8798b4590744959571a21f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/CachingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs new file mode 100644 index 00000000..67130008 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs @@ -0,0 +1,11 @@ +using AssetStoreTools.Previews.Data; +using System.Collections.Generic; + +namespace AssetStoreTools.Previews.Services +{ + internal interface ICachingService : IPreviewService + { + void CacheMetadata(IEnumerable previews); + bool GetCachedMetadata(out PreviewDatabase previewDatabase); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs.meta new file mode 100644 index 00000000..50b3339d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: eeaeae010299dcd489adb00dbf51b274 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/Caching/ICachingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs new file mode 100644 index 00000000..0bc56aeb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs @@ -0,0 +1,4 @@ +namespace AssetStoreTools.Previews.Services +{ + public interface IPreviewService { } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs.meta new file mode 100644 index 00000000..28043dcb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8c2761fe05638644d8e3a265865beef8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/IPreviewService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs new file mode 100644 index 00000000..7b2754be --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs @@ -0,0 +1,17 @@ +using AssetStoreTools.Utility; + +namespace AssetStoreTools.Previews.Services +{ + internal class PreviewServiceProvider : ServiceProvider + { + public static PreviewServiceProvider Instance => _instance ?? (_instance = new PreviewServiceProvider()); + private static PreviewServiceProvider _instance; + + private PreviewServiceProvider() { } + + protected override void RegisterServices() + { + Register(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs.meta new file mode 100644 index 00000000..0f5345ee --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a19bf5a4e3e441047bbc1b894e2a1149 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Services/PreviewServiceProvider.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI.meta new file mode 100644 index 00000000..67d04e3c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4738f3648c8368244a968bc840c1152b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data.meta new file mode 100644 index 00000000..b302df52 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 23a2f4eadd444194a91ff4ce509e4798 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs new file mode 100644 index 00000000..1b2fee97 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs @@ -0,0 +1,56 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.IO; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.UI.Data +{ + internal class AssetPreview : IAssetPreview + { + private PreviewMetadata _metadata; + + private UnityEngine.Object _cachedAsset; + private string _cachedAssetPath; + private Texture2D _cachedTexture; + + public UnityEngine.Object Asset => _cachedAsset ?? (_cachedAsset = AssetDatabase.LoadAssetAtPath(AssetPath)); + public string AssetPath => _cachedAssetPath ?? (_cachedAssetPath = AssetDatabase.GUIDToAssetPath(_metadata.Guid)); + + public AssetPreview(PreviewMetadata metadata) + { + _metadata = metadata; + } + + public string GetAssetPath() + { + var assetPath = AssetDatabase.GUIDToAssetPath(_metadata.Guid); + return assetPath; + } + + public async Task LoadImage(Action onSuccess) + { + if (_cachedTexture == null) + { + if (!_metadata.Exists()) + return; + + await Task.Yield(); + + try + { + _cachedTexture = new Texture2D(1, 1); + _cachedTexture.LoadImage(File.ReadAllBytes(_metadata.Path)); + } + catch (Exception e) + { + Debug.LogException(e); + return; + } + } + + onSuccess?.Invoke(_cachedTexture); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs.meta new file mode 100644 index 00000000..9764acf5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 739cf05c689204f4089fd0a6bddb8c3b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreview.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs new file mode 100644 index 00000000..40db2b62 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs @@ -0,0 +1,46 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Previews.UI.Data +{ + internal class AssetPreviewCollection : IAssetPreviewCollection + { + private GenerationType _generationType; + private List _images; + + public event Action OnCollectionChanged; + + public AssetPreviewCollection() + { + _images = new List(); + } + + public GenerationType GetGenerationType() + { + return _generationType; + } + + public IEnumerable GetPreviews() + { + return _images; + } + + public void Refresh(GenerationType generationType, IEnumerable previews) + { + _images.Clear(); + + _generationType = generationType; + + foreach (var entry in previews) + { + if (!entry.Exists()) + continue; + + _images.Add(new AssetPreview(entry)); + } + + OnCollectionChanged?.Invoke(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs.meta new file mode 100644 index 00000000..319746ac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9b1a0db8710933048b49dcca463fb8fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/AssetPreviewCollection.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs new file mode 100644 index 00000000..f7fc7508 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; +using UnityEngine; + +namespace AssetStoreTools.Previews.UI.Data +{ + internal interface IAssetPreview + { + UnityEngine.Object Asset { get; } + string GetAssetPath(); + Task LoadImage(Action onSuccess); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs.meta new file mode 100644 index 00000000..3bf6b869 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0f9373dfc16d0fa4794dac29b75204ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreview.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs new file mode 100644 index 00000000..6e614c68 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs @@ -0,0 +1,15 @@ +using AssetStoreTools.Previews.Data; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Previews.UI.Data +{ + internal interface IAssetPreviewCollection + { + event Action OnCollectionChanged; + + GenerationType GetGenerationType(); + IEnumerable GetPreviews(); + void Refresh(GenerationType generationType, IEnumerable previews); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs.meta new file mode 100644 index 00000000..60da0185 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: fc9d9abd80c070f44ac49d5ce23d2fc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IAssetPreviewCollection.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs new file mode 100644 index 00000000..51f626c9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs @@ -0,0 +1,27 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Generators; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Previews.UI.Data +{ + internal interface IPreviewGeneratorSettings + { + event Action OnGenerationTypeChanged; + event Action OnGenerationPathsChanged; + + void LoadSettings(PreviewGenerationSettings settings); + + GenerationType GetGenerationType(); + void SetGenerationType(GenerationType type); + List GetAvailableGenerationTypes(); + + List GetGenerationPaths(); + void AddGenerationPath(string path); + void RemoveGenerationPath(string path); + void ClearGenerationPaths(); + bool IsGenerationPathValid(string path, out string error); + + IPreviewGenerator CreateGenerator(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs.meta new file mode 100644 index 00000000..e3ecce75 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 55c9fcde15f06754588fd02fb8b99a60 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/IPreviewGeneratorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs new file mode 100644 index 00000000..86962e41 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs @@ -0,0 +1,212 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Generators; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Previews.UI.Data +{ + internal class PreviewGeneratorSettings : IPreviewGeneratorSettings + { + private readonly GenerationType[] _availableGenerationTypes = new GenerationType[] + { + GenerationType.Native, + GenerationType.Custom + }; + + private List _inputPaths; + private GenerationType _generationType; + + public event Action OnGenerationTypeChanged; + public event Action OnGenerationPathsChanged; + + public PreviewGeneratorSettings() + { + _inputPaths = new List(); + _generationType = GenerationType.Native; + } + + public void LoadSettings(PreviewGenerationSettings settings) + { + if (settings == null) + return; + + _inputPaths = settings.InputPaths.ToList(); + OnGenerationPathsChanged?.Invoke(); + + switch (settings) + { + case NativePreviewGenerationSettings _: + _generationType = GenerationType.Native; + break; + case CustomPreviewGenerationSettings _: + _generationType = GenerationType.Custom; + break; + default: + return; + } + + OnGenerationTypeChanged?.Invoke(); + } + + public GenerationType GetGenerationType() + { + return _generationType; + } + + public void SetGenerationType(GenerationType type) + { + _generationType = type; + OnGenerationTypeChanged?.Invoke(); + } + + public List GetAvailableGenerationTypes() + { + return _availableGenerationTypes.ToList(); + } + + public List GetGenerationPaths() + { + return _inputPaths; + } + + public void AddGenerationPath(string path) + { + if (string.IsNullOrEmpty(path)) + return; + + if (_inputPaths.Contains(path)) + return; + + // Prevent redundancy for new paths + var existingPath = _inputPaths.FirstOrDefault(x => path.StartsWith(x + "/")); + if (existingPath != null) + { + Debug.LogWarning($"Path '{path}' is already included with existing path: '{existingPath}'"); + return; + } + + // Prevent redundancy for already added paths + var redundantPaths = _inputPaths.Where(x => x.StartsWith(path + "/")).ToArray(); + foreach (var redundantPath in redundantPaths) + { + Debug.LogWarning($"Existing validation path '{redundantPath}' has been made redundant by the inclusion of new validation path: '{path}'"); + _inputPaths.Remove(redundantPath); + } + + _inputPaths.Add(path); + + OnGenerationPathsChanged?.Invoke(); + } + + public void RemoveGenerationPath(string path) + { + if (!_inputPaths.Contains(path)) + return; + + _inputPaths.Remove(path); + + OnGenerationPathsChanged?.Invoke(); + } + + public void ClearGenerationPaths() + { + if (_inputPaths.Count == 0) + return; + + _inputPaths.Clear(); + + OnGenerationPathsChanged?.Invoke(); + } + + public bool IsGenerationPathValid(string path, out string error) + { + error = string.Empty; + + if (string.IsNullOrEmpty(path)) + { + error = "Path cannot be empty"; + return false; + } + + var isAssetsPath = path.StartsWith("Assets/") + || path.Equals("Assets"); + var isPackagePath = PackageUtility.GetPackageByManifestPath($"{path}/package.json", out _); + + if (!isAssetsPath && !isPackagePath) + { + error = "Selected path must be within the Assets folder or point to a root path of a package"; + return false; + } + + if (!Directory.Exists(path)) + { + error = "Path does not exist"; + return false; + } + + if (path.Split('/').Any(x => x.StartsWith(".") || x.EndsWith("~"))) + { + error = $"Path '{path}' cannot be selected as it is a hidden folder and not part of the Asset Database"; + return false; + } + + return true; + } + + public IPreviewGenerator CreateGenerator() + { + switch (_generationType) + { + case GenerationType.Native: + return CreateNativeGenerator(); + case GenerationType.Custom: + return CreateCustomGenerator(); + default: + throw new NotImplementedException("Undefined generator type"); + } + } + + private IPreviewGenerator CreateNativeGenerator() + { + var settings = new NativePreviewGenerationSettings() + { + InputPaths = _inputPaths.ToArray(), + OutputPath = Constants.Previews.Native.DefaultOutputPath, + PreviewFileNamingFormat = Constants.Previews.DefaultFileNameFormat, + Format = Constants.Previews.Native.DefaultFormat, + WaitForPreviews = Constants.Previews.Native.DefaultWaitForPreviews, + ChunkedPreviewLoading = Constants.Previews.Native.DefaultChunkedPreviewLoading, + ChunkSize = Constants.Previews.Native.DefaultChunkSize, + OverwriteExisting = true + }; + + return new NativePreviewGenerator(settings); + } + + private IPreviewGenerator CreateCustomGenerator() + { + var settings = new CustomPreviewGenerationSettings() + { + InputPaths = _inputPaths.ToArray(), + OutputPath = Constants.Previews.Custom.DefaultOutputPath, + Width = Constants.Previews.Custom.DefaultWidth, + Height = Constants.Previews.Custom.DefaultHeight, + Depth = Constants.Previews.Custom.DefaultDepth, + NativeWidth = Constants.Previews.Custom.DefaultNativeWidth, + NativeHeight = Constants.Previews.Custom.DefaultNativeHeight, + PreviewFileNamingFormat = Constants.Previews.DefaultFileNameFormat, + Format = Constants.Previews.Custom.DefaultFormat, + AudioSampleColor = Constants.Previews.Custom.DefaultAudioSampleColor, + AudioBackgroundColor = Constants.Previews.Custom.DefaultAudioBackgroundColor, + OverwriteExisting = true + }; + + var generator = new CustomPreviewGenerator(settings); + return generator; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs.meta new file mode 100644 index 00000000..b57c82ab --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9e6f754b1179d8d4cb40f62692619a63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Data/PreviewGeneratorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements.meta new file mode 100644 index 00000000..d81acd59 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 700ec0107b011824892281e880281bb1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs new file mode 100644 index 00000000..aee6fa8a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs @@ -0,0 +1,83 @@ +using AssetStoreTools.Previews.UI.Data; +using System.Linq; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Elements +{ + internal class AssetPreviewElement : VisualElement + { + // Data + private IAssetPreview _assetPreview; + + // UI + private Image _image; + private Label _label; + + public AssetPreviewElement() + { + AddToClassList("preview-list-image"); + + Create(); + + RegisterCallback(OnImageClicked); + } + + private void Create() + { + CreateFiller(); + CreateImage(); + CreateLabel(); + } + + private void CreateImage() + { + _image = new Image(); + Add(_image); + } + + private void CreateFiller() + { + var filler = new VisualElement() { name = "Filler" }; + Add(filler); + } + + private void CreateLabel() + { + _label = new Label(); + Add(_label); + } + + private void SetImage(Texture2D texture) + { + _image.style.width = texture.width < 128 ? texture.width : 128; + _image.style.height = texture.height < 128 ? texture.height : 128; + _image.style.backgroundImage = texture; + } + + private void OnImageClicked(MouseDownEvent _) + { + EditorGUIUtility.PingObject(_assetPreview.Asset); + } + + public void SetSource(IAssetPreview assetPreview) + { + _assetPreview = assetPreview; + _assetPreview.LoadImage(SetImage); + + var assetPath = _assetPreview.GetAssetPath(); + + if (string.IsNullOrEmpty(assetPath)) + { + _label.text = "[Missing]"; + tooltip = "This asset has been deleted"; + return; + } + + var assetNameWithExtension = assetPath.Split('/').Last(); + _label.text = assetNameWithExtension; + tooltip = assetPath; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs.meta new file mode 100644 index 00000000..fec756c2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 28891b8cff841a44eb508494d62c190c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/AssetPreviewElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs new file mode 100644 index 00000000..a1bf53a0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Elements +{ + internal class GridListElement : VisualElement + { + public int ElementWidth; + public int ElementHeight; + private int _visibilityHeadroom => ElementHeight; + + public IList ItemSource; + public Func MakeItem; + public Action BindItem; + + private ScrollView _scrollView; + + public GridListElement() + { + style.flexGrow = 1; + + Create(); + + _scrollView.contentViewport.RegisterCallback(OnGeometryChanged); + _scrollView.verticalScroller.valueChanged += OnVerticalScroll; +#if UNITY_2021_1_OR_NEWER + _scrollView.horizontalScrollerVisibility = ScrollerVisibility.Hidden; +#else + _scrollView.showHorizontal = false; +#endif + } + + private void Create() + { + _scrollView = new ScrollView(); + Add(_scrollView); + } + + private void OnGeometryChanged(GeometryChangedEvent evt) + { + Redraw(); + } + + private void OnVerticalScroll(float value) + { + Redraw(); + } + + public void Redraw() + { + if (ElementWidth == 0 + || ElementHeight == 0 + || ItemSource == null + || MakeItem == null + || BindItem == null) + return; + + _scrollView.Clear(); + + var rowCapacity = Mathf.FloorToInt(_scrollView.contentContainer.worldBound.width / ElementWidth); + if (rowCapacity == 0) + rowCapacity = 1; + + var totalRequiredRows = ItemSource.Count / rowCapacity; + if (ItemSource.Count % rowCapacity != 0) + totalRequiredRows++; + + _scrollView.contentContainer.style.height = totalRequiredRows * ElementHeight; + + var visibleRows = new List(); + for (int i = 0; i < totalRequiredRows; i++) + { + var visible = IsRowVisible(i); + if (!visible) + continue; + + var rowElement = CreateRow(i); + + for (int j = 0; j < rowCapacity; j++) + { + var elementIndex = i * rowCapacity + j; + if (elementIndex >= ItemSource.Count) + { + rowElement.Add(CreateFillerElement()); + continue; + } + + var element = MakeItem?.Invoke(); + BindItem?.Invoke(element, elementIndex); + + rowElement.Add(element); + } + + _scrollView.Add(rowElement); + } + } + + private bool IsRowVisible(int rowIndex) + { + var contentStartY = _scrollView.contentContainer.worldBound.yMin; + var visibleContentMinY = _scrollView.contentViewport.worldBound.yMin - _visibilityHeadroom; + var visibleContentMaxY = _scrollView.contentViewport.worldBound.yMax + _visibilityHeadroom; + if (_scrollView.contentViewport.worldBound.height == 0) + visibleContentMaxY = this.worldBound.yMax; + + var rowMinY = (rowIndex * ElementHeight) + contentStartY; + var rowMaxY = (rowIndex * ElementHeight) + ElementHeight + contentStartY; + + var fullyVisible = rowMinY >= visibleContentMinY && rowMaxY <= visibleContentMaxY; + var partiallyAbove = rowMinY < visibleContentMinY && rowMaxY > visibleContentMinY; + var partiallyBelow = rowMaxY > visibleContentMaxY && rowMinY < visibleContentMaxY; + + return fullyVisible || partiallyAbove || partiallyBelow; + } + + private VisualElement CreateRow(int rowIndex) + { + var rowElement = new VisualElement() { name = $"Row {rowIndex}" }; + rowElement.style.flexDirection = FlexDirection.Row; + rowElement.style.position = Position.Absolute; + rowElement.style.top = ElementHeight * rowIndex; + rowElement.style.width = _scrollView.contentViewport.worldBound.width; + rowElement.style.justifyContent = Justify.SpaceAround; + + return rowElement; + } + + private VisualElement CreateFillerElement() + { + var element = new VisualElement(); + element.style.width = ElementWidth; + element.style.height = ElementHeight; + + return element; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs.meta new file mode 100644 index 00000000..a439c553 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 81d9f779e8c2a464cbdc1e39a4864803 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/GridListElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs new file mode 100644 index 00000000..28a35b18 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs @@ -0,0 +1,116 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.UI.Data; +using System.Linq; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.SceneManagement; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Elements +{ + internal class PreviewCollectionElement : VisualElement + { + // Data + private IAssetPreviewCollection _collection; + + // UI + private Label _previewCountLabel; + private GridListElement _gridListElement; + + public PreviewCollectionElement(IAssetPreviewCollection collection) + { + AddToClassList("preview-list"); + + _collection = collection; + _collection.OnCollectionChanged += RefreshList; + + Create(); + RefreshList(); + + SubscribeToSceneChanges(); + } + + private void Create() + { + CreateLabel(); + CreateGridListElement(); + } + + private void CreateLabel() + { + _previewCountLabel = new Label(); + _previewCountLabel.style.display = DisplayStyle.None; + Add(_previewCountLabel); + } + + private void CreateGridListElement() + { + _gridListElement = new GridListElement(); + _gridListElement.MakeItem = CreatePreview; + _gridListElement.BindItem = BindPreview; + _gridListElement.ElementWidth = 140 + 10; // Accounting for margin style + _gridListElement.ElementHeight = 160 + 10; // Accounting for margin style + Add(_gridListElement); + } + + private VisualElement CreatePreview() + { + var preview = new AssetPreviewElement(); + return preview; + } + + private void BindPreview(VisualElement element, int index) + { + var previewElement = (AssetPreviewElement)element; + var preview = _collection.GetPreviews().ToList()[index]; + previewElement.SetSource(preview); + } + + private void RefreshList() + { + var type = _collection.GetGenerationType(); + var items = _collection.GetPreviews().ToList(); + _previewCountLabel.text = $"Displaying {items.Count} {ConvertGenerationTypeName(type)} previews"; + _previewCountLabel.style.display = DisplayStyle.Flex; + _previewCountLabel.style.alignSelf = Align.Center; + _previewCountLabel.style.marginBottom = 10; + _previewCountLabel.style.unityFontStyleAndWeight = FontStyle.Bold; + + _gridListElement.ItemSource = items; + _gridListElement.Redraw(); + } + + private string ConvertGenerationTypeName(GenerationType type) + { + switch (type) + { + case GenerationType.Custom: + return "high resolution"; + default: + return type.ToString().ToLower(); + } + } + + private void SubscribeToSceneChanges() + { + var windowToSubscribeTo = Resources.FindObjectsOfTypeAll().FirstOrDefault(); + UnityAction sceneChanged = null; + sceneChanged = new UnityAction((_, __) => RefreshObjects(windowToSubscribeTo)); + EditorSceneManager.activeSceneChangedInEditMode += sceneChanged; + + void RefreshObjects(PreviewGeneratorWindow subscribedWindow) + { + // Remove callback if preview generator window instance changed + var activeWindow = Resources.FindObjectsOfTypeAll().FirstOrDefault(); + if (subscribedWindow == null || subscribedWindow != activeWindow) + { + EditorSceneManager.activeSceneChangedInEditMode -= sceneChanged; + return; + } + + RefreshList(); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs.meta new file mode 100644 index 00000000..fc6e1c13 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 842a11e046ca5284d9de9f4a05b1fa26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewCollectionElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs new file mode 100644 index 00000000..3d2f9a86 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs @@ -0,0 +1,50 @@ +using AssetStoreTools.Previews.UI.Data; +using System; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Elements +{ + internal class PreviewGenerateButtonElement : VisualElement + { + // Data + private IPreviewGeneratorSettings _settings; + + // UI + private Button _generateButton; + + public event Action OnGenerate; + + public PreviewGenerateButtonElement(IPreviewGeneratorSettings settings) + { + _settings = settings; + _settings.OnGenerationPathsChanged += GenerationPathsChanged; + + Create(); + Deserialize(); + } + + private void Create() + { + _generateButton = new Button(Validate) { text = "Generate" }; + _generateButton.AddToClassList("preview-generate-button"); + + Add(_generateButton); + } + + private void Validate() + { + OnGenerate?.Invoke(); + } + + private void GenerationPathsChanged() + { + var inputPathsPresent = _settings.GetGenerationPaths().Count > 0; + _generateButton.SetEnabled(inputPathsPresent); + } + + private void Deserialize() + { + GenerationPathsChanged(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs.meta new file mode 100644 index 00000000..57303acd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 1c8fbb0b13ba7d3479c0867c440821e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGenerateButtonElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs new file mode 100644 index 00000000..cf724404 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs @@ -0,0 +1,122 @@ +using AssetStoreTools.Previews.UI.Data; +using AssetStoreTools.Utility; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class PreviewGeneratorPathsElement : VisualElement + { + // Data + private IPreviewGeneratorSettings _settings; + + // UI + private ScrollView _pathBoxScrollView; + + public PreviewGeneratorPathsElement(IPreviewGeneratorSettings settings) + { + AddToClassList("preview-paths"); + + _settings = settings; + _settings.OnGenerationPathsChanged += InputPathsChanged; + + Create(); + Deserialize(); + } + + private void Create() + { + var pathSelectionRow = new VisualElement(); + pathSelectionRow.AddToClassList("preview-settings-selection-row"); + + VisualElement labelHelpRow = new VisualElement(); + labelHelpRow.AddToClassList("preview-settings-selection-label-help-row"); + labelHelpRow.style.alignSelf = Align.FlexStart; + + Label pathLabel = new Label { text = "Input paths" }; + Image pathLabelTooltip = new Image + { + tooltip = "Select the folder (or multiple folders) to generate asset previews for." + }; + + labelHelpRow.Add(pathLabel); + labelHelpRow.Add(pathLabelTooltip); + + var fullPathBox = new VisualElement() { name = "PreviewPaths" }; + fullPathBox.AddToClassList("preview-paths-box"); + + _pathBoxScrollView = new ScrollView { name = "PreviewPathsScrollView" }; + _pathBoxScrollView.AddToClassList("preview-paths-scroll-view"); + + VisualElement scrollViewBottomRow = new VisualElement(); + scrollViewBottomRow.AddToClassList("preview-paths-scroll-view-bottom-row"); + + var addExtraPathsButton = new Button(BrowsePath) { text = "Add a path" }; + addExtraPathsButton.AddToClassList("preview-paths-add-button"); + scrollViewBottomRow.Add(addExtraPathsButton); + + fullPathBox.Add(_pathBoxScrollView); + fullPathBox.Add(scrollViewBottomRow); + + pathSelectionRow.Add(labelHelpRow); + pathSelectionRow.Add(fullPathBox); + + Add(pathSelectionRow); + } + + private VisualElement CreateSinglePathElement(string path) + { + var validationPath = new VisualElement(); + validationPath.AddToClassList("preview-paths-path-row"); + + var folderPathLabel = new Label(path); + folderPathLabel.AddToClassList("preview-paths-path-row-input-field"); + + var removeButton = new Button(() => + { + _settings.RemoveGenerationPath(path); + }); + removeButton.text = "X"; + removeButton.AddToClassList("preview-paths-path-row-remove-button"); + + validationPath.Add(folderPathLabel); + validationPath.Add(removeButton); + + return validationPath; + } + + private void BrowsePath() + { + string absolutePath = EditorUtility.OpenFolderPanel("Select a directory", "Assets", ""); + + if (string.IsNullOrEmpty(absolutePath)) + return; + + var relativePath = FileUtility.AbsolutePathToRelativePath(absolutePath, ASToolsPreferences.Instance.EnableSymlinkSupport); + + if (!_settings.IsGenerationPathValid(relativePath, out var error)) + { + EditorUtility.DisplayDialog("Invalid path", error, "OK"); + return; + } + + _settings.AddGenerationPath(relativePath); + } + + private void InputPathsChanged() + { + var inputPaths = _settings.GetGenerationPaths(); + + _pathBoxScrollView.Clear(); + foreach (var path in inputPaths) + { + _pathBoxScrollView.Add(CreateSinglePathElement(path)); + } + } + + private void Deserialize() + { + InputPathsChanged(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs.meta new file mode 100644 index 00000000..efdee4a2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cd3e3f7fbfc5f1e46835438be2756746 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorPathsElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs new file mode 100644 index 00000000..d5268f5e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs @@ -0,0 +1,99 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.UI.Data; +using AssetStoreTools.Validator.UI.Elements; +using UnityEditor.UIElements; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Elements +{ + internal class PreviewGeneratorSettingsElement : VisualElement + { + // Data + private IPreviewGeneratorSettings _settings; + + // UI + private PreviewGeneratorPathsElement _previewPathsElement; + private ToolbarMenu _generationTypeMenu; + + public PreviewGeneratorSettingsElement(IPreviewGeneratorSettings settings) + { + AddToClassList("preview-settings"); + + _settings = settings; + _settings.OnGenerationTypeChanged += GenerationTypeChanged; + + Create(); + Deserialize(); + } + + private void Create() + { + CreateGenerationType(); + CreateInputPathsElement(); + } + + private void CreateInputPathsElement() + { + _previewPathsElement = new PreviewGeneratorPathsElement(_settings); + Add(_previewPathsElement); + } + + private void CreateGenerationType() + { + var typeSelectionBox = new VisualElement(); + typeSelectionBox.AddToClassList("preview-settings-selection-row"); + + VisualElement labelHelpRow = new VisualElement(); + labelHelpRow.AddToClassList("preview-settings-selection-label-help-row"); + + Label generationTypeLabel = new Label { text = "Generation type" }; + Image categoryLabelTooltip = new Image + { + tooltip = "Choose the generation type for your previews.\n\n" + + "- Native: retrieve previews from the Asset Database which are generated by Unity Editor internally\n" + + "- High Resolution (experimental): generate previews using a custom implementation. Resulting previews are of higher resolution " + + "than those generated by Unity Editor. Note that they may look slightly different from native previews" + }; + + labelHelpRow.Add(generationTypeLabel); + labelHelpRow.Add(categoryLabelTooltip); + + _generationTypeMenu = new ToolbarMenu { name = "GenerationTypeMenu" }; + _generationTypeMenu.AddToClassList("preview-settings-selection-dropdown"); + + typeSelectionBox.Add(labelHelpRow); + typeSelectionBox.Add(_generationTypeMenu); + + // Append available categories + var types = _settings.GetAvailableGenerationTypes(); + foreach (var t in types) + { + _generationTypeMenu.menu.AppendAction(ConvertGenerationTypeName(t), _ => _settings.SetGenerationType(t)); + } + + Add(typeSelectionBox); + } + + private string ConvertGenerationTypeName(GenerationType type) + { + switch (type) + { + case GenerationType.Custom: + return "High Resolution (experimental)"; + default: + return type.ToString(); + } + } + + private void GenerationTypeChanged() + { + var t = _settings.GetGenerationType(); + _generationTypeMenu.text = ConvertGenerationTypeName(t); + } + + private void Deserialize() + { + GenerationTypeChanged(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs.meta new file mode 100644 index 00000000..acda521f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6f38de8a438b8c94a81fe5f2cc45c110 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewGeneratorSettingsElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs new file mode 100644 index 00000000..1306f05b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs @@ -0,0 +1,87 @@ +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Elements +{ + internal class PreviewWindowDescriptionElement : VisualElement + { + private const string DescriptionFoldoutText = "Generate and inspect asset preview images to be displayed in your package listing page on the Asset Store."; + private const string DescriptionFoldoutContentText = "Images generated in this window will be reused when exporting a package. Any missing images generated during the package export process will also appear here.\n\n" + + "Preview images are displayed on the Asset Store under the 'Package Content' section of the package listing. " + + "They are also displayed in the package importer window that appears during the package import process. " + + "Note that these images will not replace the images used for the assets in the Project window after the package gets imported."; + + private VisualElement _descriptionSimpleContainer; + private Button _showMoreButton; + + private VisualElement _descriptionFullContainer; + private Button _showLessButton; + + public PreviewWindowDescriptionElement() + { + AddToClassList("asset-preview-description"); + Create(); + } + + private void Create() + { + CreateSimpleDescription(); + CreateFullDescription(); + } + + private void CreateSimpleDescription() + { + _descriptionSimpleContainer = new VisualElement(); + _descriptionSimpleContainer.AddToClassList("asset-preview-description-simple-container"); + + var simpleDescription = new Label(DescriptionFoldoutText); + simpleDescription.AddToClassList("asset-preview-description-simple-label"); + + _showMoreButton = new Button(ToggleFullDescription) { text = "Show more..." }; + _showMoreButton.AddToClassList("asset-preview-description-hyperlink-button"); + _showMoreButton.AddToClassList("asset-preview-description-show-button"); + + _descriptionSimpleContainer.Add(simpleDescription); + _descriptionSimpleContainer.Add(_showMoreButton); + + Add(_descriptionSimpleContainer); + } + + private void CreateFullDescription() + { + _descriptionFullContainer = new VisualElement(); + _descriptionFullContainer.AddToClassList("asset-preview-description-full-container"); + + var validatorDescription = new Label() + { + text = DescriptionFoldoutContentText + }; + validatorDescription.AddToClassList("asset-preview-description-full-label"); + + _showLessButton = new Button(ToggleFullDescription) { text = "Show less..." }; + _showLessButton.AddToClassList("asset-preview-description-hide-button"); + _showLessButton.AddToClassList("asset-preview-description-hyperlink-button"); + + _descriptionFullContainer.Add(validatorDescription); + _descriptionFullContainer.Add(_showLessButton); + + _descriptionFullContainer.style.display = DisplayStyle.None; + Add(_descriptionFullContainer); + } + + private void ToggleFullDescription() + { + var displayFullDescription = _descriptionFullContainer.style.display == DisplayStyle.None; + + if (displayFullDescription) + { + _showMoreButton.style.display = DisplayStyle.None; + _descriptionFullContainer.style.display = DisplayStyle.Flex; + } + else + { + _showMoreButton.style.display = DisplayStyle.Flex; + _descriptionFullContainer.style.display = DisplayStyle.None; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs.meta new file mode 100644 index 00000000..5f0631e9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2cab289a87b0ba74f89cb458ff6d44f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Elements/PreviewWindowDescriptionElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs new file mode 100644 index 00000000..3a2d36f8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs @@ -0,0 +1,51 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Services; +using AssetStoreTools.Previews.UI.Views; +using AssetStoreTools.Utility; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI +{ + internal class PreviewGeneratorWindow : AssetStoreToolsWindow + { + protected override string WindowTitle => "Preview Generator"; + + private ICachingService _cachingService; + + private PreviewListView _previewListView; + + protected override void Init() + { + minSize = new Vector2(350, 350); + + this.SetAntiAliasing(4); + + VisualElement root = rootVisualElement; + + // Getting a reference to the USS Document and adding stylesheet to the root + root.styleSheets.Add(StyleSelector.PreviewGeneratorWindow.PreviewGeneratorWindowStyle); + root.styleSheets.Add(StyleSelector.PreviewGeneratorWindow.PreviewGeneratorWindowTheme); + + GetServices(); + ConstructWindow(); + } + + private void GetServices() + { + _cachingService = PreviewServiceProvider.Instance.GetService(); + } + + private void ConstructWindow() + { + _previewListView = new PreviewListView(_cachingService); + rootVisualElement.Add(_previewListView); + } + + public void Load(PreviewGenerationSettings settings) + { + _previewListView.LoadSettings(settings); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs.meta new file mode 100644 index 00000000..04e42023 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4cad15de2de8cdc46b48a4b05eac5d78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/PreviewGeneratorWindow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views.meta new file mode 100644 index 00000000..598279e5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e154861b0e2af64b93f6c831e6c0dc2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs new file mode 100644 index 00000000..36f52642 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs @@ -0,0 +1,142 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Services; +using AssetStoreTools.Previews.UI.Data; +using AssetStoreTools.Previews.UI.Elements; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Previews.UI.Views +{ + internal class PreviewListView : VisualElement + { + //Data + private PreviewDatabase _previewDatabase; + private IPreviewGeneratorSettings _previewGeneratorSettings; + private IAssetPreviewCollection _previewCollection; + + private ICachingService _cachingService; + + // UI + private PreviewWindowDescriptionElement _descriptionElement; + private PreviewGeneratorSettingsElement _settingsElement; + private PreviewGenerateButtonElement _generateButtonElement; + private PreviewCollectionElement _previewCollectionElement; + + public PreviewListView(ICachingService cachingService) + { + _cachingService = cachingService; + + _previewGeneratorSettings = new PreviewGeneratorSettings(); + _previewCollection = new AssetPreviewCollection(); + + _previewGeneratorSettings.OnGenerationTypeChanged += RefreshPreviewList; + _previewGeneratorSettings.OnGenerationPathsChanged += RefreshPreviewList; + + Create(); + RefreshPreviewList(); + } + + private void Create() + { + CreateDescription(); + CreateSettings(); + CreateGenerateButton(); + CreatePreviewList(); + } + + private void CreateDescription() + { + _descriptionElement = new PreviewWindowDescriptionElement(); + Add(_descriptionElement); + } + + private void CreateSettings() + { + _settingsElement = new PreviewGeneratorSettingsElement(_previewGeneratorSettings); + Add(_settingsElement); + } + + private void CreateGenerateButton() + { + _generateButtonElement = new PreviewGenerateButtonElement(_previewGeneratorSettings); + _generateButtonElement.OnGenerate += GeneratePreviews; + Add(_generateButtonElement); + } + + private void CreatePreviewList() + { + _previewCollectionElement = new PreviewCollectionElement(_previewCollection); + Add(_previewCollectionElement); + } + + private async void GeneratePreviews() + { + try + { + _settingsElement.SetEnabled(false); + _generateButtonElement.SetEnabled(false); + _previewCollectionElement.SetEnabled(false); + + var generator = _previewGeneratorSettings.CreateGenerator(); + generator.OnProgressChanged += DisplayProgress; + var result = await generator.Generate(); + generator.OnProgressChanged -= DisplayProgress; + + if (!result.Success) + { + EditorUtility.DisplayDialog("Error", result.Exception.Message, "OK"); + Debug.LogException(result.Exception); + return; + } + + RefreshPreviewList(); + } + finally + { + _settingsElement.SetEnabled(true); + _generateButtonElement.SetEnabled(true); + _previewCollectionElement.SetEnabled(true); + EditorUtility.ClearProgressBar(); + } + } + + private void DisplayProgress(float progress) + { + EditorUtility.DisplayProgressBar("Generating", "Generating previews...", progress); + } + + public void LoadSettings(PreviewGenerationSettings settings) + { + _previewGeneratorSettings.LoadSettings(settings); + } + + private void RefreshPreviewList() + { + if (!_cachingService.GetCachedMetadata(out _previewDatabase)) + _previewDatabase = new PreviewDatabase(); + + var paths = _previewGeneratorSettings.GetGenerationPaths(); + var guids = AssetDatabase.FindAssets("", paths.ToArray()); + var displayedPreviews = new List(); + + foreach (var entry in _previewDatabase.Previews) + { + if (!entry.Exists()) + continue; + + if (entry.Type != _previewGeneratorSettings.GetGenerationType()) + continue; + + if (!guids.Any(x => x == entry.Guid)) + continue; + + displayedPreviews.Add(entry); + } + + _previewCollection.Refresh(_previewGeneratorSettings.GetGenerationType(), displayedPreviews); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs.meta new file mode 100644 index 00000000..5c2a7161 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 94d417240bb510d469acb8a11f15b277 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/UI/Views/PreviewListView.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility.meta new file mode 100644 index 00000000..92fdd4fe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 99cf24252c136f246bfa4b02a69fe992 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs new file mode 100644 index 00000000..1a304f0a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs @@ -0,0 +1,96 @@ +using UnityEngine; + +namespace AssetStoreTools.Previews.Utility +{ + internal static class GraphicsUtility + { + public static Texture2D GetTextureFromCamera(Camera camera, int desiredWidth, int desiredHeight, int desiredDepth) + { + var texture = new Texture2D(desiredWidth, desiredHeight); + var originalRenderTexture = RenderTexture.active; + var renderTexture = RenderTexture.GetTemporary(desiredWidth, desiredHeight, desiredDepth); + var cameraInitiallyEnabled = camera.enabled; + + try + { + if (cameraInitiallyEnabled) + camera.enabled = false; + + camera.targetTexture = renderTexture; + camera.Render(); + + RenderTexture.active = renderTexture; + texture.ReadPixels(new Rect(0, 0, texture.width, texture.height), 0, 0); + texture.Apply(); + } + finally + { + camera.targetTexture = null; + RenderTexture.active = originalRenderTexture; + RenderTexture.ReleaseTemporary(renderTexture); + camera.enabled = cameraInitiallyEnabled; + } + + return texture; + } + + public static Texture2D ResizeTexture(Texture2D source, int desiredWidth, int desiredHeight) + { + var texture = new Texture2D(desiredWidth, desiredHeight); + var originalRenderTexture = RenderTexture.active; + var renderTexture = RenderTexture.GetTemporary(desiredWidth, desiredHeight, 32); + + try + { + RenderTexture.active = renderTexture; + Graphics.Blit(source, renderTexture); + + texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); + texture.Apply(); + } + finally + { + RenderTexture.active = originalRenderTexture; + RenderTexture.ReleaseTemporary(renderTexture); + } + + return texture; + } + + public static Texture2D ResizeTextureNormalMap(Texture2D source, int desiredWidth, int desiredHeight) + { + var texture = new Texture2D(desiredWidth, desiredHeight); + var originalRenderTexture = RenderTexture.active; + var renderTexture = RenderTexture.GetTemporary(desiredWidth, desiredHeight, 32, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); + + try + { + RenderTexture.active = renderTexture; + Graphics.Blit(source, renderTexture); + + texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); + + for (int i = 0; i < texture.width; i++) + { + for (int j = 0; j < texture.height; j++) + { + var color = texture.GetPixel(i, j); + color.b = color.r; + color.r = color.a; + color.a = 1; + texture.SetPixel(i, j, color); + } + } + + texture.Apply(); + } + finally + { + RenderTexture.active = originalRenderTexture; + RenderTexture.ReleaseTemporary(renderTexture); + } + + return texture; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs.meta new file mode 100644 index 00000000..9acc1c26 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f0a4fc8f266b4dd41a59693dd581e232 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/GraphicsUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs new file mode 100644 index 00000000..ab93f979 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs @@ -0,0 +1,72 @@ +using AssetStoreTools.Previews.Data; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Previews.Utility +{ + internal static class PreviewConvertUtility + { + public static string ConvertFilename(Object asset, FileNameFormat format) + { + string fileName = string.Empty; + + switch (format) + { + case FileNameFormat.Guid: + AssetDatabase.TryGetGUIDAndLocalFileIdentifier(asset, out var guid, out long _); + fileName = guid; + break; + case FileNameFormat.FullAssetPath: + var assetPath = AssetDatabase.GetAssetPath(asset); + + if (assetPath.StartsWith("Assets/")) + fileName = assetPath.Substring("Assets/".Length); + else if (assetPath.StartsWith("Packages/")) + fileName = assetPath.Substring("Packages/".Length); + + fileName = fileName.Replace("/", "_"); + break; + case FileNameFormat.AssetName: + fileName = asset.name; + break; + default: + throw new System.Exception("Undefined format"); + } + + return fileName; + } + + public static string ConvertExtension(PreviewFormat format) + { + switch (format) + { + case PreviewFormat.JPG: + return "jpg"; + case PreviewFormat.PNG: + return "png"; + default: + throw new System.Exception("Undefined format"); + } + } + + public static string ConvertFilenameWithExtension(Object asset, FileNameFormat nameFormat, PreviewFormat imageFormat) + { + var filename = ConvertFilename(asset, nameFormat); + var extension = ConvertExtension(imageFormat); + return $"{filename}.{extension}"; + } + + public static byte[] ConvertTexture(Texture2D texture, PreviewFormat format) + { + switch (format) + { + case PreviewFormat.JPG: + return texture.EncodeToJPG(); + case PreviewFormat.PNG: + return texture.EncodeToPNG(); + default: + throw new System.Exception("Undefined format"); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs.meta new file mode 100644 index 00000000..e9b337dd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 700eaf82299628d44853599774664bea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewConvertUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs new file mode 100644 index 00000000..8ca2b3a1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs @@ -0,0 +1,196 @@ +using System; +using System.Threading.Tasks; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +#if AST_URP_AVAILABLE +using UnityEngine.Rendering.Universal; +#endif +#if AST_HDRP_AVAILABLE +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +#endif + +namespace AssetStoreTools.Previews.Utility +{ + internal static class PreviewSceneUtility + { + private const string PreviewSceneName = "Preview Generation In Progress"; + private static readonly Color BackgroundColor = new Color(82f / 255, 82f / 255, 82f / 255); + private static readonly Color BackgroundColorHDRP = new Color(38f / 255, 38f / 255, 38f / 255); + + public static async Task OpenPreviewSceneForCurrentPipeline() + { + // Wait for an Editor frame to avoid recursive player loop internal errors + await WaitForEditorUpdate(); + + switch (RenderPipelineUtility.GetCurrentPipeline()) + { + case RenderPipeline.BiRP: + await OpenPreviewSceneBiRP(); + break; +#if AST_URP_AVAILABLE + case RenderPipeline.URP: + await OpenPreviewSceneURP(); + break; +#endif +#if AST_HDRP_AVAILABLE + case RenderPipeline.HDRP: + await OpenPreviewSceneHDRP(); + break; +#endif + default: + throw new NotImplementedException("Undefined Render Pipeline"); + } + } + + private static async Task WaitForEditorUpdate() + { + var updateCalled = false; + var delayCalled = false; + + void Update() + { + EditorApplication.update -= Update; + updateCalled = true; + } + + EditorApplication.update += Update; + while (!updateCalled) + await Task.Delay(10); + + void DelayCall() + { + EditorApplication.delayCall -= DelayCall; + delayCalled = true; + } + + EditorApplication.delayCall += DelayCall; + while (!delayCalled) + await Task.Delay(10); + } + + public static async Task OpenPreviewSceneBiRP() + { + OpenNewScene(); + + CreateSceneCamera(); + CreateSceneLighting(); + + await WaitForLighting(); + } + + private static void OpenNewScene() + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); + var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + scene.name = PreviewSceneName; + } + + private static Camera CreateSceneCamera() + { + var cameraGO = new GameObject() { name = "Camera" }; + var camera = cameraGO.AddComponent(); + camera.enabled = false; + camera.tag = "MainCamera"; + + camera.nearClipPlane = 0.01f; + camera.farClipPlane = 100000; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = BackgroundColor; + + return camera; + } + + private static Light CreateSceneLighting() + { + var lightGO = new GameObject() { name = "Lights" }; + lightGO.transform.rotation = Quaternion.Euler(45, 225, 0); + var light = lightGO.AddComponent(); + light.intensity = 0.75f; + light.type = LightType.Directional; + light.shadows = LightShadows.None; + + return light; + } + + private static async Task WaitForLighting() + { + while (!DynamicGI.isConverged) + await Task.Delay(100); + + await Task.Yield(); + } + +#if AST_URP_AVAILABLE + public static async Task OpenPreviewSceneURP() + { + OpenNewScene(); + + var camera = CreateSceneCamera(); + camera.gameObject.AddComponent(); + + var lighting = CreateSceneLighting(); + lighting.intensity = 0.5f; + lighting.gameObject.AddComponent(); + + await WaitForLighting(); + } +#endif + +#if AST_HDRP_AVAILABLE + public static async Task OpenPreviewSceneHDRP() + { + OpenNewScene(); + + var camera = CreateSceneCamera(); + var cameraData = camera.gameObject.AddComponent(); + cameraData.clearColorMode = HDAdditionalCameraData.ClearColorMode.Color; + cameraData.backgroundColorHDR = BackgroundColorHDRP; + + var light = CreateSceneLighting(); + var lightData = light.gameObject.AddComponent(); + lightData.SetIntensity(5000, LightUnit.Lux); + + CreateHDRPVolumeProfile(); + + await WaitForLighting(); + } + + private static Volume CreateHDRPVolumeProfile() + { + var volumeGO = new GameObject() { name = "Volume" }; + var volume = volumeGO.gameObject.AddComponent(); + + var profile = VolumeProfile.CreateInstance(); + volume.profile = profile; + volume.isGlobal = true; + + var exposure = profile.Add(); + exposure.active = true; + + exposure.mode.overrideState = true; + exposure.mode.value = ExposureMode.Fixed; + + exposure.fixedExposure.overrideState = true; + exposure.fixedExposure.value = 11; + + var fog = profile.Add(); + fog.active = true; + + fog.enabled.overrideState = true; + fog.enabled.value = false; + +#if AST_HDRP_AVAILABLE_V12 + var volumetricClouds = profile.Add(); + volumetricClouds.active = true; + + volumetricClouds.enable.overrideState = true; + volumetricClouds.enable.value = false; +#endif + + return volume; + } +#endif + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs.meta new file mode 100644 index 00000000..c11d3fbe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 63fa5650920e7914dae6fe76badac249 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/PreviewSceneUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs new file mode 100644 index 00000000..028f96db --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs @@ -0,0 +1,10 @@ +namespace AssetStoreTools.Previews.Utility +{ + internal enum RenderPipeline + { + Unknown = 0, + BiRP = 1, + URP = 2, + HDRP = 3 + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs.meta new file mode 100644 index 00000000..cbc59290 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c43c7ce2b9090ab49bb8944bc6bdb3c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipeline.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs new file mode 100644 index 00000000..c8e79d52 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs @@ -0,0 +1,32 @@ +using UnityEngine.Rendering; +#if AST_URP_AVAILABLE +using UnityEngine.Rendering.Universal; +#endif +#if AST_HDRP_AVAILABLE +using UnityEngine.Rendering.HighDefinition; +#endif + +namespace AssetStoreTools.Previews.Utility +{ + internal static class RenderPipelineUtility + { + public static RenderPipeline GetCurrentPipeline() + { + var currentPipelineAsset = GraphicsSettings.currentRenderPipeline; + if (currentPipelineAsset == null) + return RenderPipeline.BiRP; + +#if AST_URP_AVAILABLE + if (currentPipelineAsset is UniversalRenderPipelineAsset) + return RenderPipeline.URP; +#endif + +#if AST_HDRP_AVAILABLE + if (currentPipelineAsset is HDRenderPipelineAsset) + return RenderPipeline.HDRP; +#endif + + return RenderPipeline.Unknown; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs.meta new file mode 100644 index 00000000..96956b5a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5e42bdf53cd8b51429b10a6742ec5272 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Scripts/Utility/RenderPipelineUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles.meta new file mode 100644 index 00000000..50a00183 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 70d30555bce30014a9143c3d003105bf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss new file mode 100644 index 00000000..c363a3d6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss @@ -0,0 +1,210 @@ +/* Asset Preview Description */ + +.asset-preview-description { + flex-direction: column; + flex-shrink: 0; + + margin: 10px 5px 2px 5px; + padding: 2px 4px; +} + +.asset-preview-description-simple-container { + flex-direction: column; + flex-wrap: wrap; +} + +.asset-preview-description-simple-label { + white-space: normal; +} + +.asset-preview-description-hyperlink-button { + margin: 0; + padding: 0; + + align-self: flex-start; + cursor: link; +} + +.asset-preview-description-show-button { + margin-top: 12px; +} + +.asset-preview-description-hide-button { + margin-top: 12px; +} + +.asset-preview-description-full-container { + margin-top: 12px; +} + +.asset-preview-description-full-label { + white-space: normal; +} + +/* Asset Preview Settings */ + +.preview-settings { + flex-direction: column; + flex-shrink: 0; + + margin: 0px 5px 2px 5px; + padding: 2px 4px; +} + +.preview-settings-selection-row { + flex-direction: row; + flex-grow: 1; + + margin-top: 10px; + padding: 0 3px 0 2px; +} + +.preview-settings-selection-label-help-row { + flex-direction: row; + flex-shrink: 1; + flex-grow: 0; + + align-self: center; + align-items: center; + justify-content: flex-start; + + width: 120px; +} + +.preview-settings-selection-label-help-row > Label { + -unity-font-style: bold; +} + +.preview-settings-selection-label-help-row > Image { + height: 16px; + width: 16px; +} + +.preview-settings-selection-dropdown { + flex-grow: 1; + flex-shrink: 1; + + align-self: stretch; + + margin-right: 0; + margin-left: 3px; + padding: 1px 4px; +} + +/* Preview Paths */ + +.preview-paths { + flex-direction: column; + flex-grow: 1; + flex-shrink: 0; + + margin-bottom: 10px; + padding: 0; +} + +.preview-paths-box { + flex-grow: 1; + flex-direction: column; +} + +.preview-paths-scroll-view { + flex-grow: 1; + height: 100px; + margin-left: 3px; +} + +.preview-paths-scroll-view > .unity-scroll-view__content-viewport +{ + margin-left: 1px; +} + +.preview-paths-scroll-view > * > .unity-scroll-view__content-container +{ + padding: 0 0 0 0; +} + +.preview-paths-scroll-view > * > .unity-scroll-view__vertical-scroller +{ + margin: -1px 0; +} + +.preview-paths-scroll-view-bottom-row { + flex-direction: row-reverse; + margin: -1px 0 0 3px; +} + +.preview-paths-add-button { + margin: 3px 0 0 0; + align-self: center; +} + +.preview-paths-path-row { + flex-direction: row; + flex-grow: 1; + + margin-top: 2px; + padding: 0 5px 0 2px; +} + +.preview-paths-path-row-input-field { + flex-grow: 1; + flex-shrink: 1; + + padding-left: 5px; + + white-space: normal; + -unity-text-align: middle-left; +} + +.preview-paths-path-row-remove-button { + width: 20px; + height: 20px; + margin-left: 2px; + margin-right: 1px; + padding: 1px 0 0 0; +} + +/* Generate Button */ + +.preview-generate-button { + align-self: stretch; + + height: 25px; + margin-left: 2px; +} + +/* Asset Preview List Element */ + +.preview-list { + margin-top: 10px; + flex-grow: 1; +} + +.preview-list-image { + width: 140px; + height: 160px; + margin: 5px; + padding: 5px; + justify-content: space-between; +} + +.preview-list-image:hover{ + background-color: #444444; +} + +.preview-list-image > Image { + flex-shrink: 0; + max-width: 100%; + max-height: 100%; + -unity-background-scale-mode: scale-to-fit; + align-self: center; +} + +.preview-list-image > Label { + align-self: center; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; + padding: 0; + -unity-text-align: middle-center; +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss.meta new file mode 100644 index 00000000..14dfd5de --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 095b74bd60b187c418dcc4cd47aa696d +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Styles/Style.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss new file mode 100644 index 00000000..6dff0ddc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss @@ -0,0 +1,67 @@ +.primary-colors { + /* Light - lighter */ + background-color: rgb(220, 220, 220); + /* Light - middle */ + background-color: rgb(200, 200, 200); + /* Light - darker */ + background-color: rgb(180, 180, 180); + + /* Dark - lighter */ + background-color: rgb(78, 78, 78); + /* Dark - middle */ + background-color: rgb(68, 68, 68); + /* Dark - darker */ + background-color: rgb(58, 58, 58); + + /* Border color - light */ + border-color: rgb(200, 200, 200); + /* Border color - dark */ + border-color: rgb(33, 33, 33); +} + +/* Asset Preview Description */ + +.asset-preview-description-hyperlink-button { + color: rgb(68, 113, 229); + border-width: 0; + background-color: rgba(0, 0, 0, 0); +} + +.asset-preview-description-hyperlink-button:hover { + color: rgb(68, 133, 229); +} + +.asset-preview-description-hyperlink-button:active { + color: rgb(68, 93, 229); +} + +/* Asset Preview Settings */ + +.preview-settings-selection-label-help-row > Image { + --unity-image: resource("d__Help@2x"); +} + +.preview-settings-selection-dropdown { + color: rgb(238, 238, 238); + background-color: rgb(88, 88, 88); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(36, 36, 36); +} + +/* Preview Paths */ + +.preview-paths-scroll-view { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(58, 58, 58); +} + +.preview-paths-scroll-view > * > .unity-scroll-view__vertical-scroller { + border-right-width: 0; +} + +.preview-paths-path-row-input-field:hover { + background-color: rgb(78, 78, 78); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss.meta new file mode 100644 index 00000000..8295d423 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 1c04ee69303d45644bb3971a4e8ce952 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeDark.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss new file mode 100644 index 00000000..b98e1cd4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss @@ -0,0 +1,67 @@ +.primary-colors { + /* Light - lighter */ + background-color: rgb(220, 220, 220); + /* Light - middle */ + background-color: rgb(200, 200, 200); + /* Light - darker */ + background-color: rgb(180, 180, 180); + + /* Dark - lighter */ + background-color: rgb(50, 50, 50); + /* Dark - middle */ + background-color: rgb(28, 28, 28); + /* Dark - darker */ + background-color: rgb(0, 0, 0); + + /* Border color - light */ + border-color: rgb(200, 200, 200); + /* Border color - dark */ + border-color: rgb(33, 33, 33); +} + +/* Asset Preview Description */ + +.asset-preview-description-hyperlink-button { + color: rgb(68, 113, 229); + border-width: 0; + background-color: rgba(0, 0, 0, 0); +} + +.asset-preview-description-hyperlink-button:hover { + color: rgb(68, 133, 229); +} + +.asset-preview-description-hyperlink-button:active { + color: rgb(68, 93, 229); +} + +/* Asset Preview Settings */ + +.preview-settings-selection-label-help-row > Image { + --unity-image: resource("_Help@2x"); +} + +.preview-settings-selection-dropdown { + color: rgb(9, 9, 9); + background-color: rgb(228, 228, 228); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(178, 178, 178); +} + +/* Preview Paths */ + +.preview-paths-scroll-view { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(180, 180, 180); +} + +.preview-paths-scroll-view > * > .unity-scroll-view__vertical-scroller { + border-right-width: 0; +} + +.preview-paths-path-row-input-field:hover { + background-color: rgb(200, 200, 200); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss.meta new file mode 100644 index 00000000..f522d082 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 38ae9e6ef965cae43902ba22967938ee +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Previews/Styles/ThemeLight.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef b/Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef new file mode 100644 index 00000000..b0ba405b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef @@ -0,0 +1,36 @@ +{ + "name": "asset-store-tools-editor", + "rootNamespace": "", + "references": [ + "Unity.RenderPipelines.Universal.Runtime", + "Unity.RenderPipelines.Core.Runtime", + "Unity.RenderPipelines.HighDefinition.Runtime" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.render-pipelines.universal", + "expression": "1.0.0", + "define": "AST_URP_AVAILABLE" + }, + { + "name": "com.unity.render-pipelines.high-definition", + "expression": "1.0.0", + "define": "AST_HDRP_AVAILABLE" + }, + { + "name": "com.unity.render-pipelines.high-definition", + "expression": "12.0.0", + "define": "AST_HDRP_AVAILABLE_V12" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef.meta b/Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef.meta new file mode 100644 index 00000000..5e135086 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: c183be512f4485d40a3437fabd6c81cf +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Unity.AssetStoreTools.Editor.asmdef + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader.meta new file mode 100644 index 00000000..b4b86614 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9722d52df16aab742b26fe301782c74c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons.meta new file mode 100644 index 00000000..7026063d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab9d0e254817f4f4589a6a378d77babc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png new file mode 100644 index 00000000..f54f1a23 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png.meta new file mode 100644 index 00000000..f4bf5161 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 92f8a779a7c786a4f87ed8e1b36a66b3 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + 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: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + 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: 2048 + 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: 2048 + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-dark.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png new file mode 100644 index 00000000..d6684e51 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png.meta new file mode 100644 index 00000000..769b5ba0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png.meta @@ -0,0 +1,130 @@ +fileFormatVersion: 2 +guid: 7c0661b9a6385a3488c075711f368cf4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + 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: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + 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: 2048 + 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: 2048 + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/account-light.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png new file mode 100644 index 00000000..245875b4 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png.meta new file mode 100644 index 00000000..d0b3e91b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png.meta @@ -0,0 +1,154 @@ +fileFormatVersion: 2 +guid: e7df43612bbf44d4692de879c751902a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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 + 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: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 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 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + 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: 2048 + 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: 2048 + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/open-in-browser.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png new file mode 100644 index 00000000..70f47037 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png.meta new file mode 100644 index 00000000..7676a317 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 003e2710f9b29d94c87632022a3c7c48 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 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: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 18 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-dark.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png new file mode 100644 index 00000000..621e906e Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png.meta new file mode 100644 index 00000000..71625547 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png.meta @@ -0,0 +1,142 @@ +fileFormatVersion: 2 +guid: 8e0749dce5b14cc46b73b0303375c162 +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: 0 + 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: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 1 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Icons/publisher-portal-light.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts.meta new file mode 100644 index 00000000..63c6efc3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 15b24ad8f9d236249910fb8eef1e30ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data.meta new file mode 100644 index 00000000..1382bf8a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 930cfc857321b1048bf9607d4c8f89d3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions.meta new file mode 100644 index 00000000..73728d0f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 771776e4d51c47945b3449d4de948c00 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs new file mode 100644 index 00000000..84033b51 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs @@ -0,0 +1,34 @@ +using System; +using UnityEngine; +using PackageModel = AssetStoreTools.Api.Models.Package; + +namespace AssetStoreTools.Uploader.Data +{ + internal interface IPackage + { + string PackageId { get; } + string VersionId { get; } + string Name { get; } + string Status { get; } + string Category { get; } + bool IsCompleteProject { get; } + string RootGuid { get; } + string RootPath { get; } + string ProjectPath { get; } + string Modified { get; } + string Size { get; } + bool IsDraft { get; } + Texture2D Icon { get; } + + event Action OnUpdate; + event Action OnIconUpdate; + + string FormattedSize(); + string FormattedModified(); + + void UpdateData(PackageModel source); + void UpdateIcon(Texture2D texture); + + PackageModel ToModel(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs.meta new file mode 100644 index 00000000..190b689d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b92f2ed98d0b31a479aa2bfd95528fbd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackage.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs new file mode 100644 index 00000000..d82520f8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Uploader.Data +{ + internal interface IPackageContent + { + event Action OnActiveWorkflowChanged; + + IWorkflow GetActiveWorkflow(); + List GetAvailableWorkflows(); + void SetActiveWorkflow(IWorkflow workflow); + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs.meta new file mode 100644 index 00000000..61420459 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 45ce41158c3174149b7056a30ac901db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageContent.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs new file mode 100644 index 00000000..c35936b2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Uploader.Data +{ + internal interface IPackageGroup + { + string Name { get; } + List Packages { get; } + + event Action> OnPackagesSorted; + event Action> OnPackagesFiltered; + + void Sort(PackageSorting sortingType); + void Filter(string filter); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs.meta new file mode 100644 index 00000000..4a358083 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f683845071b8891498156d95a1a5c2dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IPackageGroup.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs new file mode 100644 index 00000000..c6e9b813 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs @@ -0,0 +1,36 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Exporter; +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace AssetStoreTools.Uploader.Data +{ + internal interface IWorkflow + { + string Name { get; } + string DisplayName { get; } + string PackageName { get; } + string PackageExtension { get; } + bool IsPathSet { get; } + + event Action OnChanged; + event Action OnUploadStateChanged; + + bool GenerateHighQualityPreviews { get; set; } + ValidationSettings LastValidationSettings { get; } + ValidationResult LastValidationResult { get; } + + IEnumerable GetAllPaths(); + ValidationResult Validate(); + Task ExportPackage(string outputPath); + Task ValidatePackageUploadedVersions(); + + Task UploadPackage(string exportedPackagePath); + void AbortUpload(); + void ResetUploadStatus(); + Task RefreshPackage(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs.meta new file mode 100644 index 00000000..c8381f3e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7a2f796eadafa774bae89cf3939611dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs new file mode 100644 index 00000000..6987b911 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs @@ -0,0 +1,18 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Uploader.Services.Analytics.Data; +using System; +using System.Threading.Tasks; +using UnityEngine.Analytics; + +namespace AssetStoreTools.Uploader.Data +{ + internal interface IWorkflowServices + { + Task GetPackageUploadedVersions(IPackage package, int timeoutMs); + Task UploadPackage(IPackageUploader uploader, IProgress progress); + void StopUploading(IPackageUploader uploader); + AnalyticsResult SendAnalytic(IAssetStoreAnalytic data); + Task UpdatePackageData(IPackage package); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs.meta new file mode 100644 index 00000000..88c381c5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0ae017363fa41ff4d9926dc4a5852246 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/IWorkflowServices.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs new file mode 100644 index 00000000..cd3462af --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs @@ -0,0 +1,253 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Exporter; +using AssetStoreTools.Previews; +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Previews.Generators; +using AssetStoreTools.Uploader.Services.Analytics.Data; +using AssetStoreTools.Utility; +using AssetStoreTools.Validator; +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEngine; + +namespace AssetStoreTools.Uploader.Data +{ + internal abstract class WorkflowBase : IWorkflow + { + protected IPackage Package; + + public abstract string Name { get; } + public abstract string DisplayName { get; } + public string PackageName => Package.Name; + public abstract string PackageExtension { get; } + public abstract bool IsPathSet { get; } + + protected string LocalPackageGuid; + protected string LocalPackagePath; + protected string LocalProjectPath; + + public bool GenerateHighQualityPreviews { get; set; } + public ValidationSettings LastValidationSettings { get; private set; } + public ValidationResult LastValidationResult { get; private set; } + + private IWorkflowServices _services; + private IPackageUploader _activeUploader; + + public abstract event Action OnChanged; + public event Action OnUploadStateChanged; + + public WorkflowBase(IPackage package, IWorkflowServices services) + { + Package = package; + _services = services; + } + + public abstract IEnumerable GetAllPaths(); + + public abstract IValidator CreateValidator(); + + public ValidationResult Validate() + { + var validator = CreateValidator(); + var result = CreateValidator().Validate(); + + LastValidationSettings = validator.Settings; + LastValidationResult = result; + + return result; + } + + protected IPreviewGenerator CreatePreviewGenerator(List inputPaths) + { + PreviewGenerationSettings settings; + IPreviewGenerator generator; + + // Filter out ProjectSettings + inputPaths = inputPaths.Where(x => x == "Assets" || x.StartsWith("Assets/") || x.StartsWith("Packages/")).ToList(); + + if (!GenerateHighQualityPreviews) + { + settings = new NativePreviewGenerationSettings() + { + InputPaths = inputPaths.ToArray(), + OverwriteExisting = false, + OutputPath = Constants.Previews.Native.DefaultOutputPath, + Format = Constants.Previews.Native.DefaultFormat, + PreviewFileNamingFormat = Constants.Previews.DefaultFileNameFormat, + WaitForPreviews = Constants.Previews.Native.DefaultWaitForPreviews, + ChunkedPreviewLoading = Constants.Previews.Native.DefaultChunkedPreviewLoading, + ChunkSize = Constants.Previews.Native.DefaultChunkSize + }; + + generator = new NativePreviewGenerator((NativePreviewGenerationSettings)settings); + } + else + { + settings = new CustomPreviewGenerationSettings() + { + InputPaths = inputPaths.ToArray(), + OverwriteExisting = false, + Width = Constants.Previews.Custom.DefaultWidth, + Height = Constants.Previews.Custom.DefaultHeight, + Depth = Constants.Previews.Custom.DefaultDepth, + NativeWidth = Constants.Previews.Custom.DefaultNativeWidth, + NativeHeight = Constants.Previews.Custom.DefaultNativeHeight, + OutputPath = Constants.Previews.Custom.DefaultOutputPath, + Format = Constants.Previews.Custom.DefaultFormat, + PreviewFileNamingFormat = Constants.Previews.DefaultFileNameFormat, + AudioSampleColor = Constants.Previews.Custom.DefaultAudioSampleColor, + AudioBackgroundColor = Constants.Previews.Custom.DefaultAudioBackgroundColor, + }; + + generator = new CustomPreviewGenerator((CustomPreviewGenerationSettings)settings); + } + + return generator; + } + + public abstract IPackageExporter CreateExporter(string outputPath); + + public virtual async Task ExportPackage(string outputPath) + { + var exporter = CreateExporter(outputPath); + var result = await exporter.Export(); + return result; + } + + public async Task ValidatePackageUploadedVersions() + { + var unityVersionSupported = string.Compare(Application.unityVersion, Constants.Uploader.MinRequiredUnitySupportVersion, StringComparison.Ordinal) >= 0; + if (unityVersionSupported) + return true; + + var response = await _services.GetPackageUploadedVersions(Package, 5000); + if (response.Cancelled || response.Success == false) + return true; + + return response.UnityVersions.Any(x => string.Compare(x, Constants.Uploader.MinRequiredUnitySupportVersion, StringComparison.Ordinal) >= 0); + } + + private bool ValidatePackageBeforeUpload(string packagePath, out string error) + { + error = string.Empty; + + if (!File.Exists(packagePath)) + { + error = $"File '{packagePath}' was not found."; + return false; + } + + if (!ValidatePackageSize(packagePath, out error)) + { + return false; + } + + return true; + } + + private bool ValidatePackageSize(string packagePath, out string error) + { + error = string.Empty; + + long packageSize = new FileInfo(packagePath).Length; + long packageSizeLimit = Constants.Uploader.MaxPackageSizeBytes; + + if (packageSize <= packageSizeLimit) + return true; + + float packageSizeInGB = packageSize / (float)1073741824; // (1024 * 1024 * 1024) + float maxPackageSizeInGB = packageSizeLimit / (float)1073741824; + error = $"The size of your package ({packageSizeInGB:0.0} GB) exceeds the maximum allowed package size of {maxPackageSizeInGB:0} GB. " + + $"Please reduce the size of your package."; + + return false; + } + + public async Task UploadPackage(string packagePath) + { + if (!ValidatePackageBeforeUpload(packagePath, out var error)) + { + return new PackageUploadResponse() { Success = false, Status = UploadStatus.Fail, Exception = new Exception(error) }; + } + + _activeUploader = CreatePackageUploader(packagePath); + var progress = new Progress(); + + var time = System.Diagnostics.Stopwatch.StartNew(); + + progress.ProgressChanged += ReportUploadProgress; + var response = await _services.UploadPackage(_activeUploader, progress); + progress.ProgressChanged -= ReportUploadProgress; + + // Send analytics + time.Stop(); + if (!response.Cancelled) + SendAnalytics(packagePath, response.Status, time.Elapsed.TotalSeconds); + + OnUploadStateChanged?.Invoke(response.Status, null); + _activeUploader = null; + return response; + } + + protected abstract IPackageUploader CreatePackageUploader(string exportedPackagePath); + + private void ReportUploadProgress(object _, float value) + { + OnUploadStateChanged?.Invoke(null, value); + } + + private void SendAnalytics(string packagePath, UploadStatus uploadStatus, double timeTakenSeconds) + { + try + { + var analytic = new PackageUploadAnalytic( + packageId: Package.PackageId, + category: Package.Category, + usedValidator: LastValidationResult != null, + validationSettings: LastValidationSettings, + validationResult: LastValidationResult, + uploadFinishedReason: uploadStatus, + timeTaken: timeTakenSeconds, + packageSize: new FileInfo(packagePath).Length, + workflow: Name + ); + + var result = _services.SendAnalytic(analytic); + } + catch (Exception e) { ASDebug.LogError($"Could not send analytics: {e}"); } + } + + public void AbortUpload() + { + if (_activeUploader != null) + _services.StopUploading(_activeUploader); + + _activeUploader = null; + } + + public void ResetUploadStatus() + { + OnUploadStateChanged?.Invoke(UploadStatus.Default, 0f); + } + + public async Task RefreshPackage() + { + var response = await _services.UpdatePackageData(Package); + if (!response.Success) + return; + + Package.UpdateData(response.Package); + } + + public abstract bool IsPathValid(string path, out string reason); + + protected abstract void Serialize(); + + protected abstract void Deserialize(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs.meta new file mode 100644 index 00000000..a7a6a651 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d0e87ee17aa944c42b1c335abe19daaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Abstractions/WorkflowBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs new file mode 100644 index 00000000..967bd9ba --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs @@ -0,0 +1,329 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Exporter; +using AssetStoreTools.Uploader.Data.Serialization; +using AssetStoreTools.Utility; +using AssetStoreTools.Validator; +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; + +namespace AssetStoreTools.Uploader.Data +{ + internal class AssetsWorkflow : WorkflowBase + { + public override string Name => "AssetsWorkflow"; + public override string DisplayName => "From Assets Folder"; + public override string PackageExtension => ".unitypackage"; + public override bool IsPathSet => !string.IsNullOrEmpty(_mainExportPath); + public bool IsCompleteProject => Package.IsCompleteProject; + + private AssetsWorkflowState _stateData; + + private string _mainExportPath; + private bool _includeDependencies; + private List _dependencies; + private List _specialFolders; + + public override event Action OnChanged; + + // Special folders that would not work if not placed directly in the 'Assets' folder + private readonly string[] _extraAssetFolderNames = + { + "Editor Default Resources", "Gizmos", "Plugins", + "StreamingAssets", "Standard Assets", "WebGLTemplates", + "ExternalDependencyManager", "XR" + }; + + public AssetsWorkflow(IPackage package, AssetsWorkflowState stateData, IWorkflowServices services) + : base(package, services) + { + _stateData = stateData; + Deserialize(); + } + + public string GetMainExportPath() + { + return _mainExportPath; + } + + public void SetMainExportPath(string path, bool serialize) + { + _mainExportPath = path; + SetMetadata(); + if (serialize) + Serialize(); + } + + private void SetMetadata() + { + LocalPackageGuid = AssetDatabase.AssetPathToGUID(_mainExportPath); + LocalPackagePath = _mainExportPath; + LocalProjectPath = _mainExportPath; + } + + public bool GetIncludeDependencies() + { + return _includeDependencies; + } + + public void SetIncludeDependencies(bool value, bool serialize) + { + _includeDependencies = value; + // Note: make sure that exporting does not fail when + // a serialized dependency that has been removed from a project is sent to exporter + if (serialize) + Serialize(); + } + + public List GetDependencies() + { + return _dependencies; + } + + public void SetDependencies(IEnumerable dependencies, bool serialize) + { + _dependencies.Clear(); + foreach (var dependency in dependencies) + { + if (!PackageUtility.GetPackageByPackageName(dependency, out var package)) + continue; + _dependencies.Add(package); + } + + if (serialize) + Serialize(); + } + + public List GetSpecialFolders() + { + return _specialFolders; + } + + public void SetSpecialFolders(IEnumerable specialFolders, bool serialize) + { + _specialFolders.Clear(); + foreach (var folder in specialFolders) + { + _specialFolders.Add(folder); + } + + if (serialize) + Serialize(); + } + + public override bool IsPathValid(string path, out string error) + { + error = string.Empty; + + var pathIsFolder = Directory.Exists(path); + if (!pathIsFolder) + { + error = "Path must point to a valid folder"; + return false; + } + + var pathWithinAssetsFolder = path.StartsWith("Assets/") && path != "Assets/"; + if (pathWithinAssetsFolder) + return true; + + var pathIsAssetsFolder = path == "Assets" || path == "Assets/"; + if (pathIsAssetsFolder) + { + var assetsFolderSelectionAllowed = Package.IsCompleteProject; + if (assetsFolderSelectionAllowed) + return true; + + error = "'Assets' folder is only available for packages tagged as a 'Complete Project'."; + return false; + } + + error = "Selected folder path must be within the project's Assets."; + return false; + } + + public List GetAvailableDependencies() + { + var registryPackages = PackageUtility.GetAllRegistryPackages(); + return registryPackages.Select(x => x.name).ToList(); + } + + public List GetAvailableSpecialFolders() + { + var specialFolders = new List(); + + foreach (var extraAssetFolderName in _extraAssetFolderNames) + { + var fullExtraPath = "Assets/" + extraAssetFolderName; + + if (!Directory.Exists(fullExtraPath)) + continue; + + if (_mainExportPath.ToLower().StartsWith(fullExtraPath.ToLower())) + continue; + + // Don't include nested paths + if (!fullExtraPath.ToLower().StartsWith(_mainExportPath.ToLower())) + specialFolders.Add(fullExtraPath); + } + + return specialFolders; + } + + public override IEnumerable GetAllPaths() + { + var paths = new List() + { + _mainExportPath + }; + paths.AddRange(GetSpecialFolders()); + + return paths; + } + + public override IValidator CreateValidator() + { + var validationPaths = GetAllPaths(); + + var validationSettings = new CurrentProjectValidationSettings() + { + Category = Package.Category, + ValidationPaths = validationPaths.ToList(), + ValidationType = ValidationType.UnityPackage + }; + + var validator = new CurrentProjectValidator(validationSettings); + return validator; + } + + public override IPackageExporter CreateExporter(string outputPath) + { + var exportPaths = GetAllPaths().ToList(); + + if (IsCompleteProject && !exportPaths.Contains("ProjectSettings")) + { + exportPaths.Add("ProjectSettings"); + } + + var dependenciesToInclude = new List(); + if (_includeDependencies) + { + dependenciesToInclude.AddRange(_dependencies.Select(x => x.name)); + } + + if (ASToolsPreferences.Instance.UseLegacyExporting) + { + var exportSettings = new LegacyExporterSettings() + { + ExportPaths = exportPaths.ToArray(), + OutputFilename = outputPath, + IncludeDependencies = _includeDependencies, + }; + + return new LegacyPackageExporter(exportSettings); + } + else + { + var exportSettings = new DefaultExporterSettings() + { + ExportPaths = exportPaths.ToArray(), + OutputFilename = outputPath, + Dependencies = dependenciesToInclude.ToArray(), + PreviewGenerator = CreatePreviewGenerator(exportPaths), + }; + + return new DefaultPackageExporter(exportSettings); + } + } + + protected override IPackageUploader CreatePackageUploader(string exportedPackagePath) + { + var uploaderSettings = new UnityPackageUploadSettings() + { + UnityPackagePath = exportedPackagePath, + VersionId = Package.VersionId, + RootGuid = LocalPackageGuid, + RootPath = LocalPackagePath, + ProjectPath = LocalProjectPath + }; + + var uploader = new UnityPackageUploader(uploaderSettings); + return uploader; + } + + protected override void Serialize() + { + _stateData.SetMainPath(_mainExportPath); + _stateData.SetIncludeDependencies(_includeDependencies); + _stateData.SetDependencies(_dependencies.Select(x => x.name)); + _stateData.SetSpecialFolders(_specialFolders); + OnChanged?.Invoke(); + } + + protected override void Deserialize() + { + _mainExportPath = _stateData.GetMainPath(); + + _specialFolders = new List(); + foreach (var path in _stateData.GetSpecialFolders()) + { + _specialFolders.Add(path); + } + + _includeDependencies = _stateData.GetIncludeDependencies(); + + _dependencies = new List(); + foreach (var dependency in _stateData.GetDependencies()) + { + if (!PackageUtility.GetPackageByPackageName(dependency, out var package)) + continue; + + _dependencies.Add(package); + } + + DeserializeFromUploadedData(); + } + + private void DeserializeFromUploadedData() + { + DeserializeFromUploadedDataByGuid(); + DeserializeFromUploadedDataByPath(); + } + + private void DeserializeFromUploadedDataByGuid() + { + if (!string.IsNullOrEmpty(_mainExportPath)) + return; + + var lastUploadedGuid = Package.RootGuid; + if (string.IsNullOrEmpty(lastUploadedGuid)) + return; + + var potentialPackagePath = AssetDatabase.GUIDToAssetPath(lastUploadedGuid); + DeserializeFromUploadedDataByPath(potentialPackagePath); + } + + private void DeserializeFromUploadedDataByPath() + { + if (!string.IsNullOrEmpty(_mainExportPath)) + return; + + var lastUploadedPath = Package.ProjectPath; + if (string.IsNullOrEmpty(lastUploadedPath)) + return; + + DeserializeFromUploadedDataByPath(lastUploadedPath); + } + + private void DeserializeFromUploadedDataByPath(string path) + { + if (string.IsNullOrEmpty(path) || !IsPathValid(path, out var _)) + return; + + _mainExportPath = path; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs.meta new file mode 100644 index 00000000..4e07adf0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4657d35aaf9d70948a0840dc615f64ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/AssetsWorkflow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs new file mode 100644 index 00000000..3759313d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs @@ -0,0 +1,251 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Exporter; +using AssetStoreTools.Uploader.Data.Serialization; +using AssetStoreTools.Utility; +using AssetStoreTools.Validator; +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEditor.PackageManager; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; +using PackageManager = UnityEditor.PackageManager; + +namespace AssetStoreTools.Uploader.Data +{ + internal class HybridPackageWorkflow : WorkflowBase + { + public override string Name => "HybridPackageWorkflow"; + public override string DisplayName => "Local UPM Package"; + public override string PackageExtension => ".unitypackage"; + public override bool IsPathSet => _packageInfo != null; + + private HybridPackageWorkflowState _stateData; + + private PackageInfo _packageInfo; + private List _dependencies; + + public override event Action OnChanged; + + public HybridPackageWorkflow(IPackage package, HybridPackageWorkflowState stateData, IWorkflowServices services) + : base(package, services) + { + _stateData = stateData; + Deserialize(); + } + + public PackageInfo GetPackage() + { + return _packageInfo; + } + + public void SetPackage(PackageInfo packageInfo, bool serialize) + { + if (packageInfo == null) + throw new ArgumentException("Package is null"); + + _packageInfo = packageInfo; + SetMetadata(); + if (serialize) + Serialize(); + } + + public void SetPackage(string packageManifestPath, bool serialize) + { + if (!PackageUtility.GetPackageByManifestPath(packageManifestPath, out var package)) + throw new ArgumentException("Path does not correspond to a valid package"); + + SetPackage(package, serialize); + } + + private void SetMetadata() + { + LocalPackageGuid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(_packageInfo.GetManifestAsset())); + LocalPackagePath = _packageInfo.assetPath; + LocalProjectPath = _packageInfo.name; + } + + public List GetDependencies() + { + return _dependencies; + } + + public void SetDependencies(IEnumerable dependencies, bool serialize) + { + _dependencies.Clear(); + foreach (var dependency in dependencies) + { + if (!PackageUtility.GetPackageByPackageName(dependency, out var package)) + continue; + _dependencies.Add(package); + } + + if (serialize) + Serialize(); + } + + public List GetAvailableDependencies() + { + var availableDependencies = new List(); + if (_packageInfo == null) + return availableDependencies; + + var packageDependencies = _packageInfo.dependencies.Select(x => x.name); + foreach (var dependency in packageDependencies) + { + if (!PackageUtility.GetPackageByPackageName(dependency, out var package)) + continue; + + if (package.source != PackageManager.PackageSource.Local + && package.source != PackageManager.PackageSource.Embedded) + continue; + + availableDependencies.Add(package); + } + + return availableDependencies; + } + + public override IEnumerable GetAllPaths() + { + var paths = new List(); + + if (_packageInfo == null) + return paths; + + paths.Add(_packageInfo.assetPath); + paths.AddRange(_dependencies.Select(x => x.assetPath)); + + return paths; + } + + public override bool IsPathValid(string path, out string reason) + { + reason = string.Empty; + + if (!PackageUtility.GetPackageByManifestPath(path, out var package)) + { + reason = "Selected path must point to a package manifest for a package that is imported into the current project"; + return false; + } + + var packageSourceValid = package.source == PackageSource.Embedded || package.source == PackageSource.Local; + if (!packageSourceValid) + { + reason = "Selected package must be a local or an embedded package"; + return false; + } + + return true; + } + + public override IValidator CreateValidator() + { + var validationPaths = GetAllPaths(); + + var validationSettings = new CurrentProjectValidationSettings() + { + Category = Package?.Category, + ValidationPaths = validationPaths.ToList(), + ValidationType = ValidationType.UnityPackage + }; + + var validator = new CurrentProjectValidator(validationSettings); + return validator; + } + + public override IPackageExporter CreateExporter(string outputPath) + { + var exportPaths = GetAllPaths(); + + var exportSettings = new DefaultExporterSettings() + { + ExportPaths = exportPaths.ToArray(), + OutputFilename = outputPath, + PreviewGenerator = CreatePreviewGenerator(exportPaths.ToList()) + }; + + return new DefaultPackageExporter(exportSettings); + } + + protected override IPackageUploader CreatePackageUploader(string exportedPackagePath) + { + var uploaderSettings = new UnityPackageUploadSettings() + { + UnityPackagePath = exportedPackagePath, + VersionId = Package.VersionId, + RootGuid = LocalPackageGuid, + RootPath = LocalPackagePath, + ProjectPath = LocalProjectPath + }; + + var uploader = new UnityPackageUploader(uploaderSettings); + return uploader; + } + + protected override void Serialize() + { + if (_packageInfo == null) + return; + + _stateData.SetPackageName(_packageInfo.name); + _stateData.SetPackageDependencies(_dependencies.Select(x => x.name).OrderBy(x => x)); + OnChanged?.Invoke(); + } + + protected override void Deserialize() + { + var packageName = _stateData.GetPackageName(); + if (PackageUtility.GetPackageByPackageName(packageName, out var package)) + _packageInfo = package; + + _dependencies = new List(); + var dependencies = _stateData.GetPackageDependencies(); + foreach (var dependency in dependencies) + { + if (PackageUtility.GetPackageByPackageName(dependency, out var packageDependency)) + _dependencies.Add(packageDependency); + } + + DeserializeFromUploadedData(); + } + + private void DeserializeFromUploadedData() + { + DeserializeFromUploadedDataByPackageName(); + DeserializeFromUploadedDataByPackageGuid(); + } + + private void DeserializeFromUploadedDataByPackageName() + { + if (_packageInfo != null) + return; + + var lastUploadedPackageName = Package.ProjectPath; + if (!PackageUtility.GetPackageByPackageName(lastUploadedPackageName, out var package)) + return; + + _packageInfo = package; + } + + private void DeserializeFromUploadedDataByPackageGuid() + { + if (_packageInfo != null) + return; + + var lastUploadedGuid = Package.RootGuid; + if (string.IsNullOrEmpty(lastUploadedGuid)) + return; + + var potentialPackageManifestPath = AssetDatabase.GUIDToAssetPath(lastUploadedGuid); + if (string.IsNullOrEmpty(potentialPackageManifestPath) || !IsPathValid(potentialPackageManifestPath, out var _)) + return; + + if (!PackageUtility.GetPackageByManifestPath(potentialPackageManifestPath, out var package)) + return; + + _packageInfo = package; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs.meta new file mode 100644 index 00000000..8feba578 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3061839aba3894246a20195639eeda1f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/HybridPackageWorkflow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs new file mode 100644 index 00000000..1a984e56 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs @@ -0,0 +1,91 @@ +using System; +using UnityEngine; +using PackageModel = AssetStoreTools.Api.Models.Package; + +namespace AssetStoreTools.Uploader.Data +{ + internal class Package : IPackage + { + private PackageModel _source; + + public string PackageId => _source.PackageId; + public string VersionId => _source.VersionId; + public string Name => _source.Name; + public string Status => _source.Status; + public string Category => _source.Category; + public bool IsCompleteProject => _source.IsCompleteProject; + public string RootGuid => _source.RootGuid; + public string RootPath => _source.RootPath; + public string ProjectPath => _source.ProjectPath; + public string Modified => _source.Modified; + public string Size => _source.Size; + public string IconUrl => _source.IconUrl; + public bool IsDraft => Status.Equals("draft", StringComparison.OrdinalIgnoreCase); + public Texture2D Icon { get; private set; } + + public event Action OnUpdate; + public event Action OnIconUpdate; + + public Package(PackageModel packageSource) + { + _source = packageSource; + } + + public void UpdateIcon(Texture2D texture) + { + if (texture == null) + return; + + Icon = texture; + OnIconUpdate?.Invoke(); + } + + public string FormattedSize() + { + var defaultSize = "0.00 MB"; + if (float.TryParse(Size, out var sizeBytes)) + return $"{sizeBytes / (1024f * 1024f):0.00} MB"; + + return defaultSize; + } + + public string FormattedModified() + { + var defaultDate = "Unknown"; + if (DateTime.TryParse(Modified, out var dt)) + return dt.Date.ToString("yyyy-MM-dd"); + + return defaultDate; + } + + public void UpdateData(PackageModel source) + { + if (source == null) + throw new ArgumentException("Provided package is null"); + + _source = source; + OnUpdate?.Invoke(); + } + + public PackageModel ToModel() + { + var model = new PackageModel() + { + PackageId = _source.PackageId, + VersionId = _source.VersionId, + Name = _source.Name, + Status = _source.Status, + Category = _source.Category, + IsCompleteProject = _source.IsCompleteProject, + RootGuid = _source.RootGuid, + RootPath = _source.RootPath, + ProjectPath = _source.ProjectPath, + Modified = _source.Modified, + Size = _source.Size, + IconUrl = _source.IconUrl + }; + + return model; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs.meta new file mode 100644 index 00000000..7e4f9df7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: fc2198164bbd6394b87c51a74fe2915e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Package.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs new file mode 100644 index 00000000..bac6c08e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs @@ -0,0 +1,68 @@ +using AssetStoreTools.Uploader.Data.Serialization; +using AssetStoreTools.Uploader.Services; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AssetStoreTools.Uploader.Data +{ + internal class PackageContent : IPackageContent + { + private IWorkflow _activeWorkflow; + private List _workflows; + private WorkflowStateData _workflowStateData; + + private ICachingService _cachingService; + + public event Action OnActiveWorkflowChanged; + + public PackageContent(List workflows, WorkflowStateData workflowStateData, ICachingService cachingService) + { + _workflows = workflows; + _workflowStateData = workflowStateData; + _cachingService = cachingService; + + foreach (var workflow in _workflows) + { + workflow.OnChanged += Serialize; + } + + Deserialize(); + } + + public IWorkflow GetActiveWorkflow() + { + return _activeWorkflow; + } + + public void SetActiveWorkflow(IWorkflow workflow) + { + _activeWorkflow = workflow; + + OnActiveWorkflowChanged?.Invoke(_activeWorkflow); + + Serialize(); + } + + public List GetAvailableWorkflows() + { + return _workflows; + } + + private void Serialize() + { + _workflowStateData.SetActiveWorkflow(_activeWorkflow.Name); + _cachingService.CacheWorkflowStateData(_workflowStateData); + } + + private void Deserialize() + { + var serializedWorkflow = _workflowStateData.GetActiveWorkflow(); + var workflow = _workflows.FirstOrDefault(x => x.Name == serializedWorkflow); + if (workflow != null) + _activeWorkflow = workflow; + else + _activeWorkflow = _workflows[0]; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs.meta new file mode 100644 index 00000000..641626ba --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f36086f9380a49949ab45463abc6fee8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageContent.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs new file mode 100644 index 00000000..78e9aa1a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AssetStoreTools.Uploader.Data +{ + internal class PackageGroup : IPackageGroup + { + private class FilteredPackage + { + public IPackage Package; + public bool IsInFilter; + } + + public string Name { get; private set; } + public List Packages { get; private set; } + + private List _filteredPackages; + + public event Action> OnPackagesSorted; + public event Action> OnPackagesFiltered; + + public PackageGroup(string name, List packages) + { + Name = name; + Packages = packages; + + _filteredPackages = new List(); + foreach (var package in Packages) + _filteredPackages.Add(new FilteredPackage() { Package = package, IsInFilter = true }); + } + + public void Sort(PackageSorting sortingType) + { + switch (sortingType) + { + case PackageSorting.Name: + _filteredPackages = _filteredPackages.OrderBy(x => x.Package.Name).ToList(); + break; + case PackageSorting.Date: + _filteredPackages = _filteredPackages.OrderByDescending(x => x.Package.Modified).ToList(); + break; + case PackageSorting.Category: + _filteredPackages = _filteredPackages.OrderBy(x => x.Package.Category).ThenBy(x => x.Package.Name).ToList(); + break; + default: + throw new NotImplementedException("Undefined sorting type"); + } + + OnPackagesSorted?.Invoke(_filteredPackages.Where(x => x.IsInFilter).Select(x => x.Package).ToList()); + } + + public void Filter(string filter) + { + foreach (var package in _filteredPackages) + { + bool inFilter = package.Package.Name.ToLower().Contains(filter.ToLower()); + package.IsInFilter = inFilter; + } + + OnPackagesFiltered?.Invoke(_filteredPackages.Where(x => x.IsInFilter).Select(x => x.Package).ToList()); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs.meta new file mode 100644 index 00000000..a8f9623b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c9cc17f6b95bb2c42913a1451b9af29e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageGroup.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs new file mode 100644 index 00000000..7ef00e42 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs @@ -0,0 +1,9 @@ +namespace AssetStoreTools.Uploader.Data +{ + internal enum PackageSorting + { + Name, + Category, + Date + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs.meta new file mode 100644 index 00000000..de09cab3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b1d61d0de90e022469b5ed312d4b7beb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/PackageSorting.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization.meta new file mode 100644 index 00000000..2ba3d4cc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b05e199f21f636439844a8cc7e2c225 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs new file mode 100644 index 00000000..4970e732 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs @@ -0,0 +1,59 @@ +using AssetStoreTools.Utility; +using Newtonsoft.Json; +using System.IO; +using UnityEditor; + +namespace AssetStoreTools.Uploader.Data.Serialization +{ + internal class AssetPath + { + [JsonProperty("path")] + private string _path = string.Empty; + [JsonProperty("guid")] + private string _guid = string.Empty; + + [JsonIgnore] + public string Path { get => _path; set { SetAssetPath(value); } } + [JsonIgnore] + public string Guid { get => _guid; set { _guid = value; } } + + public AssetPath() { } + + public AssetPath(string path) + { + SetAssetPath(path); + } + + private void SetAssetPath(string path) + { + _path = path.Replace("\\", "/"); + if (TryGetGuid(_path, out var guid)) + _guid = guid; + } + + private bool TryGetGuid(string path, out string guid) + { + guid = string.Empty; + + var relativePath = FileUtility.AbsolutePathToRelativePath(path, ASToolsPreferences.Instance.EnableSymlinkSupport); + + if (!relativePath.StartsWith("Assets/") && !relativePath.StartsWith("Packages/")) + return false; + + guid = AssetDatabase.AssetPathToGUID(relativePath); + return !string.IsNullOrEmpty(guid); + } + + public override string ToString() + { + var pathFromGuid = AssetDatabase.GUIDToAssetPath(_guid); + if (!string.IsNullOrEmpty(pathFromGuid) && (File.Exists(pathFromGuid) || Directory.Exists(pathFromGuid))) + return pathFromGuid; + + if (File.Exists(_path) || Directory.Exists(_path)) + return _path; + + return string.Empty; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs.meta new file mode 100644 index 00000000..3529bc17 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 920ff8e4ffe77ec44bede985593cc187 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetPath.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs new file mode 100644 index 00000000..8d955c36 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs @@ -0,0 +1,77 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace AssetStoreTools.Uploader.Data.Serialization +{ + internal class AssetsWorkflowState + { + [JsonProperty("main_path")] + private AssetPath _mainPath; + [JsonProperty("special_folders")] + private List _specialFolders; + [JsonProperty("include_dependencies")] + private bool _includeDependencies; + [JsonProperty("dependencies")] + private List _dependencies; + + public AssetsWorkflowState() + { + _mainPath = new AssetPath(); + _includeDependencies = false; + _dependencies = new List(); + _specialFolders = new List(); + } + + public string GetMainPath() + { + return _mainPath?.ToString(); + } + + public void SetMainPath(string path) + { + _mainPath = new AssetPath(path); + } + + public bool GetIncludeDependencies() + { + return _includeDependencies; + } + + public void SetIncludeDependencies(bool value) + { + _includeDependencies = value; + } + + public List GetDependencies() + { + return _dependencies; + } + + public void SetDependencies(IEnumerable dependencies) + { + _dependencies = new List(); + foreach (var dependency in dependencies) + _dependencies.Add(dependency); + } + + public List GetSpecialFolders() + { + var specialFolders = new List(); + foreach (var folder in _specialFolders) + { + var path = folder.ToString(); + if (!string.IsNullOrEmpty(path)) + specialFolders.Add(path); + } + + return specialFolders; + } + + public void SetSpecialFolders(List specialFolders) + { + _specialFolders = new List(); + foreach (var path in specialFolders) + _specialFolders.Add(new AssetPath(path)); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs.meta new file mode 100644 index 00000000..8c7d4771 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 505f0a5aa753b4445a467539e150190a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/AssetsWorkflowStateData.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs new file mode 100644 index 00000000..58e428ea --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace AssetStoreTools.Uploader.Data.Serialization +{ + internal class HybridPackageWorkflowState + { + [JsonProperty("package_name")] + private string _packageName; + [JsonProperty("dependencies")] + private List _dependencies; + + public HybridPackageWorkflowState() + { + _packageName = string.Empty; + _dependencies = new List(); + } + + public string GetPackageName() + { + return _packageName; + } + + public void SetPackageName(string packageName) + { + _packageName = packageName; + } + + public List GetPackageDependencies() + { + return _dependencies; + } + + public void SetPackageDependencies(IEnumerable dependencies) + { + _dependencies.Clear(); + foreach (var dependency in dependencies) + _dependencies.Add(dependency); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs.meta new file mode 100644 index 00000000..7b9f72af --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2848375fcb0a4174495573190bfc3900 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/HybridPackageWorkflowState.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs new file mode 100644 index 00000000..ca14b882 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace AssetStoreTools.Uploader.Data.Serialization +{ + internal class UnityPackageWorkflowState + { + [JsonProperty("package_path")] + private AssetPath _packagePath; + + public UnityPackageWorkflowState() + { + _packagePath = new AssetPath(); + } + + public string GetPackagePath() + { + return _packagePath?.ToString(); + } + + public void SetPackagePath(string path) + { + _packagePath = new AssetPath(path); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs.meta new file mode 100644 index 00000000..65f718ec --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 101a66adc88639b43b07cc28214474cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/UnityPackageWorkflowStateData.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs new file mode 100644 index 00000000..25e72c62 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs @@ -0,0 +1,68 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace AssetStoreTools.Uploader.Data.Serialization +{ + internal class WorkflowStateData + { + [JsonProperty("package_id")] + private string _packageId; + [JsonProperty("active_workflow")] + private string _activeWorkflow; + [JsonProperty("assets_workflow")] + private AssetsWorkflowState _assetsWorkflow; + [JsonProperty("unitypackage_workflow")] + private UnityPackageWorkflowState _unityPackageWorkflow; + [JsonProperty("hybrid_workflow")] + private HybridPackageWorkflowState _hybridPackageWorkflow; + + public WorkflowStateData() + { + _activeWorkflow = string.Empty; + + _assetsWorkflow = new AssetsWorkflowState(); + _unityPackageWorkflow = new UnityPackageWorkflowState(); + _hybridPackageWorkflow = new HybridPackageWorkflowState(); + } + + public WorkflowStateData(string packageId) : this() + { + SetPackageId(packageId); + } + + public string GetPackageId() + { + return _packageId; + } + + public void SetPackageId(string packageId) + { + _packageId = packageId; + } + + public string GetActiveWorkflow() + { + return _activeWorkflow; + } + + public void SetActiveWorkflow(string activeWorkflow) + { + _activeWorkflow = activeWorkflow; + } + + public AssetsWorkflowState GetAssetsWorkflowState() + { + return _assetsWorkflow; + } + + public UnityPackageWorkflowState GetUnityPackageWorkflowState() + { + return _unityPackageWorkflow; + } + + public HybridPackageWorkflowState GetHybridPackageWorkflowState() + { + return _hybridPackageWorkflow; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs.meta new file mode 100644 index 00000000..5fb89959 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: eecebbc83661a4f41a14e293c9fc3331 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/Serialization/WorkflowStateData.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs new file mode 100644 index 00000000..6668fd6e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs @@ -0,0 +1,135 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Exporter; +using AssetStoreTools.Uploader.Data.Serialization; +using AssetStoreTools.Validator; +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; + +namespace AssetStoreTools.Uploader.Data +{ + internal class UnityPackageWorkflow : WorkflowBase + { + public override string Name => "UnityPackageWorkflow"; + public override string DisplayName => "Pre-exported .unitypackage"; + public override string PackageExtension => ".unitypackage"; + public override bool IsPathSet => !string.IsNullOrEmpty(_packagePath); + + private UnityPackageWorkflowState _workflowState; + private string _packagePath; + + public override event Action OnChanged; + + public UnityPackageWorkflow(IPackage package, UnityPackageWorkflowState workflowState, IWorkflowServices services) + : base(package, services) + { + _workflowState = workflowState; + Deserialize(); + } + + public void SetPackagePath(string path, bool serialize) + { + _packagePath = path; + SetMetadata(); + if (serialize) + Serialize(); + } + + private void SetMetadata() + { + LocalPackageGuid = string.Empty; + LocalPackagePath = string.Empty; + LocalProjectPath = _packagePath; + } + + public string GetPackagePath() + { + return _packagePath; + } + + public override IEnumerable GetAllPaths() + { + return new List() { _packagePath }; + } + + public override bool IsPathValid(string path, out string error) + { + error = null; + + var pathIsUnityPackage = path.EndsWith(PackageExtension); + var pathExists = File.Exists(path); + + if (!pathIsUnityPackage || !pathExists) + { + error = "Path must point to a .unitypackage file"; + return false; + } + + return true; + } + + public override IValidator CreateValidator() + { + var validationSettings = new ExternalProjectValidationSettings() + { + Category = Package.Category, + PackagePath = GetPackagePath() + }; + + var validator = new ExternalProjectValidator(validationSettings); + return validator; + } + + public override IPackageExporter CreateExporter(string _) + { + // This workflow already takes exported packages as input + throw new InvalidOperationException($"{nameof(UnityPackageWorkflow)} already takes exported packages as input"); + } + + public override Task ExportPackage(string _) + { + return Task.FromResult(new PackageExporterResult() { Success = true, ExportedPath = GetPackagePath() }); + } + + protected override IPackageUploader CreatePackageUploader(string exportedPackagePath) + { + var uploaderSettings = new UnityPackageUploadSettings() + { + VersionId = Package.VersionId, + UnityPackagePath = exportedPackagePath, + RootGuid = LocalPackageGuid, + RootPath = LocalPackagePath, + ProjectPath = LocalProjectPath + }; + + var uploader = new UnityPackageUploader(uploaderSettings); + return uploader; + } + + protected override void Serialize() + { + _workflowState.SetPackagePath(_packagePath); + OnChanged?.Invoke(); + } + + protected override void Deserialize() + { + _packagePath = _workflowState.GetPackagePath(); + DeserializeFromUploadedData(); + } + + private void DeserializeFromUploadedData() + { + if (!string.IsNullOrEmpty(_packagePath)) + return; + + var potentialPackagePath = Package.ProjectPath; + if (string.IsNullOrEmpty(potentialPackagePath) || !IsPathValid(potentialPackagePath, out var _)) + return; + + _packagePath = potentialPackagePath; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs.meta new file mode 100644 index 00000000..0179b484 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 47ee1db30792bf84aa1af8be7ce0dee6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/UnityPackageWorkflow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs new file mode 100644 index 00000000..525374dc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs @@ -0,0 +1,53 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Uploader.Services.Analytics; +using AssetStoreTools.Uploader.Services.Analytics.Data; +using AssetStoreTools.Uploader.Services.Api; +using System; +using System.Threading.Tasks; +using UnityEngine.Analytics; + +namespace AssetStoreTools.Uploader.Data +{ + internal class WorkflowServices : IWorkflowServices + { + private IPackageDownloadingService _downloadingService; + private IPackageUploadingService _uploadingService; + private IAnalyticsService _analyticsService; + + public WorkflowServices( + IPackageDownloadingService downloadingService, + IPackageUploadingService uploadingService, + IAnalyticsService analyticsService) + { + _downloadingService = downloadingService; + _uploadingService = uploadingService; + _analyticsService = analyticsService; + } + + public Task GetPackageUploadedVersions(IPackage package, int timeoutMs) + { + return _downloadingService.GetPackageUploadedVersions(package, timeoutMs); + } + + public Task UploadPackage(IPackageUploader uploader, IProgress progress) + { + return _uploadingService.UploadPackage(uploader, progress); + } + + public void StopUploading(IPackageUploader uploader) + { + _uploadingService.StopUploading(uploader); + } + + public Task UpdatePackageData(IPackage package) + { + return _downloadingService.UpdatePackageData(package); + } + + public AnalyticsResult SendAnalytic(IAssetStoreAnalytic data) + { + return _analyticsService.Send(data); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs.meta new file mode 100644 index 00000000..535d4494 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a78b96ae30966e94ba9ffdddf19c1692 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Data/WorkflowServices.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services.meta new file mode 100644 index 00000000..6d1acef2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d9787842821f3d041904186d0e0cc61d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics.meta new file mode 100644 index 00000000..30b3cbf5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 17f95678acdb51548908d81be7146b5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs new file mode 100644 index 00000000..a2f6e1e4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs @@ -0,0 +1,45 @@ +using AssetStoreTools.Uploader.Services.Analytics.Data; +using UnityEditor; +using UnityEngine.Analytics; +#if !UNITY_2023_2_OR_NEWER +using AnalyticsConstants = AssetStoreTools.Constants.Uploader.Analytics; +#endif + +namespace AssetStoreTools.Uploader.Services.Analytics +{ + internal class AnalyticsService : IAnalyticsService + { + public AnalyticsResult Send(IAssetStoreAnalytic analytic) + { + if (!EditorAnalytics.enabled) + return AnalyticsResult.AnalyticsDisabled; + + if (!Register(analytic)) + return AnalyticsResult.AnalyticsDisabled; + +#if UNITY_2023_2_OR_NEWER + return EditorAnalytics.SendAnalytic(analytic); +#else + return EditorAnalytics.SendEventWithLimit(analytic.EventName, + analytic.Data, + analytic.EventVersion); +#endif + } + + private bool Register(IAssetStoreAnalytic analytic) + { +#if UNITY_2023_2_OR_NEWER + return true; +#else + var result = EditorAnalytics.RegisterEventWithLimit( + eventName: analytic.EventName, + maxEventPerHour: AnalyticsConstants.MaxEventsPerHour, + maxItems: AnalyticsConstants.MaxNumberOfElements, + vendorKey: AnalyticsConstants.VendorKey, + ver: analytic.EventVersion); + + return result == AnalyticsResult.Ok; +#endif + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs.meta new file mode 100644 index 00000000..0b230a0c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 408b5b0136da9ca4f9598b8688f6210e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/AnalyticsService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data.meta new file mode 100644 index 00000000..59ec0e40 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: df1fca726619f2f4fae3bd93b0ef5a8b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs new file mode 100644 index 00000000..74edf0e0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs @@ -0,0 +1,46 @@ +using AssetStoreTools.Api; +using System; +#if UNITY_2023_2_OR_NEWER +using UnityEngine.Analytics; +#endif +using AnalyticsConstants = AssetStoreTools.Constants.Uploader.Analytics; + +namespace AssetStoreTools.Uploader.Services.Analytics.Data +{ +#if UNITY_2023_2_OR_NEWER + [AnalyticInfo + (eventName: AnalyticsConstants.AuthenticationAnalytics.EventName, + vendorKey: AnalyticsConstants.VendorKey, + version: AnalyticsConstants.AuthenticationAnalytics.EventVersion, + maxEventsPerHour: AnalyticsConstants.MaxEventsPerHour, + maxNumberOfElements: AnalyticsConstants.MaxNumberOfElements)] +#endif + internal class AuthenticationAnalytic : BaseAnalytic + { + [Serializable] + public class AuthenticationAnalyticData : BaseAnalyticData + { + public string AuthenticationType; + public string PublisherId; + } + + public override string EventName => AnalyticsConstants.AuthenticationAnalytics.EventName; + public override int EventVersion => AnalyticsConstants.AuthenticationAnalytics.EventVersion; + + private AuthenticationAnalyticData _data; + + public AuthenticationAnalytic(IAuthenticationType authenticationType, string publisherId) + { + _data = new AuthenticationAnalyticData + { + AuthenticationType = authenticationType.GetType().Name, + PublisherId = publisherId + }; + } + + protected override BaseAnalyticData GetData() + { + return _data; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs.meta new file mode 100644 index 00000000..b7c28ede --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4b9389e3ee578484493d36775c75baa1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/AuthenticationAnalytic.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs new file mode 100644 index 00000000..60c3396b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs @@ -0,0 +1,35 @@ +using System; +#if UNITY_2023_2_OR_NEWER +using UnityEngine.Analytics; +#endif + +namespace AssetStoreTools.Uploader.Services.Analytics.Data +{ + internal abstract class BaseAnalytic : IAssetStoreAnalytic + { + [Serializable] + public class BaseAnalyticData : IAssetStoreAnalyticData + { + public string ToolVersion = Constants.Api.ApiVersion; + } + + public abstract string EventName { get; } + public abstract int EventVersion { get; } + + public IAssetStoreAnalyticData Data => GetData(); + protected abstract BaseAnalyticData GetData(); + +#if UNITY_2023_2_OR_NEWER + public bool TryGatherData(out IAnalytic.IData data, [System.Diagnostics.CodeAnalysis.NotNullWhen(false)] out Exception error) + { + error = null; + data = Data; + + if (data == null) + error = new Exception("Analytic data is null"); + + return error == null; + } +#endif + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs.meta new file mode 100644 index 00000000..a423c7e9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 51ec1e4b6505b694ab01f7c523744fbc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/BaseAnalytic.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs new file mode 100644 index 00000000..5207ca01 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs @@ -0,0 +1,16 @@ +#if UNITY_2023_2_OR_NEWER +using UnityEngine.Analytics; +#endif + +namespace AssetStoreTools.Uploader.Services.Analytics.Data +{ + internal interface IAssetStoreAnalytic +#if UNITY_2023_2_OR_NEWER + : IAnalytic +#endif + { + string EventName { get; } + int EventVersion { get; } + IAssetStoreAnalyticData Data { get; } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs.meta new file mode 100644 index 00000000..18e344dd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6e9b53aa176bbed48bafa538c26df304 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalytic.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs new file mode 100644 index 00000000..e08b8f80 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs @@ -0,0 +1,8 @@ +namespace AssetStoreTools.Uploader.Services.Analytics.Data +{ + interface IAssetStoreAnalyticData +#if UNITY_2023_2_OR_NEWER + : UnityEngine.Analytics.IAnalytic.IData +#endif + { } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs.meta new file mode 100644 index 00000000..a79af8db --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b639e25d9b9abd34d8eb67b0e17dde86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/IAssetStoreAnalyticData.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs new file mode 100644 index 00000000..d8a34793 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs @@ -0,0 +1,72 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Validator.Data; +using System; +#if UNITY_2023_2_OR_NEWER +using UnityEngine.Analytics; +#endif +using AnalyticsConstants = AssetStoreTools.Constants.Uploader.Analytics; + +namespace AssetStoreTools.Uploader.Services.Analytics.Data +{ +#if UNITY_2023_2_OR_NEWER + [AnalyticInfo + (eventName: AnalyticsConstants.PackageUploadAnalytics.EventName, + vendorKey: AnalyticsConstants.VendorKey, + version: AnalyticsConstants.PackageUploadAnalytics.EventVersion, + maxEventsPerHour: AnalyticsConstants.MaxEventsPerHour, + maxNumberOfElements: AnalyticsConstants.MaxNumberOfElements)] +#endif + internal class PackageUploadAnalytic : BaseAnalytic + { + [Serializable] + public class PackageUploadAnalyticData : BaseAnalyticData + { + public string PackageId; + public string Category; + public bool UsedValidator; + public string ValidatorResults; + public string UploadFinishedReason; + public double TimeTaken; + public long PackageSize; + public string Workflow; + public string EndpointUrl; + } + + public override string EventName => AnalyticsConstants.PackageUploadAnalytics.EventName; + public override int EventVersion => AnalyticsConstants.PackageUploadAnalytics.EventVersion; + + private PackageUploadAnalyticData _data; + + public PackageUploadAnalytic( + string packageId, + string category, + bool usedValidator, + ValidationSettings validationSettings, + ValidationResult validationResult, + UploadStatus uploadFinishedReason, + double timeTaken, + long packageSize, + string workflow + ) + { + _data = new PackageUploadAnalyticData() + { + PackageId = packageId, + Category = category, + UsedValidator = usedValidator, + ValidatorResults = usedValidator ? + ValidationResultsSerializer.ConstructValidationResultsJson(validationSettings, validationResult) : null, + UploadFinishedReason = uploadFinishedReason.ToString(), + TimeTaken = timeTaken, + PackageSize = packageSize, + Workflow = workflow, + EndpointUrl = Constants.Api.AssetStoreBaseUrl + }; + } + + protected override BaseAnalyticData GetData() + { + return _data; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs.meta new file mode 100644 index 00000000..6e329ebc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6cc34de12dce9964b9c900d5bb159966 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/PackageUploadAnalytic.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs new file mode 100644 index 00000000..1bb7b56a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs @@ -0,0 +1,91 @@ +using AssetStoreTools.Validator.Data; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System.Collections.Generic; +using System.Reflection; + +namespace AssetStoreTools.Uploader.Services.Analytics.Data +{ + internal class ValidationResultsSerializer + { + private class ValidationResults + { + public bool HasCompilationErrors; + public string[] Paths; + public Dictionary Results; + } + + private class TestResultOutcome + { + public int IntegerValue; + public string StringValue; + + public TestResultOutcome(TestResultStatus status) + { + IntegerValue = (int)status; + StringValue = status.ToString(); + } + } + + private class ValidationResultsResolver : DefaultContractResolver + { + private static ValidationResultsResolver _instance; + public static ValidationResultsResolver Instance => _instance ?? (_instance = new ValidationResultsResolver()); + + private Dictionary _propertyConversion; + + private ValidationResultsResolver() + { + _propertyConversion = new Dictionary() + { + { nameof(ValidationResults.HasCompilationErrors), "has_compilation_errors" }, + { nameof(ValidationResults.Paths), "validation_paths" }, + { nameof(ValidationResults.Results), "validation_results" }, + { nameof(TestResultOutcome.IntegerValue), "int" }, + { nameof(TestResultOutcome.StringValue), "string" }, + }; + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + var property = base.CreateProperty(member, memberSerialization); + if (_propertyConversion.ContainsKey(property.PropertyName)) + property.PropertyName = _propertyConversion[property.PropertyName]; + + return property; + } + } + + public static string ConstructValidationResultsJson(ValidationSettings settings, ValidationResult result) + { + if (result == null) + return string.Empty; + + var resultObject = new ValidationResults(); + resultObject.HasCompilationErrors = result.HadCompilationErrors; + + switch (settings) + { + case CurrentProjectValidationSettings currentProjectValidationSettings: + resultObject.Paths = currentProjectValidationSettings.ValidationPaths.ToArray(); + break; + case ExternalProjectValidationSettings externalProjectValidationSettings: + resultObject.Paths = new string[] { externalProjectValidationSettings.PackagePath }; + break; + } + + resultObject.Results = new Dictionary(); + foreach (var test in result.Tests) + { + resultObject.Results.Add(test.Id.ToString(), new TestResultOutcome(test.Result.Status)); + } + + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = ValidationResultsResolver.Instance + }; + + return JsonConvert.SerializeObject(resultObject, serializerSettings); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs.meta new file mode 100644 index 00000000..0dddcc24 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: fa15fc27c7f3d044884885b3dad73efc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/Data/ValidationResultsSerializer.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs new file mode 100644 index 00000000..a64dce1e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs @@ -0,0 +1,10 @@ +using AssetStoreTools.Uploader.Services.Analytics.Data; +using UnityEngine.Analytics; + +namespace AssetStoreTools.Uploader.Services.Analytics +{ + internal interface IAnalyticsService : IUploaderService + { + AnalyticsResult Send(IAssetStoreAnalytic analytic); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs.meta new file mode 100644 index 00000000..2924eab0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: faa1f39fc83b86b438f6e0f34f01167b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Analytics/IAnalyticsService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api.meta new file mode 100644 index 00000000..7075aa49 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4d983b64bd0866a428f937434252f537 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs new file mode 100644 index 00000000..e0028182 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs @@ -0,0 +1,100 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Models; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Uploader.Services.Analytics; +using AssetStoreTools.Uploader.Services.Analytics.Data; +using AssetStoreTools.Utility; +using System; +using System.Threading.Tasks; +using UnityEditor; + +namespace AssetStoreTools.Uploader.Services.Api +{ + internal class AuthenticationService : IAuthenticationService + { + private IAssetStoreApi _api; + private ICachingService _cachingService; + private IAnalyticsService _analyticsService; + + public User User { get; private set; } + + public AuthenticationService(IAssetStoreApi api, ICachingService cachingService, IAnalyticsService analyticsService) + { + _api = api; + _cachingService = cachingService; + _analyticsService = analyticsService; + } + + public async Task AuthenticateWithCredentials(string email, string password) + { + var authenticationType = new CredentialsAuthentication(email, password); + return await Authenticate(authenticationType); + } + + public async Task AuthenticateWithSessionToken() + { + if (!_cachingService.GetCachedSessionToken(out var cachedSessionToken)) + { + return new AuthenticationResponse() { Success = false, Exception = new Exception("No cached session token found") }; + } + + var authenticationType = new SessionAuthentication(cachedSessionToken); + return await Authenticate(authenticationType); + } + + public async Task AuthenticateWithCloudToken() + { + var authenticationType = new CloudTokenAuthentication(CloudProjectSettings.accessToken); + return await Authenticate(authenticationType); + } + + private async Task Authenticate(IAuthenticationType authenticationType) + { + var response = await _api.Authenticate(authenticationType); + HandleLoginResponse(authenticationType, response); + return response; + } + + private void HandleLoginResponse(IAuthenticationType authenticationType, AuthenticationResponse response) + { + if (!response.Success) + { + Deauthenticate(); + return; + } + + User = response.User; + _cachingService.CacheSessionToken(User.SessionId); + SendAnalytics(authenticationType, User); + } + + public bool CloudAuthenticationAvailable(out string username, out string cloudToken) + { + username = CloudProjectSettings.userName; + cloudToken = CloudProjectSettings.accessToken; + return !username.Equals("anonymous"); + } + + public void Deauthenticate() + { + _api.Deauthenticate(); + + User = null; + _cachingService.ClearCachedSessionToken(); + } + + private void SendAnalytics(IAuthenticationType authenticationType, User user) + { + try + { + // Do not send session authentication events + if (authenticationType is SessionAuthentication) + return; + + var analytic = new AuthenticationAnalytic(authenticationType, user.PublisherId); + var result = _analyticsService.Send(analytic); + } + catch (Exception e) { ASDebug.LogError($"Could not send analytics: {e}"); } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs.meta new file mode 100644 index 00000000..8aa49830 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c1c3d6578d298d049a8dcf858fd3686e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/AuthenticationService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs new file mode 100644 index 00000000..96c9ee3d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs @@ -0,0 +1,16 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Api.Responses; +using System.Threading.Tasks; + +namespace AssetStoreTools.Uploader.Services.Api +{ + internal interface IAuthenticationService : IUploaderService + { + User User { get; } + Task AuthenticateWithCredentials(string email, string password); + Task AuthenticateWithSessionToken(); + Task AuthenticateWithCloudToken(); + bool CloudAuthenticationAvailable(out string username, out string cloudToken); + void Deauthenticate(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs.meta new file mode 100644 index 00000000..ecf573fe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ff0518dc0d95d3540857d138215bb900 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IAuthenticationService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs new file mode 100644 index 00000000..4cef2c0f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs @@ -0,0 +1,16 @@ +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Uploader.Data; +using System.Threading.Tasks; + +namespace AssetStoreTools.Uploader.Services.Api +{ + internal interface IPackageDownloadingService : IUploaderService + { + Task GetPackageData(); + Task UpdatePackageData(IPackage package); + void ClearPackageData(); + Task GetPackageThumbnail(IPackage package); + Task GetPackageUploadedVersions(IPackage package, int timeoutMs); + void StopDownloading(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs.meta new file mode 100644 index 00000000..0471c598 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 96acd12a628311d429cc285f418f8b90 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageDownloadingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs new file mode 100644 index 00000000..f1ff1d4c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs @@ -0,0 +1,16 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using System; +using System.Threading.Tasks; + +namespace AssetStoreTools.Uploader.Services.Api +{ + internal interface IPackageUploadingService : IUploaderService + { + bool IsUploading { get; } + + Task UploadPackage(IPackageUploader uploader, IProgress progress); + void StopUploading(IPackageUploader package); + void StopAllUploadinng(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs.meta new file mode 100644 index 00000000..b3fd4373 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9a3d78f3bc68d3d44b4300bc8ffe69c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/IPackageUploadingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs new file mode 100644 index 00000000..5ab052fa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs @@ -0,0 +1,109 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Uploader.Data; +using System.Threading; +using System.Threading.Tasks; + +namespace AssetStoreTools.Uploader.Services.Api +{ + internal class PackageDownloadingService : IPackageDownloadingService + { + public const int MaxConcurrentTumbnailDownloads = 10; + + private IAssetStoreApi _api; + private ICachingService _cachingService; + + private int _currentDownloads; + private CancellationTokenSource _cancellationTokenSource; + + public PackageDownloadingService(IAssetStoreApi api, ICachingService cachingService) + { + _api = api; + _cachingService = cachingService; + _cancellationTokenSource = new CancellationTokenSource(); + } + + public void ClearPackageData() + { + _cachingService.DeletePackageMetadata(); + } + + public async Task GetPackageData() + { + if (!_cachingService.GetCachedPackageMetadata(out var models)) + { + var cancellationToken = _cancellationTokenSource.Token; + var packagesResponse = await _api.GetPackages(cancellationToken); + + if (packagesResponse.Cancelled || !packagesResponse.Success) + return packagesResponse; + + _cachingService.CachePackageMetadata(packagesResponse.Packages); + return packagesResponse; + } + + return new PackagesDataResponse() { Success = true, Packages = models }; + } + + public async Task UpdatePackageData(IPackage package) + { + var response = await _api.RefreshPackageMetadata(package.ToModel()); + + if (response.Success) + _cachingService.UpdatePackageMetadata(response.Package); + + return response; + } + + public async Task GetPackageThumbnail(IPackage package) + { + if (_cachingService.GetCachedPackageThumbnail(package.PackageId, out var cachedTexture)) + { + return new PackageThumbnailResponse() { Success = true, Thumbnail = cachedTexture }; + } + + var cancellationToken = _cancellationTokenSource.Token; + while (_currentDownloads >= MaxConcurrentTumbnailDownloads) + await Task.Delay(100); + + if (cancellationToken.IsCancellationRequested) + return new PackageThumbnailResponse() { Success = false, Cancelled = true }; + + _currentDownloads++; + var result = await _api.GetPackageThumbnail(package.ToModel(), cancellationToken); + _currentDownloads--; + + if (result.Success && result.Thumbnail != null) + _cachingService.CachePackageThumbnail(package.PackageId, result.Thumbnail); + + return result; + } + + public async Task GetPackageUploadedVersions(IPackage package, int timeoutMs) + { + var timeoutTokenSource = new CancellationTokenSource(); + try + { + var versionsTask = _api.GetPackageUploadedVersions(package.ToModel(), timeoutTokenSource.Token); + + // Wait for versions to be retrieved, or a timeout to occur, whichever is first + if (await Task.WhenAny(versionsTask, Task.Delay(timeoutMs)) != versionsTask) + { + timeoutTokenSource.Cancel(); + } + + return await versionsTask; + } + finally + { + timeoutTokenSource.Dispose(); + } + } + + public void StopDownloading() + { + _cancellationTokenSource.Cancel(); + _cancellationTokenSource = new CancellationTokenSource(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs.meta new file mode 100644 index 00000000..7ff441da --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: adc44e974cb91b54fac3819284b7ba82 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageDownloadingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs new file mode 100644 index 00000000..53da1bb5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs @@ -0,0 +1,103 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using UnityEditor; + +namespace AssetStoreTools.Uploader.Services.Api +{ + internal class PackageUploadingService : IPackageUploadingService + { + private class UploadInProgress + { + public IPackageUploader Uploader; + public IProgress Progress = new Progress(); + public CancellationTokenSource CancellationTokenSource = new CancellationTokenSource(); + + public UploadInProgress(IPackageUploader uploader, IProgress progress) + { + Uploader = uploader; + Progress = progress; + CancellationTokenSource = new CancellationTokenSource(); + } + } + + private IAssetStoreApi _api; + private List _uploadsInProgress; + + public bool IsUploading => _uploadsInProgress.Count > 0; + + public PackageUploadingService(IAssetStoreApi api) + { + _api = api; + _uploadsInProgress = new List(); + } + + public async Task UploadPackage(IPackageUploader uploader, IProgress progress) + { + using (var cancellationTokenSource = new CancellationTokenSource()) + { + var uploadInProgress = StartTrackingUpload(uploader, progress); + var response = await _api.UploadPackage(uploadInProgress.Uploader, uploadInProgress.Progress, uploadInProgress.CancellationTokenSource.Token); + StopTrackingUpload(uploadInProgress); + + return response; + } + } + + private UploadInProgress StartTrackingUpload(IPackageUploader uploader, IProgress progress) + { + // If this is the first upload - lock reload assemblies and prevent entering play mode + if (_uploadsInProgress.Count == 0) + { + EditorApplication.LockReloadAssemblies(); + EditorApplication.playModeStateChanged += PreventEnteringPlayMode; + } + + var uploadInProgress = new UploadInProgress(uploader, progress); + _uploadsInProgress.Add(uploadInProgress); + + return uploadInProgress; + } + + private void StopTrackingUpload(UploadInProgress uploadInProgress) + { + _uploadsInProgress.Remove(uploadInProgress); + + // If this was the last upload - unlock reload assemblies and allow entering play mode + if (_uploadsInProgress.Count > 0) + return; + + EditorApplication.UnlockReloadAssemblies(); + EditorApplication.playModeStateChanged -= PreventEnteringPlayMode; + } + + private void PreventEnteringPlayMode(PlayModeStateChange change) + { + if (change != PlayModeStateChange.ExitingEditMode) + return; + + EditorApplication.ExitPlaymode(); + EditorUtility.DisplayDialog("Notice", "Entering Play Mode is not allowed while there's a package upload in progress.\n\n" + + "Please wait until the upload is finished or cancel the upload from the Asset Store Uploader window", "OK"); + } + + public void StopUploading(IPackageUploader uploader) + { + var uploadInProgress = _uploadsInProgress.FirstOrDefault(x => x.Uploader == uploader); + if (uploadInProgress == null) + return; + + uploadInProgress.CancellationTokenSource.Cancel(); + } + + public void StopAllUploadinng() + { + foreach (var uploadInProgress in _uploadsInProgress) + uploadInProgress.CancellationTokenSource.Cancel(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs.meta new file mode 100644 index 00000000..54f5defb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 22e23997fe339a74bb5355d6a88ce731 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Api/PackageUploadingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching.meta new file mode 100644 index 00000000..7267ddb5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a834946d92154754493879c5fcc7dbc9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs new file mode 100644 index 00000000..c86ee80e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs @@ -0,0 +1,157 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Uploader.Data.Serialization; +using AssetStoreTools.Utility; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.Services +{ + internal class CachingService : ICachingService + { + private VisualElement _cachedUploaderWindow; + + public bool GetCachedUploaderWindow(out VisualElement uploaderWindow) + { + uploaderWindow = _cachedUploaderWindow; + return uploaderWindow != null; + } + + public void CacheUploaderWindow(VisualElement uploaderWindow) + { + _cachedUploaderWindow = uploaderWindow; + } + + public void CacheSessionToken(string sessionToken) + { + if (string.IsNullOrEmpty(sessionToken)) + throw new ArgumentException("Session token cannot be null"); + + EditorPrefs.SetString(Constants.Cache.SessionTokenKey, sessionToken); + } + + public bool GetCachedSessionToken(out string sessionToken) + { + sessionToken = EditorPrefs.GetString(Constants.Cache.SessionTokenKey, string.Empty); + return !string.IsNullOrEmpty(sessionToken); + } + + public void ClearCachedSessionToken() + { + EditorPrefs.DeleteKey(Constants.Cache.SessionTokenKey); + } + + public bool GetCachedPackageMetadata(out List data) + { + data = new List(); + if (!CacheUtil.GetFileFromTempCache(Constants.Cache.PackageDataFileName, out var filePath)) + return false; + + try + { + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = Package.CachedPackageResolver.Instance + }; + + data = JsonConvert.DeserializeObject>(File.ReadAllText(filePath, Encoding.UTF8), serializerSettings); + return true; + } + catch + { + return false; + } + } + + public void CachePackageMetadata(List data) + { + if (data == null) + throw new ArgumentException("Package data cannot be null"); + + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = Package.CachedPackageResolver.Instance, + Formatting = Formatting.Indented + }; + + CacheUtil.CreateFileInTempCache(Constants.Cache.PackageDataFileName, JsonConvert.SerializeObject(data, serializerSettings), true); + } + + public void DeletePackageMetadata() + { + CacheUtil.DeleteFileFromTempCache(Constants.Cache.PackageDataFileName); + } + + public void UpdatePackageMetadata(Package data) + { + if (!GetCachedPackageMetadata(out var cachedData)) + return; + + var index = cachedData.FindIndex(x => x.PackageId.Equals(data.PackageId)); + if (index == -1) + { + cachedData.Add(data); + } + else + { + cachedData.RemoveAt(index); + cachedData.Insert(index, data); + } + + CachePackageMetadata(cachedData); + } + + public bool GetCachedPackageThumbnail(string packageId, out Texture2D texture) + { + texture = null; + if (!CacheUtil.GetFileFromTempCache(Constants.Cache.PackageThumbnailFileName(packageId), out var filePath)) + return false; + + texture = new Texture2D(1, 1); + texture.LoadImage(File.ReadAllBytes(filePath)); + return true; + } + + public void CachePackageThumbnail(string packageId, Texture2D texture) + { + CacheUtil.CreateFileInTempCache(Constants.Cache.PackageThumbnailFileName(packageId), texture.EncodeToPNG(), true); + } + + public bool GetCachedWorkflowStateData(string packageId, out WorkflowStateData data) + { + data = null; + + if (string.IsNullOrEmpty(packageId)) + return false; + + if (!CacheUtil.GetFileFromPersistentCache(Constants.Cache.WorkflowStateDataFileName(packageId), out var filePath)) + return false; + + try + { + data = JsonConvert.DeserializeObject(File.ReadAllText(filePath, Encoding.UTF8)); + if (string.IsNullOrEmpty(data.GetPackageId())) + return false; + } + catch + { + return false; + } + + return true; + } + + public void CacheWorkflowStateData(WorkflowStateData data) + { + if (data == null) + throw new ArgumentException("Workflow state data cannot be null"); + + CacheUtil.CreateFileInPersistentCache(Constants.Cache.WorkflowStateDataFileName(data.GetPackageId()), JsonConvert.SerializeObject(data, Formatting.Indented), true); + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs.meta new file mode 100644 index 00000000..0999689e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: fffaed09a3f76f945a7ececfb355f3e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/CachingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs new file mode 100644 index 00000000..10772814 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs @@ -0,0 +1,25 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Uploader.Data.Serialization; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.Services +{ + internal interface ICachingService : IUploaderService + { + void CacheUploaderWindow(VisualElement uploaderWindow); + bool GetCachedUploaderWindow(out VisualElement uploaderWindow); + void CacheSessionToken(string sessionToken); + bool GetCachedSessionToken(out string sessionToken); + void ClearCachedSessionToken(); + bool GetCachedPackageMetadata(out List data); + void UpdatePackageMetadata(Package data); + void CachePackageMetadata(List data); + void DeletePackageMetadata(); + bool GetCachedPackageThumbnail(string packageId, out Texture2D texture); + void CachePackageThumbnail(string packageId, Texture2D texture); + bool GetCachedWorkflowStateData(string packageId, out WorkflowStateData data); + void CacheWorkflowStateData(WorkflowStateData data); + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs.meta new file mode 100644 index 00000000..2af6a1de --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a904477679e07bc4889bc15e894c0c48 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/Caching/ICachingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs new file mode 100644 index 00000000..424dd9c0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs @@ -0,0 +1,4 @@ +namespace AssetStoreTools.Uploader.Services +{ + internal interface IUploaderService { } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs.meta new file mode 100644 index 00000000..ee2c2d3d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 757d7a4dc29863740859c936be514fea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/IUploaderService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory.meta new file mode 100644 index 00000000..cb9e723a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02e4a5ee9e2fb7941b876b207078e01d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs new file mode 100644 index 00000000..83c9c489 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs @@ -0,0 +1,18 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Uploader.Data.Serialization; +using System.Collections.Generic; +using PackageModel = AssetStoreTools.Api.Models.Package; + +namespace AssetStoreTools.Uploader.Services +{ + internal interface IPackageFactoryService : IUploaderService + { + IPackageGroup CreatePackageGroup(string groupName, List packages); + IPackage CreatePackage(PackageModel packageModel); + IPackageContent CreatePackageContent(IPackage package); + List CreateWorkflows(IPackage package, WorkflowStateData stateData); + AssetsWorkflow CreateAssetsWorkflow(IPackage package, AssetsWorkflowState stateData); + UnityPackageWorkflow CreateUnityPackageWorkflow(IPackage package, UnityPackageWorkflowState stateData); + HybridPackageWorkflow CreateHybridPackageWorkflow(IPackage package, HybridPackageWorkflowState stateData); + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs.meta new file mode 100644 index 00000000..e1084507 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 14324b71768a1ea499baa06de33f05af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/IPackageFactoryService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs new file mode 100644 index 00000000..a9fffa5e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs @@ -0,0 +1,95 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Uploader.Data.Serialization; +using AssetStoreTools.Uploader.Services.Analytics; +using AssetStoreTools.Uploader.Services.Api; +using System.Collections.Generic; +using PackageModel = AssetStoreTools.Api.Models.Package; + +namespace AssetStoreTools.Uploader.Services +{ + internal class PackageFactoryService : IPackageFactoryService + { + private IWorkflowServices _workflowServices; + + // Service dependencies + private ICachingService _cachingService; + private IPackageDownloadingService _packageDownloadingService; + private IPackageUploadingService _packageUploadingService; + private IAnalyticsService _analyticsService; + + public PackageFactoryService( + ICachingService cachingService, + IPackageDownloadingService packageDownloadingService, + IPackageUploadingService packageUploadingService, + IAnalyticsService analyticsService + ) + { + _cachingService = cachingService; + _packageDownloadingService = packageDownloadingService; + _packageUploadingService = packageUploadingService; + _analyticsService = analyticsService; + + _workflowServices = new WorkflowServices(_packageDownloadingService, _packageUploadingService, _analyticsService); + } + + public IPackage CreatePackage(PackageModel packageModel) + { + var package = new Package(packageModel); + return package; + } + + public IPackageGroup CreatePackageGroup(string groupName, List packages) + { + return new PackageGroup(groupName, packages); + } + + public IPackageContent CreatePackageContent(IPackage package) + { + if (!package.IsDraft) + return null; + + WorkflowStateData stateData = GetOrCreateWorkflowStateData(package); + + var workflows = CreateWorkflows(package, stateData); + var packageContent = new PackageContent(workflows, stateData, _cachingService); + return packageContent; + } + + public List CreateWorkflows(IPackage package, WorkflowStateData stateData) + { + var workflows = new List + { + CreateAssetsWorkflow(package, stateData.GetAssetsWorkflowState()), + CreateUnityPackageWorkflow(package, stateData.GetUnityPackageWorkflowState()), +#if UNITY_ASTOOLS_EXPERIMENTAL + CreateHybridPackageWorkflow(package, stateData.GetHybridPackageWorkflowState()), +#endif + }; + + return workflows; + } + + public AssetsWorkflow CreateAssetsWorkflow(IPackage package, AssetsWorkflowState stateData) + { + return new AssetsWorkflow(package, stateData, _workflowServices); + } + + public UnityPackageWorkflow CreateUnityPackageWorkflow(IPackage package, UnityPackageWorkflowState stateData) + { + return new UnityPackageWorkflow(package, stateData, _workflowServices); + } + + public HybridPackageWorkflow CreateHybridPackageWorkflow(IPackage package, HybridPackageWorkflowState stateData) + { + return new HybridPackageWorkflow(package, stateData, _workflowServices); + } + + private WorkflowStateData GetOrCreateWorkflowStateData(IPackage package) + { + if (!_cachingService.GetCachedWorkflowStateData(package.PackageId, out var stateData)) + stateData = new WorkflowStateData(package.PackageId); + + return stateData; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs.meta new file mode 100644 index 00000000..86dfc2c3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4074a5b21b6201d449974dcfb652a00b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/PackageFactory/PackageFactoryService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs new file mode 100644 index 00000000..0aaa6866 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs @@ -0,0 +1,26 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Uploader.Services.Analytics; +using AssetStoreTools.Uploader.Services.Api; +using AssetStoreTools.Utility; + +namespace AssetStoreTools.Uploader.Services +{ + internal class UploaderServiceProvider : ServiceProvider + { + public static UploaderServiceProvider Instance => _instance ?? (_instance = new UploaderServiceProvider()); + private static UploaderServiceProvider _instance; + + private UploaderServiceProvider() { } + + protected override void RegisterServices() + { + var api = new AssetStoreApi(new AssetStoreClient()); + Register(); + Register(); + Register(() => new AuthenticationService(api, GetService(), GetService())); + Register(() => new PackageDownloadingService(api, GetService())); + Register(() => new PackageUploadingService(api)); + Register(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs.meta new file mode 100644 index 00000000..298a1cfe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e66f9c7f198baff41ba77f4d0ed7b60f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/Services/UploaderServiceProvider.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI.meta new file mode 100644 index 00000000..e39a22fb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed759a6e886dbfd4fbcecc2beb7248b8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements.meta new file mode 100644 index 00000000..497fc1d7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d14df9cf4e7e9b54c8c94a8cc1aa70c0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions.meta new file mode 100644 index 00000000..9ec9955e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 144a518ff26df1e41845217c0f0002d7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs new file mode 100644 index 00000000..27957b2c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs @@ -0,0 +1,170 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Validator.Data; +using System.Linq; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal abstract class ValidationElementBase : VisualElement + { + // Data + protected IWorkflow Workflow; + + // UI + protected VisualElement ResultsBox; + protected Image ResultsBoxImage; + protected Label ResultsBoxLabel; + + protected ValidationElementBase(IWorkflow workflow) + { + Workflow = workflow; + Create(); + } + + private void Create() + { + CreateInfoRow(); + CreateResultsBox(); + } + + private void CreateInfoRow() + { + VisualElement validatorButtonRow = new VisualElement(); + validatorButtonRow.AddToClassList("package-content-option-box"); + + VisualElement validatorLabelHelpRow = new VisualElement(); + validatorLabelHelpRow.AddToClassList("package-content-option-label-help-row"); + + Label validatorLabel = new Label { text = "Validation" }; + Image validatorLabelTooltip = new Image + { + tooltip = "You can use the Asset Store Validator to check your package for common publishing issues" + }; + + var validateButton = new Button(Validate) { name = "ValidateButton", text = "Validate" }; + + validatorLabelHelpRow.Add(validatorLabel); + validatorLabelHelpRow.Add(validatorLabelTooltip); + + validatorButtonRow.Add(validatorLabelHelpRow); + validatorButtonRow.Add(validateButton); + + Add(validatorButtonRow); + } + + private void CreateResultsBox() + { + ResultsBox = new Box { name = "InfoBox" }; + ResultsBox.style.display = DisplayStyle.None; + ResultsBox.AddToClassList("validation-result-box"); + + ResultsBoxImage = new Image(); + ResultsBoxLabel = new Label { name = "ValidationLabel" }; + + ResultsBox.Add(ResultsBoxImage); + ResultsBox.Add(ResultsBoxLabel); + + Add(ResultsBox); + } + + protected virtual bool ConfirmValidation() + { + // Child classes can implement pre-validation prompts + return true; + } + + private void Validate() + { + if (!ConfirmValidation()) + return; + + var validationResult = Workflow.Validate(); + + if (validationResult.Status == ValidationStatus.Cancelled) + return; + + if (validationResult.Status != ValidationStatus.RanToCompletion) + { + EditorUtility.DisplayDialog("Validation failed", $"Package validation failed: {validationResult.Exception.Message}", "OK"); + return; + } + + DisplayResult(validationResult); + } + + private void DisplayResult(ValidationResult result) + { + ResultsBox.style.display = DisplayStyle.Flex; + UpdateValidationResultImage(result); + UpdateValidationResultLabel(result); + } + + public void HideResult() + { + ResultsBox.style.display = DisplayStyle.None; + } + + protected void UpdateValidationResultImage(ValidationResult result) + { + switch (GetValidationSummaryStatus(result)) + { + case TestResultStatus.Pass: + ResultsBoxImage.image = EditorGUIUtility.IconContent("console.infoicon@2x").image; + break; + case TestResultStatus.Warning: + ResultsBoxImage.image = EditorGUIUtility.IconContent("console.warnicon@2x").image; + break; + case TestResultStatus.Fail: + ResultsBoxImage.image = EditorGUIUtility.IconContent("console.erroricon@2x").image; + break; + default: + ResultsBoxImage.image = EditorGUIUtility.IconContent("_Help@2x").image; + break; + } + } + + private void UpdateValidationResultLabel(ValidationResult result) + { + var errorCount = result.Tests.Where(x => x.Result.Status == TestResultStatus.Fail).Count(); + var warningCount = result.Tests.Where(x => x.Result.Status == TestResultStatus.Warning).Count(); + + string text = string.Empty; + if (result.HadCompilationErrors) + { + text += "- Package caused compilation errors\n"; + } + if (errorCount > 0) + { + text += $"- Validation reported {errorCount} error(s)\n"; + } + if (warningCount > 0) + { + text += $"- Validation reported {warningCount} warning(s)\n"; + } + + if (string.IsNullOrEmpty(text)) + { + text = "No issues were found!"; + } + else + { + text = text.Substring(0, text.Length - "\n".Length); + } + + ResultsBoxLabel.text = text; + } + + private TestResultStatus GetValidationSummaryStatus(ValidationResult result) + { + if (result.HadCompilationErrors || + result.Tests.Any(x => x.Result.Status == TestResultStatus.Fail)) + return TestResultStatus.Fail; + + if (result.Tests.Any(x => x.Result.Status == TestResultStatus.Warning)) + return TestResultStatus.Warning; + + return TestResultStatus.Pass; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs.meta new file mode 100644 index 00000000..d8cbc88f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cb20404763eac7144b562c18ad1c37fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/ValidationElementBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs new file mode 100644 index 00000000..f4b22b78 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs @@ -0,0 +1,151 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal abstract class WorkflowElementBase : VisualElement + { + // Data + protected IWorkflow Workflow; + public string Name => Workflow.Name; + public string DisplayName => Workflow.DisplayName; + + // UI Elements that all workflows have + protected PathSelectionElement PathSelectionElement; + protected PreviewGenerationElement PreviewGenerationElement; + protected ValidationElementBase ValidationElement; + protected PackageUploadElement UploadElement; + + public event Action OnInteractionAvailable; + public event Action OnInteractionUnavailable; + + public WorkflowElementBase(IWorkflow workflow) + { + Workflow = workflow; + } + + protected void CreatePathElement(string labelText, string labelTooltip) + { + PathSelectionElement = new PathSelectionElement(labelText, labelTooltip); + PathSelectionElement.OnBrowse += BrowsePath; + Add(PathSelectionElement); + } + + protected void CreatePreviewGenerationElement() + { + PreviewGenerationElement = new PreviewGenerationElement(Workflow); + PreviewGenerationElement.style.display = DisplayStyle.None; + var callback = new Action(() => + PreviewGenerationElement.style.display = ASToolsPreferences.Instance.UseLegacyExporting + ? DisplayStyle.None + : DisplayStyle.Flex); + RegisterCallback((_) => { ASToolsPreferences.OnSettingsChange += callback; }); + RegisterCallback((_) => { ASToolsPreferences.OnSettingsChange -= callback; }); + Add(PreviewGenerationElement); + } + + protected void CreateValidationElement(ValidationElementBase validationElement) + { + ValidationElement = validationElement; + ValidationElement.style.display = DisplayStyle.None; + Add(ValidationElement); + } + + protected void CreateUploadElement(IWorkflow workflow, bool exposeExportButton) + { + UploadElement = new PackageUploadElement(workflow, exposeExportButton); + UploadElement.OnInteractionAvailable += EnableInteraction; + UploadElement.OnInteractionUnavailable += DisableInteraction; + UploadElement.style.display = DisplayStyle.None; + Add(UploadElement); + } + + protected abstract void BrowsePath(); + + protected void SetPathSelectionTextField(string value) + { + if (string.IsNullOrEmpty(value)) + return; + + PathSelectionElement.SetPath(value); + ValidationElement.style.display = DisplayStyle.Flex; + UploadElement.style.display = DisplayStyle.Flex; + + if (PreviewGenerationElement != null && !ASToolsPreferences.Instance.UseLegacyExporting) + { + PreviewGenerationElement.style.display = DisplayStyle.Flex; + } + } + + protected void CheckForMissingMetas(IEnumerable paths) + { + bool displayDialog = ASToolsPreferences.Instance.DisplayHiddenMetaDialog && FileUtility.IsMissingMetaFiles(paths); + if (!displayDialog) + return; + + var selectedOption = EditorUtility.DisplayDialogComplex( + "Notice", + "Your package includes hidden folders which do not contain meta files. " + + "Hidden folders will not be exported unless they contain meta files.\n\nWould you like meta files to be generated?", + "Yes", "No", "No and do not display this again"); + + switch (selectedOption) + { + case 0: + try + { + FileUtility.GenerateMetaFiles(paths); + EditorUtility.DisplayDialog( + "Success", + "Meta files have been generated. Please note that further manual tweaking may be required to set up correct references", + "OK"); + } + catch (Exception e) + { + EditorUtility.DisplayDialog( + "Error", + $"Meta file generation failed: {e.Message}", + "OK" + ); + } + break; + case 1: + // Do nothing + return; + case 2: + ASToolsPreferences.Instance.DisplayHiddenMetaDialog = false; + ASToolsPreferences.Instance.Save(); + return; + } + } + + public bool Is(IWorkflow workflow) + { + return Workflow == workflow; + } + + protected virtual void EnableInteraction() + { + PathSelectionElement.SetEnabled(true); + ValidationElement.SetEnabled(true); + PreviewGenerationElement?.SetEnabled(true); + UploadElement.SetEnabled(true); + OnInteractionAvailable?.Invoke(); + } + + protected virtual void DisableInteraction() + { + PathSelectionElement.SetEnabled(false); + ValidationElement.SetEnabled(false); + PreviewGenerationElement?.SetEnabled(false); + UploadElement.SetEnabled(false); + OnInteractionUnavailable?.Invoke(); + } + + protected abstract void Deserialize(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs.meta new file mode 100644 index 00000000..60d00d41 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 45d1bf267c3ea9048bfdd75d0d19c8bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/Abstractions/WorkflowElementBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs new file mode 100644 index 00000000..393c4aa6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs @@ -0,0 +1,102 @@ +using AssetStoreTools.Api.Models; +using System; +using System.Threading.Tasks; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class AccountToolbar : VisualElement + { + private Image _accountImage; + private Label _accountEmailLabel; + private Button _refreshButton; + + public event Func OnRefresh; + public event Action OnLogout; + + public AccountToolbar() + { + Create(); + } + + private void Create() + { + AddToClassList("account-toolbar"); + + // Left side of the toolbar + VisualElement leftSideContainer = new VisualElement { name = "LeftSideContainer" }; + leftSideContainer.AddToClassList("account-toolbar-left-side-container"); + + _accountImage = new Image(); + _accountImage.AddToClassList("account-toolbar-user-image"); + + _accountEmailLabel = new Label() { name = "AccountEmail" }; + _accountEmailLabel.AddToClassList("account-toolbar-email-label"); + + leftSideContainer.Add(_accountImage); + leftSideContainer.Add(_accountEmailLabel); + + // Right side of the toolbar + VisualElement rightSideContainer = new VisualElement { name = "RightSideContainer" }; + rightSideContainer.AddToClassList("account-toolbar-right-side-container"); + + // Refresh button + _refreshButton = new Button(Refresh) { name = "RefreshButton", text = "Refresh" }; + _refreshButton.AddToClassList("account-toolbar-button-refresh"); + + // Logout button + var logoutButton = new Button(Logout) { name = "LogoutButton", text = "Log out" }; + logoutButton.AddToClassList("account-toolbar-button-logout"); + + rightSideContainer.Add(_refreshButton); + rightSideContainer.Add(logoutButton); + + // Constructing the final toolbar + Add(leftSideContainer); + Add(rightSideContainer); + } + + private async void Refresh() + { + _refreshButton.SetEnabled(false); + await OnRefresh?.Invoke(); + _refreshButton.SetEnabled(true); + } + + private void Logout() + { + OnLogout?.Invoke(); + } + + public void SetUser(User user) + { + if (user == null) + { + _accountEmailLabel.text = string.Empty; + _accountImage.tooltip = string.Empty; + return; + } + + var userEmail = !string.IsNullOrEmpty(user.Username) ? user.Username : "Unknown"; + var publisherName = !string.IsNullOrEmpty(user.Name) ? user.Name : "Unknown"; + var publisherId = !string.IsNullOrEmpty(user.PublisherId) ? user.PublisherId : "Unknown"; + var userInfo = + $"Username: {userEmail}\n" + + $"Publisher Name: {publisherName}\n" + + $"Publisher ID: {publisherId}"; + + _accountEmailLabel.text = userEmail; + _accountImage.tooltip = userInfo; + } + + public void EnableButtons() + { + _refreshButton.SetEnabled(true); + } + + public void DisableButtons() + { + _refreshButton.SetEnabled(false); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs.meta new file mode 100644 index 00000000..b179c6aa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3c275be3817d1684ca1802c2738ac4d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AccountToolbar.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs new file mode 100644 index 00000000..283017d4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs @@ -0,0 +1,215 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class AssetsWorkflowElement : WorkflowElementBase + { + // Data + private AssetsWorkflow _workflow; + + // UI + private VisualElement _dependenciesToggleElement; + private Toggle _dependenciesToggle; + private MultiToggleSelectionElement _dependenciesElement; + private MultiToggleSelectionElement _specialFoldersElement; + + private const string PathSelectionTooltip = "Select the main folder of your package" + + "\n\nAll files and folders of your package should preferably be contained within a single root folder that is named after your package" + + "\n\nExample: 'Assets/[MyPackageName]'" + + "\n\nNote: If your content makes use of special folders that are required to be placed in the root Assets folder (e.g. 'StreamingAssets')," + + " you will be able to include them after selecting the main folder"; + + public AssetsWorkflowElement(AssetsWorkflow workflow) : base(workflow) + { + _workflow = workflow; + + Create(); + Deserialize(); + } + + private void Create() + { + CreatePathElement("Folder path", PathSelectionTooltip); + CreateDependenciesToggleElement(); + CreateDependenciesSelectionElement(); + CreateSpecialFoldersElement(); + CreatePreviewGenerationElement(); + CreateValidationElement(new CurrentProjectValidationElement(_workflow)); + CreateUploadElement(_workflow, true); + } + + private void CreateDependenciesToggleElement() + { + _dependenciesToggleElement = new VisualElement() { name = "Dependencies Toggle" }; + _dependenciesToggleElement.AddToClassList("package-content-option-box"); + + VisualElement dependenciesLabelHelpRow = new VisualElement(); + dependenciesLabelHelpRow.AddToClassList("package-content-option-label-help-row"); + + Label dependenciesLabel = new Label { text = "Dependencies" }; + Image dependenciesLabelTooltip = new Image + { + tooltip = "Tick this checkbox if your package content has dependencies on Unity packages from the Package Manager" + }; + + _dependenciesToggle = new Toggle { name = "DependenciesToggle", text = "Include Package Manifest" }; + _dependenciesToggle.AddToClassList("package-content-option-toggle"); + + var callback = new Action(() => DependencyToggleValueChange(true)); + _dependenciesToggle.RegisterValueChangedCallback((_) => DependencyToggleValueChange(true)); + RegisterCallback((_) => { ASToolsPreferences.OnSettingsChange += callback; }); + RegisterCallback((_) => { ASToolsPreferences.OnSettingsChange -= callback; }); + + dependenciesLabelHelpRow.Add(dependenciesLabel); + dependenciesLabelHelpRow.Add(dependenciesLabelTooltip); + + _dependenciesToggleElement.Add(dependenciesLabelHelpRow); + _dependenciesToggleElement.Add(_dependenciesToggle); + + _dependenciesToggleElement.style.display = DisplayStyle.None; + Add(_dependenciesToggleElement); + } + + private void CreateDependenciesSelectionElement() + { + _dependenciesElement = new MultiToggleSelectionElement() + { + DisplayElementLabel = false, + ElementLabel = "Dependencies", + NoSelectionLabel = "No packages match this criteria" + }; + + var setDependencies = new Action>((dict) => _workflow.SetDependencies(dict.Where(x => x.Value).Select(x => x.Key), true)); + _dependenciesElement.OnValuesChanged += setDependencies; + _dependenciesElement.style.display = DisplayStyle.None; + Add(_dependenciesElement); + } + + private void CreateSpecialFoldersElement() + { + _specialFoldersElement = new MultiToggleSelectionElement() + { + ElementLabel = "Special Folders", + ElementTooltip = "If your package content relies on Special Folders (e.g. StreamingAssets), please select which of these folders should be included in the package.", + NoSelectionLabel = "No folders match this criteria." + }; + + var setSpecialFolders = new Action>((dict) => _workflow.SetSpecialFolders(dict.Where(x => x.Value).Select(x => x.Key), true)); + _specialFoldersElement.OnValuesChanged += setSpecialFolders; + _specialFoldersElement.style.display = DisplayStyle.None; + Add(_specialFoldersElement); + } + + protected override void BrowsePath() + { + string absoluteExportPath = string.Empty; + bool includeAllAssets = false; + + if (_workflow.IsCompleteProject) + { + includeAllAssets = EditorUtility.DisplayDialog("Notice", + "Your package draft is set to a category that is treated" + + " as a complete project. Project settings will be included automatically. Would you like everything in the " + + "'Assets' folder to be included?\n\nYou will still be able to change the selected assets before uploading", + "Yes, include all folders and assets", + "No, I'll select what to include manually"); + + if (includeAllAssets) + absoluteExportPath = Application.dataPath; + } + + if (!includeAllAssets) + { + absoluteExportPath = EditorUtility.OpenFolderPanel( + "Select folder to compress into a package", "Assets/", ""); + + if (string.IsNullOrEmpty(absoluteExportPath)) + return; + } + + var relativeExportPath = FileUtility.AbsolutePathToRelativePath(absoluteExportPath, ASToolsPreferences.Instance.EnableSymlinkSupport); + if (!_workflow.IsPathValid(relativeExportPath, out var error)) + { + EditorUtility.DisplayDialog("Invalid selection", error, "OK"); + return; + } + + HandlePathSelection(relativeExportPath, true); + CheckForMissingMetas(); + } + + private void HandlePathSelection(string relativeExportPath, bool serialize) + { + if (string.IsNullOrEmpty(relativeExportPath)) + return; + + _workflow.SetMainExportPath(relativeExportPath, serialize); + SetPathSelectionTextField(relativeExportPath + "/"); + + _dependenciesToggleElement.style.display = DisplayStyle.Flex; + UpdateSpecialFoldersElement(); + } + + private void CheckForMissingMetas() + { + var paths = new List() { _workflow.GetMainExportPath() }; + paths.AddRange(_workflow.GetSpecialFolders()); + CheckForMissingMetas(paths); + } + + private void DependencyToggleValueChange(bool serialize) + { + _workflow.SetIncludeDependencies(_dependenciesToggle.value, serialize); + + if (_dependenciesToggle.value && !ASToolsPreferences.Instance.UseLegacyExporting) + { + var allDependencies = _workflow.GetAvailableDependencies(); + var selectedDependencies = allDependencies.ToDictionary(x => x, y => _workflow.GetDependencies().Any(x => x.name == y)); + _dependenciesElement.Populate(selectedDependencies); + _dependenciesElement.style.display = DisplayStyle.Flex; + } + else + { + _dependenciesElement.style.display = DisplayStyle.None; + } + } + + private void UpdateSpecialFoldersElement() + { + var availableSpecialFolders = _workflow.GetAvailableSpecialFolders(); + var selectedSpecialFolders = availableSpecialFolders.ToDictionary(x => x, y => _workflow.GetSpecialFolders().Any(x => x == y)); + _specialFoldersElement.Populate(selectedSpecialFolders); + _specialFoldersElement.style.display = availableSpecialFolders.Count > 0 ? DisplayStyle.Flex : DisplayStyle.None; + } + + protected override void EnableInteraction() + { + base.EnableInteraction(); + _dependenciesToggleElement.SetEnabled(true); + _dependenciesElement.SetEnabled(true); + _specialFoldersElement.SetEnabled(true); + } + + protected override void DisableInteraction() + { + base.DisableInteraction(); + _dependenciesToggleElement.SetEnabled(false); + _dependenciesElement.SetEnabled(false); + _specialFoldersElement.SetEnabled(false); + } + + protected override void Deserialize() + { + HandlePathSelection(_workflow.GetMainExportPath(), false); + _dependenciesToggle.SetValueWithoutNotify(_workflow.GetIncludeDependencies()); + DependencyToggleValueChange(false); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs.meta new file mode 100644 index 00000000..4720aaaa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 1f62ea8ab5c102e4fa574a3dcac7f6fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/AssetsWorkflowElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs new file mode 100644 index 00000000..adfeab1f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs @@ -0,0 +1,31 @@ +using AssetStoreTools.Uploader.Data; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class CurrentProjectValidationElement : ValidationElementBase + { + public CurrentProjectValidationElement(IWorkflow workflow) : base(workflow) + { + Create(); + } + + private void Create() + { + CreateResultsBox(); + } + + private void CreateResultsBox() + { + var _viewReportButton = new Button(ViewReport) { text = "View report" }; + _viewReportButton.AddToClassList("validation-result-view-report-button"); + + ResultsBox.Add(_viewReportButton); + } + + private void ViewReport() + { + AssetStoreTools.ShowAssetStoreToolsValidator(Workflow.LastValidationSettings, Workflow.LastValidationResult); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs.meta new file mode 100644 index 00000000..e3073c3e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 21a1f13231b167b4c80079a2c1212101 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/CurrentProjectValidationElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs new file mode 100644 index 00000000..12c596b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs @@ -0,0 +1,92 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using AssetStoreTools.Validator; +using System; +using System.IO; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class ExternalProjectValidationElement : ValidationElementBase + { + private VisualElement _projectButtonContainer; + + public ExternalProjectValidationElement(IWorkflow workflow) : base(workflow) + { + Create(); + } + + private void Create() + { + CreateProjectButtonContainer(); + CreateProjectButtons(); + } + + private void CreateProjectButtonContainer() + { + _projectButtonContainer = new VisualElement(); + _projectButtonContainer.AddToClassList("validation-result-view-report-button-container"); + + ResultsBox.Add(_projectButtonContainer); + } + + private void CreateProjectButtons() + { + var openButton = new Button(OpenProject) { text = "Open Project" }; + openButton.AddToClassList("validation-result-view-report-button"); + + var saveButton = new Button(SaveProject) { text = "Save Project" }; + saveButton.AddToClassList("validation-result-view-report-button"); + + _projectButtonContainer.Add(openButton); + _projectButtonContainer.Add(saveButton); + } + + private void OpenProject() + { + try + { + EditorUtility.DisplayProgressBar("Waiting...", "Validation project is open. Waiting for it to exit...", 0.4f); + var projectPath = Workflow.LastValidationResult.ProjectPath; + ExternalProjectValidator.OpenExternalValidationProject(projectPath); + } + finally + { + EditorUtility.ClearProgressBar(); + } + } + + private void SaveProject() + { + try + { + var projectPath = Workflow.LastValidationResult.ProjectPath; + var savePath = EditorUtility.SaveFolderPanel("Select a folder", Environment.GetFolderPath(Environment.SpecialFolder.Desktop), string.Empty); + if (string.IsNullOrEmpty(savePath)) + return; + + var saveDir = new DirectoryInfo(savePath); + if (!saveDir.Exists || saveDir.GetFileSystemInfos().Length != 0) + { + EditorUtility.DisplayDialog("Saving project failed", "Selected directory must be an empty folder", "OK"); + return; + } + + EditorUtility.DisplayProgressBar("Saving...", "Saving project...", 0.4f); + FileUtility.CopyDirectory(projectPath, savePath, true); + } + finally + { + EditorUtility.ClearProgressBar(); + } + } + + protected override bool ConfirmValidation() + { + return EditorUtility.DisplayDialog("Notice", "Pre-exported package validation is performed in a separate temporary project. " + + "It may take some time for the temporary project to be created, which will halt any actions in the current project. " + + "The current project will resume work after the temporary project is exited.\n\nDo you wish to proceed?", "Yes", "No"); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs.meta new file mode 100644 index 00000000..5178519e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 706f01d53c7eaf04bae07fb36684e31b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/ExternalProjectValidationElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs new file mode 100644 index 00000000..75981425 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs @@ -0,0 +1,116 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class HybridPackageWorkflowElement : WorkflowElementBase + { + // Data + private HybridPackageWorkflow _workflow; + + // UI + private MultiToggleSelectionElement _dependenciesElement; + + public HybridPackageWorkflowElement(HybridPackageWorkflow workflow) : base(workflow) + { + _workflow = workflow; + + Create(); + Deserialize(); + } + + private void Create() + { + CreatePathElement("Package path", "Select a local Package you would like to export and upload to the Store."); + CreateDependenciesElement(); + CreatePreviewGenerationElement(); + CreateValidationElement(new CurrentProjectValidationElement(_workflow)); + CreateUploadElement(_workflow, true); + } + + private void CreateDependenciesElement() + { + _dependenciesElement = new MultiToggleSelectionElement() + { + ElementLabel = "Dependencies", + ElementTooltip = "Select which local package dependencies should be included when exporting." + + "\n\nNote that only local or embedded dependencies defined in the package.json can be selected.", + NoSelectionLabel = "No packages match this criteria" + }; + + var setDependencies = new Action>((dict) => _workflow.SetDependencies(dict.Where(x => x.Value).Select(x => x.Key), true)); + _dependenciesElement.OnValuesChanged += setDependencies; + Add(_dependenciesElement); + _dependenciesElement.style.display = DisplayStyle.None; + } + + protected override void BrowsePath() + { + var absoluteExportPath = EditorUtility.OpenFilePanel("Select a package.json file", "Packages/", "json"); + if (string.IsNullOrEmpty(absoluteExportPath)) + return; + + if (!_workflow.IsPathValid(absoluteExportPath, out var error)) + { + EditorUtility.DisplayDialog("Invalid selection", error, "OK"); + return; + } + + HandlePathSelection(absoluteExportPath, true); + CheckForMissingMetas(); + } + + private void HandlePathSelection(string packageManifestPath, bool serialize) + { + if (string.IsNullOrEmpty(packageManifestPath)) + return; + + _workflow.SetPackage(packageManifestPath, serialize); + var packageFolderPath = _workflow.GetPackage().assetPath; + SetPathSelectionTextField(packageFolderPath + "/"); + + UpdateDependenciesElement(); + } + + private void CheckForMissingMetas() + { + var paths = new List() { _workflow.GetPackage().assetPath }; + paths.AddRange(_workflow.GetDependencies().Select(x => x.assetPath)); + CheckForMissingMetas(paths); + } + + private void UpdateDependenciesElement() + { + var availableDependencies = _workflow.GetAvailableDependencies(); + var selectedDependencies = availableDependencies.ToDictionary(x => x.name, y => _workflow.GetDependencies().Any(x => x.name == y.name)); + _dependenciesElement.Populate(selectedDependencies); + _dependenciesElement.style.display = availableDependencies.Count > 0 ? DisplayStyle.Flex : DisplayStyle.None; + } + + protected override void EnableInteraction() + { + base.EnableInteraction(); + _dependenciesElement.SetEnabled(true); + } + + protected override void DisableInteraction() + { + base.DisableInteraction(); + _dependenciesElement.SetEnabled(false); + } + + protected override void Deserialize() + { + var package = _workflow.GetPackage(); + if (package == null) + return; + + HandlePathSelection(AssetDatabase.GetAssetPath(package.GetManifestAsset()), false); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs.meta new file mode 100644 index 00000000..e39801ca --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 34cd1e5cbe87bb546937a521bd2bc69c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/HybridPackageWorkflowElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs new file mode 100644 index 00000000..b2ad70b1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs @@ -0,0 +1,52 @@ +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class LoadingSpinner : VisualElement + { + // Data + private int _spinIndex; + private double _spinTimer; + private double _spinThreshold = 0.1; + + // UI + private Image _spinnerImage; + + public LoadingSpinner() + { + AddToClassList("loading-spinner-box"); + + _spinnerImage = new Image { name = "SpinnerImage" }; + _spinnerImage.AddToClassList("loading-spinner-image"); + + Add(_spinnerImage); + } + + public void Show() + { + EditorApplication.update += SpinnerLoop; + style.display = DisplayStyle.Flex; + } + + public void Hide() + { + EditorApplication.update -= SpinnerLoop; + style.display = DisplayStyle.None; + } + + private void SpinnerLoop() + { + if (_spinTimer + _spinThreshold > EditorApplication.timeSinceStartup) + return; + + _spinTimer = EditorApplication.timeSinceStartup; + _spinnerImage.image = EditorGUIUtility.IconContent($"WaitSpin{_spinIndex:00}").image; + + _spinIndex += 1; + + if (_spinIndex > 11) + _spinIndex = 0; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs.meta new file mode 100644 index 00000000..d3c31ba8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7c7cdef91eb9a894091869ca10d9d178 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/LoadingSpinner.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs new file mode 100644 index 00000000..175a095e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor.UIElements; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class MultiToggleSelectionElement : VisualElement + { + // Data + private Dictionary _selections; + private readonly List _selectionFilters = new List { "All", "Selected", "Not Selected" }; + private string _activeFilter; + + public bool DisplayElementLabel + { + get => _multiToggleSelectionHelpRow.style.visibility == Visibility.Visible; + set { _multiToggleSelectionHelpRow.style.visibility = value ? Visibility.Visible : Visibility.Hidden; } + } + + public string ElementLabel { get => _multiToggleSelectionLabel.text; set { _multiToggleSelectionLabel.text = value; } } + public string ElementTooltip { get => _multiToggleSelectionTooltip.tooltip; set { _multiToggleSelectionTooltip.tooltip = value; } } + public string NoSelectionLabel { get => _noSelectionsLabel.text; set { _noSelectionsLabel.text = value; } } + + // UI + private VisualElement _multiToggleSelectionHelpRow; + private Label _multiToggleSelectionLabel; + private Image _multiToggleSelectionTooltip; + + private ScrollView _selectionTogglesBox; + private Label _noSelectionsLabel; + private ToolbarMenu _filteringDropdown; + + public event Action> OnValuesChanged; + + public MultiToggleSelectionElement() + { + _activeFilter = _selectionFilters[0]; + AddToClassList("package-content-option-box"); + Create(); + } + + private void Create() + { + _multiToggleSelectionHelpRow = new VisualElement(); + _multiToggleSelectionHelpRow.AddToClassList("package-content-option-label-help-row"); + + _multiToggleSelectionLabel = new Label(); + _multiToggleSelectionTooltip = new Image(); + + VisualElement fullSelectionBox = new VisualElement(); + fullSelectionBox.AddToClassList("multi-toggle-box"); + + _selectionTogglesBox = new ScrollView { name = "DependencyToggles" }; + _selectionTogglesBox.AddToClassList("multi-toggle-box-scrollview"); + + _noSelectionsLabel = new Label(); + _noSelectionsLabel.AddToClassList("multi-toggle-box-empty-label"); + + var scrollContainer = _selectionTogglesBox.Q("unity-content-viewport"); + scrollContainer.Add(_noSelectionsLabel); + + VisualElement filteringBox = new VisualElement(); + filteringBox.AddToClassList("multi-toggle-box-toolbar"); + + // Select - deselect buttons + VisualElement selectingBox = new VisualElement(); + selectingBox.AddToClassList("multi-toggle-box-toolbar-selecting-box"); + + Button selectAllButton = new Button(SelectAllToggles) + { + text = "Select All" + }; + + Button deSelectAllButton = new Button(UnselectAllToggles) + { + text = "Deselect All" + }; + + selectingBox.Add(selectAllButton); + selectingBox.Add(deSelectAllButton); + + // Filtering dropdown + VisualElement filteringDropdownBox = new VisualElement(); + filteringDropdownBox.AddToClassList("multi-toggle-box-toolbar-filtering-box"); + + _filteringDropdown = new ToolbarMenu { text = _selectionFilters[0] }; + + foreach (var filter in _selectionFilters) + _filteringDropdown.menu.AppendAction(filter, (_) => { FilterDependencies(filter); }); + + filteringDropdownBox.Add(_filteringDropdown); + + // Final adding + filteringBox.Add(filteringDropdownBox); + filteringBox.Add(selectingBox); + + fullSelectionBox.Add(_selectionTogglesBox); + fullSelectionBox.Add(filteringBox); + + _multiToggleSelectionHelpRow.Add(_multiToggleSelectionLabel); + _multiToggleSelectionHelpRow.Add(_multiToggleSelectionTooltip); + + Add(_multiToggleSelectionHelpRow); + Add(fullSelectionBox); + } + + public void Populate(Dictionary selections) + { + _selectionTogglesBox.Clear(); + _selections = selections; + + EventCallback, string> callback = OnToggle; + + foreach (var kvp in selections) + { + var toggle = new Toggle() { text = kvp.Key, value = kvp.Value }; + toggle.AddToClassList("multi-toggle-box-toggle"); + toggle.RegisterCallback(callback, toggle.text); + _selectionTogglesBox.Add(toggle); + } + + FilterDependencies(_activeFilter); + } + + private void FilterDependencies(string filter) + { + _activeFilter = filter; + + var allToggles = _selectionTogglesBox.Children().Cast().ToArray(); + var selectedIndex = _selectionFilters.FindIndex(x => x == filter); + + switch (selectedIndex) + { + case 0: + foreach (var toggle in allToggles) + toggle.style.display = DisplayStyle.Flex; + break; + case 1: + foreach (var toggle in allToggles) + toggle.style.display = toggle.value ? DisplayStyle.Flex : DisplayStyle.None; + break; + case 2: + foreach (var toggle in allToggles) + toggle.style.display = toggle.value ? DisplayStyle.None : DisplayStyle.Flex; + break; + } + + // Check if any toggles are displayed + var count = allToggles.Count(toggle => toggle.style.display == DisplayStyle.Flex); + _noSelectionsLabel.style.display = count > 0 ? DisplayStyle.None : DisplayStyle.Flex; + + _filteringDropdown.text = filter; + } + + private void OnToggle(ChangeEvent evt, string text) + { + FilterDependencies(_activeFilter); + _selections[text] = evt.newValue; + OnValuesChanged?.Invoke(_selections); + } + + private void OnAllToggles(bool value) + { + var allToggles = _selectionTogglesBox.Children().Cast(); + foreach (var toggle in allToggles) + toggle.SetValueWithoutNotify(value); + + foreach (var key in _selections.Keys.ToArray()) + _selections[key] = value; + + FilterDependencies(_activeFilter); + OnValuesChanged?.Invoke(_selections); + } + + private void SelectAllToggles() + { + OnAllToggles(true); + } + + private void UnselectAllToggles() + { + OnAllToggles(false); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs.meta new file mode 100644 index 00000000..ec5d84c6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 19e30766043794345beb432973e0eb3c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/MultiToggleSelectionElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs new file mode 100644 index 00000000..eac8455f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs @@ -0,0 +1,137 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using System.Collections.Generic; +using UnityEditor.UIElements; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PackageContentElement : VisualElement + { + // Data + private IPackageContent _content; + private List _workflowElements; + + // UI + private VisualElement _workflowSelectionBox; + private ToolbarMenu _toolbarMenu; + + public PackageContentElement(IPackageContent content) + { + _content = content; + content.OnActiveWorkflowChanged += ActiveWorkflowChanged; + + _workflowElements = new List(); + + Create(); + } + + private void Create() + { + AddToClassList("package-content-element"); + + CreateWorkflowSelection(); + CreateWorkflows(); + Deserialize(); + } + + private void CreateWorkflowSelection() + { + _workflowSelectionBox = new VisualElement(); + _workflowSelectionBox.AddToClassList("package-content-option-box"); + + VisualElement labelHelpRow = new VisualElement(); + labelHelpRow.AddToClassList("package-content-option-label-help-row"); + + Label workflowLabel = new Label { text = "Upload type" }; + Image workflowLabelTooltip = new Image + { + tooltip = "Select what content you are uploading to the Asset Store" + + "\n\n- From Assets Folder - content located within the project's 'Assets' folder or one of its subfolders" + + "\n\n- Pre-exported .unitypackage - content that has already been compressed into a .unitypackage file" +#if UNITY_ASTOOLS_EXPERIMENTAL + + "\n\n- Local UPM Package - content that is located within the project's 'Packages' folder. Only embedded and local packages are supported" +#endif + }; + + labelHelpRow.Add(workflowLabel); + labelHelpRow.Add(workflowLabelTooltip); + + _toolbarMenu = new ToolbarMenu(); + _toolbarMenu.AddToClassList("package-content-option-dropdown"); + + foreach (var workflow in _content.GetAvailableWorkflows()) + { + AppendToolbarActionForWorkflow(workflow); + } + + _workflowSelectionBox.Add(labelHelpRow); + _workflowSelectionBox.Add(_toolbarMenu); + + Add(_workflowSelectionBox); + } + + private void AppendToolbarActionForWorkflow(IWorkflow workflow) + { + _toolbarMenu.menu.AppendAction(workflow.DisplayName, _ => + { + _content.SetActiveWorkflow(workflow); + }); + } + + private void CreateWorkflows() + { + foreach (var workflow in _content.GetAvailableWorkflows()) + { + WorkflowElementBase element; + switch (workflow) + { + case AssetsWorkflow assetsWorkflow: + element = new AssetsWorkflowElement(assetsWorkflow); + break; + case UnityPackageWorkflow unityPackageWorkflow: + element = new UnityPackageWorkflowElement(unityPackageWorkflow); + break; +#if UNITY_ASTOOLS_EXPERIMENTAL + case HybridPackageWorkflow hybridPackageWorkflow: + element = new HybridPackageWorkflowElement(hybridPackageWorkflow); + break; +#endif + default: + ASDebug.LogWarning("Package Content Element received an undefined workflow"); + continue; + } + + element.OnInteractionAvailable += EnableInteraction; + element.OnInteractionUnavailable += DisableInteraction; + _workflowElements.Add(element); + Add(element); + } + } + + private void ActiveWorkflowChanged(IWorkflow workflow) + { + _toolbarMenu.text = workflow.DisplayName; + foreach (var workflowElement in _workflowElements) + { + bool show = workflowElement.Is(workflow); + workflowElement.style.display = show ? DisplayStyle.Flex : DisplayStyle.None; + } + } + + private void EnableInteraction() + { + _workflowSelectionBox.SetEnabled(true); + } + + private void DisableInteraction() + { + _workflowSelectionBox.SetEnabled(false); + } + + private void Deserialize() + { + ActiveWorkflowChanged(_content.GetActiveWorkflow()); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs.meta new file mode 100644 index 00000000..e751748e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 09927e9c8fd6e074fa451add92b7ab6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageContentElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs new file mode 100644 index 00000000..f934979a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs @@ -0,0 +1,215 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Uploader.Services; +using System; +#if !UNITY_2021_1_OR_NEWER +using UnityEditor.UIElements; +#endif +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PackageElement : VisualElement + { + // Data + private IPackage _package; + private bool _isSelected; + + private IPackageFactoryService _packageFactory; + + // UI + private Button _foldoutBox; + private Label _expanderLabel; + private Label _assetLabel; + private Label _lastDateSizeLabel; + private Image _assetImage; + + private ProgressBar _uploadProgressBar; + private VisualElement _uploadProgressBarBackground; + + private PackageContentElement _contentElement; + + public event Action OnSelected; + + public PackageElement(IPackage package, IPackageFactoryService packageFactory) + { + _package = package; + _package.OnUpdate += Refresh; + _package.OnIconUpdate += SetPackageThumbnail; + + _packageFactory = packageFactory; + + _isSelected = false; + + Create(); + } + + private void Create() + { + AddToClassList("package-full-box"); + + _foldoutBox = new Button { name = "Package" }; + _foldoutBox.AddToClassList("package-foldout-box"); + if (_package.IsDraft) + _foldoutBox.AddToClassList("package-foldout-box-draft"); + _foldoutBox.clickable.clicked += Toggle; + + // Expander, Icon and Asset Label + VisualElement foldoutBoxInfo = new VisualElement { name = "foldoutBoxInfo" }; + foldoutBoxInfo.AddToClassList("package-foldout-box-info"); + + VisualElement labelExpanderRow = new VisualElement { name = "labelExpanderRow" }; + labelExpanderRow.AddToClassList("package-expander-label-row"); + + _expanderLabel = new Label { name = "ExpanderLabel", text = "►" }; + _expanderLabel.AddToClassList("package-expander"); + _expanderLabel.style.display = _package.IsDraft ? DisplayStyle.Flex : DisplayStyle.None; + + _assetImage = new Image { name = "AssetImage" }; + _assetImage.AddToClassList("package-image"); + + VisualElement assetLabelInfoBox = new VisualElement { name = "assetLabelInfoBox" }; + assetLabelInfoBox.AddToClassList("package-label-info-box"); + + _assetLabel = new Label { name = "AssetLabel", text = _package.Name }; + _assetLabel.AddToClassList("package-label"); + + _lastDateSizeLabel = new Label { name = "AssetInfoLabel", text = FormatDateSize() }; + _lastDateSizeLabel.AddToClassList("package-info"); + + assetLabelInfoBox.Add(_assetLabel); + assetLabelInfoBox.Add(_lastDateSizeLabel); + + labelExpanderRow.Add(_expanderLabel); + labelExpanderRow.Add(_assetImage); + labelExpanderRow.Add(assetLabelInfoBox); + + var openInBrowserButton = new Button(OpenPackageInBrowser) + { + name = "OpenInBrowserButton", + tooltip = "View your package in the Publishing Portal." + }; + openInBrowserButton.AddToClassList("package-open-in-browser-button"); + + // Header Progress bar + _uploadProgressBar = new ProgressBar { name = "HeaderProgressBar" }; + _uploadProgressBar.AddToClassList("package-header-progress-bar"); + _uploadProgressBar.style.display = DisplayStyle.None; + _uploadProgressBarBackground = _uploadProgressBar.Q(className: "unity-progress-bar__progress"); + + // Connect it all + foldoutBoxInfo.Add(labelExpanderRow); + foldoutBoxInfo.Add(openInBrowserButton); + + _foldoutBox.Add(foldoutBoxInfo); + _foldoutBox.Add(_uploadProgressBar); + + Add(_foldoutBox); + } + + private void CreateFoldoutContent() + { + var content = _packageFactory.CreatePackageContent(_package); + if (content == null) + return; + + _contentElement = new PackageContentElement(content); + _contentElement.style.display = DisplayStyle.None; + Add(_contentElement); + + SubscribeToContentWorkflowUpdates(content); + } + + private void SubscribeToContentWorkflowUpdates(IPackageContent content) + { + foreach (var workflow in content.GetAvailableWorkflows()) + { + workflow.OnUploadStateChanged += UpdateProgressBar; + } + } + + private void UpdateProgressBar(UploadStatus? status, float? progress) + { + if (status != null) + { + _uploadProgressBarBackground.style.backgroundColor = PackageUploadElement.GetColorByStatus(status.Value); + } + + if (progress != null) + { + _uploadProgressBar.value = progress.Value; + } + } + + private void Toggle() + { + if (!_package.IsDraft) + return; + + if (!Contains(_contentElement)) + CreateFoldoutContent(); + + var shouldExpand = !_isSelected; + _expanderLabel.text = shouldExpand ? "▼" : "►"; + + if (shouldExpand) + _foldoutBox.AddToClassList("package-foldout-box-expanded"); + else + _foldoutBox.RemoveFromClassList("package-foldout-box-expanded"); + _contentElement.style.display = shouldExpand ? DisplayStyle.Flex : DisplayStyle.None; + + _isSelected = !_isSelected; + ToggleProgressBar(); + + if (_isSelected) + OnSelected?.Invoke(); + } + + private void ToggleProgressBar() + { + if (!_isSelected && _uploadProgressBar.value != 0) + _uploadProgressBar.style.display = DisplayStyle.Flex; + else + _uploadProgressBar.style.display = DisplayStyle.None; + } + + public bool Is(IPackage package) + { + return package == _package; + } + + public void Select() + { + if (!_isSelected) + Toggle(); + } + + public void Unselect() + { + if (_isSelected) + Toggle(); + } + + private void SetPackageThumbnail() + { + _assetImage.image = _package.Icon; + } + + private void Refresh() + { + _assetLabel.text = _package.Name; + _lastDateSizeLabel.text = FormatDateSize(); + } + + private string FormatDateSize() + { + return $"{_package.Category} | {_package.FormattedSize()} | {_package.FormattedModified()}"; + } + + private void OpenPackageInBrowser() + { + Application.OpenURL($"https://publisher.unity.com/packages/{_package.VersionId}/edit/upload"); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs.meta new file mode 100644 index 00000000..9305aebd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cef5f23043d318945b844bcac7a7a984 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs new file mode 100644 index 00000000..6c549c0c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs @@ -0,0 +1,149 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Uploader.Services; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PackageGroupElement : VisualElement + { + // Data + public string Name => _packageGroup.Name; + private IPackageGroup _packageGroup; + private List _packageElements; + private bool _isExpanded; + + private IPackageFactoryService _packageFactory; + + // UI + private Button _groupExpanderBox; + private VisualElement _groupContent; + + private Label _expanderLabel; + private Label _groupLabel; + + public PackageGroupElement(IPackageGroup packageGroup, IPackageFactoryService packageFactory) + { + _packageGroup = packageGroup; + _packageElements = new List(); + _packageGroup.OnPackagesSorted += RefreshPackages; + _packageGroup.OnPackagesFiltered += RefreshPackages; + + _packageFactory = packageFactory; + + Create(); + } + + private void Create() + { + CreatePackageGroup(); + CreatePackageGroupContent(); + AddPackagesToGroupContent(); + } + + protected void CreatePackageGroup() + { + _groupExpanderBox = new Button(OnPackageGroupClicked); + _groupExpanderBox.AddToClassList("package-group-expander-box"); + + _expanderLabel = new Label { name = "ExpanderLabel", text = "►" }; + _expanderLabel.AddToClassList("package-group-expander"); + + _groupLabel = new Label { text = $"{_packageGroup.Name} ({_packageGroup.Packages.Count})" }; + _groupLabel.AddToClassList("package-group-label"); + FormatGroupLabel(_packageGroup.Packages.Count); + + _groupExpanderBox.Add(_expanderLabel); + _groupExpanderBox.Add(_groupLabel); + + Add(_groupExpanderBox); + } + + private void CreatePackageGroupContent() + { + _groupContent = new VisualElement { name = "GroupContentBox" }; + _groupContent.AddToClassList("package-group-content-box"); + Toggle(false); + + var groupSeparator = new VisualElement { name = "GroupSeparator" }; + groupSeparator.AddToClassList("package-group-separator"); + + if (_packageGroup.Name.ToLower() != "draft") + { + _groupLabel.SetEnabled(false); + _groupContent.AddToClassList("unity-disabled"); + groupSeparator.style.display = DisplayStyle.Flex; + } + + Add(_groupContent); + Add(groupSeparator); + } + + private void AddPackagesToGroupContent() + { + foreach (var package in _packageGroup.Packages) + { + var packageElement = new PackageElement(package, _packageFactory); + packageElement.OnSelected += () => OnPackageSelected(packageElement); + _packageElements.Add(packageElement); + } + } + + private void FormatGroupLabel(int displayedPackageCount) + { + if (_packageGroup.Packages.Count == displayedPackageCount) + _groupLabel.text = $"{Name} ({displayedPackageCount})"; + else + _groupLabel.text = $"{Name} ({displayedPackageCount}/{_packageGroup.Packages.Count})"; + } + + private void RefreshPackages(List packages) + { + _groupContent.Clear(); + + foreach (var package in packages) + { + var correspondingElement = _packageElements.FirstOrDefault(x => x.Is(package)); + if (correspondingElement == null) + continue; + + _groupContent.Add(correspondingElement); + } + + FormatGroupLabel(packages.Count()); + } + + private void OnPackageGroupClicked() + { + Toggle(!_isExpanded); + } + + public void Toggle(bool expand) + { + if (expand) + { + _expanderLabel.text = "▼"; + _groupContent.style.display = DisplayStyle.Flex; + } + else + { + _expanderLabel.text = "►"; + _groupContent.style.display = DisplayStyle.None; + } + + _isExpanded = expand; + } + + private void OnPackageSelected(PackageElement packageElement) + { + foreach (var element in _packageElements) + { + if (element == packageElement) + continue; + + element.Unselect(); + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs.meta new file mode 100644 index 00000000..a3216321 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 41e322a1418ab824182eade111145dff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageGroupElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs new file mode 100644 index 00000000..0dfc3c26 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs @@ -0,0 +1,58 @@ +using AssetStoreTools.Uploader.Data; +using System.Collections.Generic; +using UnityEditor.UIElements; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PackageListToolbar : VisualElement + { + private List _packageGroups; + + public PackageListToolbar() + { + Create(); + } + + private void Create() + { + AddToClassList("package-list-toolbar"); + + // Search + var searchField = new ToolbarSearchField { name = "SearchField" }; + searchField.AddToClassList("package-search-field"); + + // Sorting menu button + var sortMenu = new ToolbarMenu() { text = "Sort: Name ↓" }; + sortMenu.menu.AppendAction("Sort: Name ↓", (_) => { sortMenu.text = "Sort: Name ↓"; Sort(PackageSorting.Name); }); + sortMenu.menu.AppendAction("Sort: Updated ↓", (_) => { sortMenu.text = "Sort: Updated ↓"; Sort(PackageSorting.Date); }); + sortMenu.menu.AppendAction("Sort: Category ↓", (_) => { sortMenu.text = "Sort: Category ↓"; Sort(PackageSorting.Category); }); + sortMenu.AddToClassList("package-sort-menu"); + + // Finalize the bar + Add(searchField); + Add(sortMenu); + + // Add Callbacks and click events + searchField.RegisterCallback>(SearchFilter); + } + + public void SetPackageGroups(List packageGroups) + { + _packageGroups = packageGroups; + } + + private void SearchFilter(ChangeEvent evt) + { + var searchString = evt.newValue.ToLower(); + foreach (var packageGroup in _packageGroups) + packageGroup.Filter(searchString); + } + + public void Sort(PackageSorting sortingType) + { + foreach (var packageGroup in _packageGroups) + packageGroup.Sort(sortingType); + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs.meta new file mode 100644 index 00000000..afedf2ea --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6d2659328222e0e4cb36cd194e023f4b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageListToolbar.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs new file mode 100644 index 00000000..06fe8eaa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs @@ -0,0 +1,321 @@ +using AssetStoreTools.Api; +using AssetStoreTools.Api.Responses; +using AssetStoreTools.Exporter; +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using System; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using UnityEditor; +#if !UNITY_2021_1_OR_NEWER +using UnityEditor.UIElements; +#endif +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PackageUploadElement : VisualElement + { + // Data + private IWorkflow _workflow; + private bool _enableExporting; + + // UI + private VisualElement _exportAndUploadContainer; + + private Button _cancelUploadButton; + private VisualElement _uploadProgressContainer; + private ProgressBar _uploadProgressBar; + private VisualElement _uploadProgressBarBackground; + + public event Action OnInteractionAvailable; + public event Action OnInteractionUnavailable; + + public PackageUploadElement(IWorkflow workflow, bool exposeExportButton) + { + _workflow = workflow; + _enableExporting = exposeExportButton; + + Create(); + } + + private void Create() + { + AddToClassList("uploading-box"); + + CreateButtonContainer(); + CreateProgressContainer(); + } + + private void CreateButtonContainer() + { + _exportAndUploadContainer = new VisualElement(); + _exportAndUploadContainer.AddToClassList("uploading-export-and-upload-container"); + + CreateExportButton(); + CreateUploadButton(); + Add(_exportAndUploadContainer); + } + + private void CreateExportButton() + { + if (!_enableExporting) + return; + + var _exportAndUploadButton = new Button(async () => await Export(true)) { name = "ExportButton", text = "Export" }; + _exportAndUploadButton.AddToClassList("uploading-export-button"); + + _exportAndUploadContainer.Add(_exportAndUploadButton); + } + + private void CreateUploadButton() + { + var _uploadButton = new Button(Upload) { name = "UploadButton" }; + _uploadButton.text = _enableExporting ? "Export and Upload" : "Upload"; + _uploadButton.AddToClassList("uploading-upload-button"); + + _exportAndUploadContainer.Add(_uploadButton); + } + + private void CreateProgressContainer() + { + _uploadProgressContainer = new VisualElement(); + _uploadProgressContainer.AddToClassList("uploading-progress-container"); + _uploadProgressContainer.style.display = DisplayStyle.None; + + _uploadProgressBar = new ProgressBar { name = "UploadProgressBar" }; + _uploadProgressBar.AddToClassList("uploading-progress-bar"); + _uploadProgressBarBackground = _uploadProgressBar.Q(className: "unity-progress-bar__progress"); + + _cancelUploadButton = new Button() { name = "CancelButton", text = "Cancel" }; + _cancelUploadButton.AddToClassList("uploading-cancel-button"); + + _uploadProgressContainer.Add(_uploadProgressBar); + _uploadProgressContainer.Add(_cancelUploadButton); + + Add(_uploadProgressContainer); + } + + private async Task Export(bool interactive) + { + try + { + DisableInteraction(); + + if (!_workflow.IsPathSet) + { + EditorUtility.DisplayDialog("Exporting failed", "No path was selected. Please " + + "select a path and try again.", "OK"); + return new PackageExporterResult() { Success = false, Exception = new Exception("No path was selected.") }; + } + + var rootProjectPath = Constants.RootProjectPath; + var packageNameStripped = Regex.Replace(_workflow.PackageName, "[^a-zA-Z0-9]", ""); + var outputName = $"{packageNameStripped}-{DateTime.Now:yyyy-dd-M--HH-mm-ss}"; + + string outputPath; + if (interactive) + { + outputPath = EditorUtility.SaveFilePanel("Export Package", rootProjectPath, + outputName, _workflow.PackageExtension.Remove(0, 1)); // Ignoring the '.' character since SaveFilePanel already appends it + + if (string.IsNullOrEmpty(outputPath)) + return new PackageExporterResult() { Success = false, Exception = null }; + } + else + { + outputPath = $"Temp/{outputName}{_workflow.PackageExtension}"; + } + + var exportResult = await _workflow.ExportPackage(outputPath); + if (!exportResult.Success) + { + Debug.LogError($"Package exporting failed: {exportResult.Exception}"); + EditorUtility.DisplayDialog("Exporting failed", exportResult.Exception.Message, "OK"); + } + else if (interactive) + Debug.Log($"Package exported to '{Path.GetFullPath(exportResult.ExportedPath).Replace("\\", "/")}'"); + + return exportResult; + } + finally + { + if (interactive) + EnableInteraction(); + } + } + + private async void Upload() + { + DisableInteraction(); + + if (await ValidateUnityVersionsBeforeUpload() == false) + { + EnableInteraction(); + return; + } + + var exportResult = await Export(false); + if (!exportResult.Success) + { + EnableInteraction(); + return; + } + + if (!_workflow.IsPathSet) + { + EditorUtility.DisplayDialog("Uploading failed", "No path was selected. Please " + + "select a path and try again.", "OK"); + EnableInteraction(); + return; + } + + _exportAndUploadContainer.style.display = DisplayStyle.None; + _uploadProgressContainer.style.display = DisplayStyle.Flex; + + _cancelUploadButton.clicked += Cancel; + _workflow.OnUploadStateChanged += UpdateProgressBar; + var response = await _workflow.UploadPackage(exportResult.ExportedPath); + _workflow.OnUploadStateChanged -= UpdateProgressBar; + + await OnUploadingStopped(response); + } + + private async Task ValidateUnityVersionsBeforeUpload() + { + var validationEnabled = ASToolsPreferences.Instance.UploadVersionCheck; + if (!validationEnabled) + return true; + + var requiredVersionUploaded = await _workflow.ValidatePackageUploadedVersions(); + if (requiredVersionUploaded) + return true; + + var result = EditorUtility.DisplayDialogComplex("Asset Store Tools", $"You may upload this package, but you will need to add a package using Unity version {Constants.Uploader.MinRequiredUnitySupportVersion} " + + "or higher to be able to submit a new asset", "Upload", "Cancel", "Upload and do not display this again"); + + switch (result) + { + case 1: + return false; + case 2: + ASToolsPreferences.Instance.UploadVersionCheck = false; + ASToolsPreferences.Instance.Save(); + break; + } + + return true; + } + + private void UpdateProgressBar(UploadStatus? status, float? progress) + { + if (status != null) + { + _uploadProgressBarBackground.style.backgroundColor = GetColorByStatus(status.Value); + } + + if (progress != null) + { + _uploadProgressBar.value = progress.Value; + _uploadProgressBar.title = $"{progress.Value:0.#}%"; + + if (progress == 100f && _cancelUploadButton.enabledInHierarchy) + _cancelUploadButton.SetEnabled(false); + } + } + + private void Cancel() + { + _cancelUploadButton.SetEnabled(false); + _workflow.AbortUpload(); + } + + private async Task OnUploadingStopped(PackageUploadResponse response) + { + if (!response.Success && !response.Cancelled) + { + Debug.LogException(response.Exception); + } + + if (response.Success) + { + await _workflow.RefreshPackage(); + } + + if (response.Status == UploadStatus.ResponseTimeout) + { + Debug.LogWarning($"All bytes for the package '{_workflow.PackageName}' have been uploaded, but a response " + + $"from the server was not received. This can happen because of Firewall restrictions. " + + $"Please make sure that a new version of your package has reached the Publishing Portal."); + } + + _uploadProgressBar.title = GetProgressBarTitleByStatus(response.Status); + + _cancelUploadButton.clickable = null; + _cancelUploadButton.clicked += Reset; + _cancelUploadButton.text = "Done"; + _cancelUploadButton.SetEnabled(true); + } + + private void Reset() + { + _cancelUploadButton.clickable = null; + _cancelUploadButton.text = "Cancel"; + + _workflow.ResetUploadStatus(); + UpdateProgressBar(UploadStatus.Default, 0f); + + _uploadProgressContainer.style.display = DisplayStyle.None; + _exportAndUploadContainer.style.display = DisplayStyle.Flex; + EnableInteraction(); + } + + public static Color GetColorByStatus(UploadStatus status) + { + switch (status) + { + default: + case UploadStatus.Default: + return new Color(0.13f, 0.59f, 0.95f); + case UploadStatus.Success: + case UploadStatus.ResponseTimeout: + return new Color(0f, 0.50f, 0.14f); + case UploadStatus.Cancelled: + return new Color(0.78f, 0.59f, 0f); + case UploadStatus.Fail: + return new Color(0.69f, 0.04f, 0.04f); + } + } + + private string GetProgressBarTitleByStatus(UploadStatus status) + { + var progressBarTitle = "Upload: "; + switch (status) + { + case UploadStatus.ResponseTimeout: + progressBarTitle += UploadStatus.Success; + break; + default: + progressBarTitle += status; + break; + } + + return progressBarTitle; + } + + private void EnableInteraction() + { + _exportAndUploadContainer.SetEnabled(true); + OnInteractionAvailable?.Invoke(); + } + + private void DisableInteraction() + { + _exportAndUploadContainer.SetEnabled(false); + OnInteractionUnavailable?.Invoke(); + SetEnabled(true); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs.meta new file mode 100644 index 00000000..8fed4c2e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 242524e968bd4484eaeb154d8013f427 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PackageUploadElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs new file mode 100644 index 00000000..d8d79bfb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs @@ -0,0 +1,63 @@ +using System; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PathSelectionElement : VisualElement + { + // Data + private string _labelText; + private string _labelTooltip; + + public event Action OnBrowse; + + // UI + private TextField _pathSelectionTextField; + + public PathSelectionElement(string labelText, string labelTooltip) + { + AddToClassList("package-content-option-box"); + + _labelText = labelText; + _labelTooltip = labelTooltip; + + Create(); + } + + private void Create() + { + VisualElement labelHelpRow = new VisualElement(); + labelHelpRow.AddToClassList("package-content-option-label-help-row"); + + Label folderPathLabel = new Label { text = _labelText }; + Image folderPathLabelTooltip = new Image + { + tooltip = _labelTooltip + }; + + labelHelpRow.Add(folderPathLabel); + labelHelpRow.Add(folderPathLabelTooltip); + + _pathSelectionTextField = new TextField(); + _pathSelectionTextField.AddToClassList("package-content-option-textfield"); + _pathSelectionTextField.isReadOnly = true; + + Button browsePathButton = new Button(Browse) { name = "BrowsePathButton", text = "Browse" }; + browsePathButton.AddToClassList("package-content-option-button"); + + Add(labelHelpRow); + Add(_pathSelectionTextField); + Add(browsePathButton); + } + + private void Browse() + { + OnBrowse?.Invoke(); + } + + public void SetPath(string path) + { + _pathSelectionTextField.value = path; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs.meta new file mode 100644 index 00000000..22dc5e73 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 753d4442293e5cc4b9efcab089da4d59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PathSelectionElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs new file mode 100644 index 00000000..85332076 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs @@ -0,0 +1,109 @@ +using AssetStoreTools.Previews.Data; +using AssetStoreTools.Uploader.Data; +using System.Linq; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class PreviewGenerationElement : VisualElement + { + // Data + private IWorkflow _workflow; + + // UI + private VisualElement _toggleRow; + private Toggle _previewToggle; + + private VisualElement _buttonRow; + private VisualElement _viewButton; + + public PreviewGenerationElement(IWorkflow workflow) + { + _workflow = workflow; + + Create(); + } + + private void Create() + { + CreateInfoRow(); + CreateViewButton(); + } + + private void CreateInfoRow() + { + _toggleRow = new VisualElement(); + _toggleRow.AddToClassList("package-content-option-box"); + + VisualElement toggleLabelHelpRow = new VisualElement(); + toggleLabelHelpRow.AddToClassList("package-content-option-label-help-row"); + + Label toggleLabel = new Label { text = "Asset Previews" }; + Image toggleLabelTooltip = new Image + { + tooltip = "Select how the previews for your assets will be generated.\n\n" + + "Unity generates asset preview images natively up to a size of 128x128. " + + "You can try generating previews which are of higher resolution, up to 300x300.\n\n" + + "Note: these asset preview images will only be displayed in the 'Package Content' section of the " + + "Asset Store listing page once the package is published, and in the package importer window that appears during the package import process.\n" + + "They will not replace the images used for the assets in the Project window after the package gets imported." + }; + + _previewToggle = new Toggle { name = "PreviewToggle", text = "Generate Hi-Res (experimental)" }; + _previewToggle.AddToClassList("package-content-option-toggle"); + _previewToggle.RegisterValueChangedCallback((_) => DependencyToggleValueChange()); + + toggleLabelHelpRow.Add(toggleLabel); + toggleLabelHelpRow.Add(toggleLabelTooltip); + + _toggleRow.Add(toggleLabelHelpRow); + _toggleRow.Add(_previewToggle); + + Add(_toggleRow); + } + + private void CreateViewButton() + { + _buttonRow = new VisualElement(); + _buttonRow.AddToClassList("package-content-option-box"); + _buttonRow.style.display = DisplayStyle.None; + + var spaceFiller = new VisualElement(); + spaceFiller.AddToClassList("package-content-option-label-help-row"); + + _viewButton = new Button(ViewClicked) { text = "Inspect Previews" }; + + _buttonRow.Add(spaceFiller); + _buttonRow.Add(_viewButton); + + Add(_buttonRow); + } + + private void DependencyToggleValueChange() + { + _workflow.GenerateHighQualityPreviews = _previewToggle.value; + _buttonRow.style.display = _previewToggle.value ? DisplayStyle.Flex : DisplayStyle.None; + } + + private void ViewClicked() + { + PreviewGenerationSettings settings; + if (_workflow.GenerateHighQualityPreviews) + { + settings = new CustomPreviewGenerationSettings() { InputPaths = _workflow.GetAllPaths().ToArray() }; + } + else + { + settings = new NativePreviewGenerationSettings() { InputPaths = _workflow.GetAllPaths().ToArray() }; + } + + AssetStoreTools.ShowAssetStoreToolsPreviewGenerator(settings); + } + + private void DisplayProgress(float value) + { + EditorUtility.DisplayProgressBar("Generating", "Generating previews...", value); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs.meta new file mode 100644 index 00000000..2d303ac6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 54c7971e2ad639644936d3552b4f4f49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/PreviewGenerationElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs new file mode 100644 index 00000000..2d61e6d7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs @@ -0,0 +1,58 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Utility; +using UnityEditor; + +namespace AssetStoreTools.Uploader.UI.Elements +{ + internal class UnityPackageWorkflowElement : WorkflowElementBase + { + // Data + private UnityPackageWorkflow _workflow; + + public UnityPackageWorkflowElement(UnityPackageWorkflow workflow) : base(workflow) + { + _workflow = workflow; + Create(); + } + + private void Create() + { + CreatePathElement("Package path", "Select the .unitypackage file you would like to upload."); + CreateValidationElement(new ExternalProjectValidationElement(_workflow)); + CreateUploadElement(_workflow, false); + Deserialize(); + } + + protected override void BrowsePath() + { + // Path retrieval + var absolutePackagePath = EditorUtility.OpenFilePanel("Select a .unitypackage file", Constants.RootProjectPath, "unitypackage"); + + if (string.IsNullOrEmpty(absolutePackagePath)) + return; + + var relativeExportPath = FileUtility.AbsolutePathToRelativePath(absolutePackagePath, ASToolsPreferences.Instance.EnableSymlinkSupport); + if (!_workflow.IsPathValid(relativeExportPath, out var error)) + { + EditorUtility.DisplayDialog("Invalid selection", error, "OK"); + return; + } + + HandleUnityPackageUploadPathSelection(relativeExportPath, true); + } + + private void HandleUnityPackageUploadPathSelection(string selectedPackagePath, bool serialize) + { + if (string.IsNullOrEmpty(selectedPackagePath)) + return; + + _workflow.SetPackagePath(selectedPackagePath, serialize); + SetPathSelectionTextField(selectedPackagePath); + } + + protected override void Deserialize() + { + HandleUnityPackageUploadPathSelection(_workflow.GetPackagePath(), false); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs.meta new file mode 100644 index 00000000..d599e1ee --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7a0c8a79b7dba9e458ddc54eec30ea66 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Elements/UnityPackageWorkflowElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views.meta new file mode 100644 index 00000000..e5882f0d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7511d6ab930f33c469562bc3c1c2aab2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs new file mode 100644 index 00000000..30395723 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs @@ -0,0 +1,284 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Uploader.Services.Api; +using AssetStoreTools.Utility; +using System; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader.UI.Views +{ + internal class LoginView : VisualElement + { + // Data + private IAuthenticationService _authenticationService; + private double _cloudLoginRefreshTime = 1d; + private double _lastRefreshTime; + + // UI + private Button _cloudLoginButton; + private Label _cloudLoginLabel; + + private Box _errorBox; + private Label _errorLabel; + + private TextField _emailField; + private TextField _passwordField; + private Button _credentialsLoginButton; + + public event Action OnAuthenticated; + + public LoginView(IAuthenticationService authenticationService) + { + _authenticationService = authenticationService; + Create(); + } + + public void Create() + { + styleSheets.Add(StyleSelector.UploaderWindow.LoginViewStyle); + styleSheets.Add(StyleSelector.UploaderWindow.LoginViewTheme); + + CreateAssetStoreLogo(); + CreateCloudLogin(); + CreateErrorBox(); + CreateCredentialsLogin(); + } + + private void CreateAssetStoreLogo() + { + // Asset Store logo + Image assetStoreLogo = new Image { name = "AssetStoreLogo" }; + assetStoreLogo.AddToClassList("asset-store-logo"); + + Add(assetStoreLogo); + } + + private void CreateCloudLogin() + { + VisualElement cloudLogin = new VisualElement { name = "CloudLogin" }; + + _cloudLoginButton = new Button(LoginWithCloudToken) { name = "LoginButtonCloud" }; + _cloudLoginButton.AddToClassList("cloud-button-login"); + _cloudLoginButton.SetEnabled(false); + + _cloudLoginLabel = new Label { text = "Cloud login unavailable" }; + _cloudLoginLabel.AddToClassList("cloud-button-login-label"); + + Label orLabel = new Label { text = "or" }; + orLabel.AddToClassList("cloud-label-or"); + + _cloudLoginButton.Add(_cloudLoginLabel); + + cloudLogin.Add(_cloudLoginButton); + cloudLogin.Add(orLabel); + + UpdateCloudLoginButton(); + EditorApplication.update += UpdateCloudLoginButton; + Add(cloudLogin); + } + + private void CreateErrorBox() + { + _errorBox = new Box() { name = "LoginErrorBox" }; + _errorBox.AddToClassList("error-container"); + _errorBox.style.display = DisplayStyle.None; + + var errorImage = new Image(); + _errorBox.Add(errorImage); + + _errorLabel = new Label(); + _errorBox.Add(_errorLabel); + + Add(_errorBox); + } + + public void DisplayError(string message) + { + if (string.IsNullOrEmpty(message)) + return; + + _errorLabel.text = message; + Debug.LogError(message); + + _errorBox.style.display = DisplayStyle.Flex; + } + + private void ClearError() + { + _errorLabel.text = string.Empty; + _errorBox.style.display = DisplayStyle.None; + } + + private void CreateCredentialsLogin() + { + // Manual login + VisualElement manualLoginBox = new VisualElement { name = "ManualLoginBox" }; + manualLoginBox.AddToClassList("credentials-container"); + + // Email input box + VisualElement inputBoxEmail = new VisualElement(); + inputBoxEmail.AddToClassList("credentials-input-container"); + + Label emailTitle = new Label { text = "Email" }; + _emailField = new TextField(); + + inputBoxEmail.Add(emailTitle); + inputBoxEmail.Add(_emailField); + + manualLoginBox.Add(inputBoxEmail); + + // Password input box + VisualElement inputBoxPassword = new VisualElement(); + inputBoxPassword.AddToClassList("credentials-input-container"); + + Label passwordTitle = new Label { text = "Password" }; + _passwordField = new TextField { isPasswordField = true }; + + inputBoxPassword.Add(passwordTitle); + inputBoxPassword.Add(_passwordField); + + manualLoginBox.Add(inputBoxPassword); + + // Login button + _credentialsLoginButton = new Button(LoginWithCredentials) { name = "LoginButtonCredentials" }; + _credentialsLoginButton.AddToClassList("credentials-button-login"); + + Label loginDescriptionCredentials = new Label { text = "Login" }; + loginDescriptionCredentials.AddToClassList("credentials-button-login-label"); + + _credentialsLoginButton.Add(loginDescriptionCredentials); + + manualLoginBox.Add(_credentialsLoginButton); + + Add(manualLoginBox); + + // Credentials login helpers + VisualElement helperBox = new VisualElement { name = "HelperBox" }; + helperBox.AddToClassList("help-section-container"); + + Button createAccountButton = new Button { name = "CreateAccountButton", text = "Create Publisher ID" }; + Button forgotPasswordButton = new Button { name = "ForgotPasswordButton", text = "Reset Password" }; + + createAccountButton.AddToClassList("help-section-hyperlink-button"); + forgotPasswordButton.AddToClassList("help-section-hyperlink-button"); + + createAccountButton.clicked += () => Application.OpenURL(Constants.Uploader.AccountRegistrationUrl); + forgotPasswordButton.clicked += () => Application.OpenURL(Constants.Uploader.AccountForgottenPasswordUrl); + + helperBox.Add(createAccountButton); + helperBox.Add(forgotPasswordButton); + + Add(helperBox); + } + + public async void LoginWithSessionToken() + { + ASDebug.Log("Authenticating with session token..."); + ClearError(); + SetEnabled(false); + + var result = await _authenticationService.AuthenticateWithSessionToken(); + if (!result.Success) + { + // Session authentication fail does not display errors in the UI + ASDebug.Log("No existing session was found"); + SetEnabled(true); + return; + } + + OnLoginSuccess(result.User); + } + + private async void LoginWithCloudToken() + { + ASDebug.Log("Authenticating with cloud token..."); + ClearError(); + SetEnabled(false); + + var result = await _authenticationService.AuthenticateWithCloudToken(); + if (!result.Success) + { + OnLoginFail(result.Exception.Message); + return; + } + + OnLoginSuccess(result.User); + } + + private async void LoginWithCredentials() + { + ASDebug.Log("Authenticating with credentials..."); + ClearError(); + var isValid = IsLoginDataValid(_emailField.text, _passwordField.value); + SetEnabled(!isValid); + + if (!isValid) + return; + + var result = await _authenticationService.AuthenticateWithCredentials(_emailField.text, _passwordField.text); + if (result.Success) + OnLoginSuccess(result.User); + else + OnLoginFail(result.Exception.Message); + } + + private bool IsLoginDataValid(string email, string password) + { + if (string.IsNullOrEmpty(email)) + { + DisplayError("Email field cannot be empty."); + return false; + } + + if (string.IsNullOrEmpty(password)) + { + DisplayError("Password field cannot be empty."); + return false; + } + + return true; + } + + private void UpdateCloudLoginButton() + { + if (_cloudLoginLabel == null) + return; + + if (_lastRefreshTime + _cloudLoginRefreshTime > EditorApplication.timeSinceStartup) + return; + + _lastRefreshTime = EditorApplication.timeSinceStartup; + + // Cloud login + if (_authenticationService.CloudAuthenticationAvailable(out var username, out var _)) + { + _cloudLoginLabel.text = $"Login as {username}"; + _cloudLoginButton.SetEnabled(true); + } + else + { + _cloudLoginLabel.text = "Cloud login unavailable"; + _cloudLoginButton.SetEnabled(false); + } + } + + private void OnLoginSuccess(User user) + { + ASDebug.Log($"Successfully authenticated as {user.Username}\n{user}"); + + _emailField.value = string.Empty; + _passwordField.value = string.Empty; + + OnAuthenticated?.Invoke(user); + SetEnabled(true); + } + + private void OnLoginFail(string message) + { + ASDebug.LogError($"Authentication failed: {message}"); + DisplayError(message); + SetEnabled(true); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs.meta new file mode 100644 index 00000000..394be9b1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e20b8602a9bd8ca48a5689b3f32cdd90 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/LoginView.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs new file mode 100644 index 00000000..a980d663 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs @@ -0,0 +1,249 @@ +using AssetStoreTools.Uploader.Data; +using AssetStoreTools.Uploader.Services; +using AssetStoreTools.Uploader.Services.Api; +using AssetStoreTools.Uploader.UI.Elements; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine.SceneManagement; +using UnityEngine.UIElements; +using PackageModel = AssetStoreTools.Api.Models.Package; + +namespace AssetStoreTools.Uploader.UI.Views +{ + internal class PackageListView : VisualElement + { + // Data + private List _packages; + private readonly string[] _priorityGroupNames = { "draft", "published" }; + + private IPackageDownloadingService _packageDownloadingService; + private IPackageFactoryService _packageFactory; + + // UI + private LoadingSpinner _loadingSpinner; + private ScrollView _packageScrollView; + private PackageListToolbar _packageListToolbar; + + public event Action OnInitializeError; + + public PackageListView(IPackageDownloadingService packageDownloadingService, IPackageFactoryService elementFactory) + { + _packages = new List(); + _packageDownloadingService = packageDownloadingService; + _packageFactory = elementFactory; + + Create(); + EditorSceneManager.activeSceneChangedInEditMode += OnSceneChange; + } + + private void Create() + { + styleSheets.Add(StyleSelector.UploaderWindow.PackageListViewStyle); + styleSheets.Add(StyleSelector.UploaderWindow.PackageListViewTheme); + + AddToClassList("package-list-view"); + + CreateFilteringTools(); + CreateLoadingSpinner(); + CreateScrollView(); + + ShowPackagesView(); + } + + private void CreateScrollView() + { + _packageScrollView = new ScrollView(); + Add(_packageScrollView); + } + + private void CreateFilteringTools() + { + _packageListToolbar = new PackageListToolbar(); + Add(_packageListToolbar); + } + + private void CreateLoadingSpinner() + { + _loadingSpinner = new LoadingSpinner(); + Add(_loadingSpinner); + } + + private void InsertReadOnlyInfoBox(string infoText) + { + var groupHeader = new Box { name = "GroupReadOnlyInfoBox" }; + groupHeader.AddToClassList("package-group-info-box"); + + var infoImage = new Image(); + groupHeader.Add(infoImage); + + var infoLabel = new Label { text = infoText }; + groupHeader.Add(infoLabel); + + _packageScrollView.Add(groupHeader); + } + + public async Task LoadPackages(bool useCachedData) + { + _packages.Clear(); + _packageScrollView.Clear(); + _packageListToolbar.SetEnabled(false); + + if (!useCachedData) + { + _packageDownloadingService.ClearPackageData(); + } + + _loadingSpinner.Show(); + await Task.Delay(100); + + try + { + var response = await _packageDownloadingService.GetPackageData(); + + if (response.Cancelled) + { + ASDebug.Log("Package retrieval was cancelled"); + return; + } + + if (!response.Success) + { + ASDebug.LogError(response.Exception); + OnInitializeError?.Invoke(response.Exception); + return; + } + + var packageModels = response.Packages; + ASDebug.Log($"Found {packageModels.Count} packages"); + + if (packageModels.Count == 0) + { + InsertReadOnlyInfoBox("You do not have any packages yet. Please visit the Publishing Portal if you " + + "would like to create one."); + return; + } + + // Create package groups + _packages = CreatePackages(packageModels); + var packageGroups = CreatePackageGroups(_packages); + var packageGroupElements = CreatePackageGroupElements(packageGroups); + PopulatePackageList(packageGroupElements); + + // Setup filtering and thumbnails + SetupFilteringToolbar(packageGroups); + DownloadAndSetThumbnails(); + } + finally + { + _loadingSpinner.Hide(); + } + } + + private List CreatePackages(List packageModels) + { + return _packages = packageModels.Select(x => _packageFactory.CreatePackage(x)).ToList(); + } + + private List CreatePackageGroups(List packages) + { + var packageGroups = new List(); + var packagesByStatus = packages.GroupBy(x => x.Status).ToDictionary(x => x.Key, x => x.ToList()); + + foreach (var kvp in packagesByStatus) + { + var groupName = char.ToUpper(kvp.Key[0]) + kvp.Key.Substring(1); + var groupPackages = kvp.Value; + var packageGroup = _packageFactory.CreatePackageGroup(groupName, groupPackages); + packageGroups.Add(packageGroup); + } + + return packageGroups; + } + + private List CreatePackageGroupElements(List packageGroups) + { + var elements = new List(); + foreach (var packageGroup in packageGroups) + elements.Add(new PackageGroupElement(packageGroup, _packageFactory)); + + return elements; + } + + private void PopulatePackageList(List packageGroups) + { + // Draft group + var draftGroup = packageGroups.FirstOrDefault(x => x.Name.Equals("draft", StringComparison.OrdinalIgnoreCase)); + if (draftGroup != null) + { + draftGroup.Toggle(true); + _packageScrollView.Add(draftGroup); + } + + // Infobox will only be shown if: + // 1) There is more than 1 group OR + // 2) There is only 1 group, but it is not draft + var showInfoBox = packageGroups.Count > 1 + || packageGroups.Count == 1 && !packageGroups[0].Name.Equals("draft", StringComparison.OrdinalIgnoreCase); + + if (showInfoBox) + InsertReadOnlyInfoBox("Only packages with a 'Draft' status can be selected for uploading Assets"); + + // Priority groups + foreach (var priorityName in _priorityGroupNames) + { + var priorityGroup = packageGroups.FirstOrDefault(x => x.Name.Equals(priorityName, StringComparison.OrdinalIgnoreCase)); + if (priorityGroup == null || _packageScrollView.Contains(priorityGroup)) + continue; + + _packageScrollView.Add(priorityGroup); + } + + // The rest + foreach (var group in packageGroups) + { + if (!_packageScrollView.Contains(group)) + _packageScrollView.Add(group); + } + } + + private void SetupFilteringToolbar(List packageGroups) + { + _packageListToolbar.SetPackageGroups(packageGroups); + _packageListToolbar.Sort(PackageSorting.Name); + _packageListToolbar.SetEnabled(true); + } + + private void DownloadAndSetThumbnails() + { + foreach (var package in _packages) + { + DownloadAndSetThumbnail(package); + } + } + + private async void DownloadAndSetThumbnail(IPackage package) + { + var response = await _packageDownloadingService.GetPackageThumbnail(package); + if (!response.Success) + return; + + package.UpdateIcon(response.Thumbnail); + } + + private void ShowPackagesView() + { + _packageScrollView.style.display = DisplayStyle.Flex; + _packageListToolbar.style.display = DisplayStyle.Flex; + } + + private void OnSceneChange(Scene _, Scene __) + { + DownloadAndSetThumbnails(); + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs.meta new file mode 100644 index 00000000..43e9178f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3c499c2d0a5e8fd4b9984184c59893e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Scripts/UI/Views/PackageListView.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles.meta new file mode 100644 index 00000000..6040ca4a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f9398c14296d30f479b9de5f3ec3b827 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView.meta new file mode 100644 index 00000000..03dac6e6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7564d91cabdce1344ba4a0fca25e13d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss new file mode 100644 index 00000000..d97cb7a5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss @@ -0,0 +1,134 @@ +/* Logo */ + +.asset-store-logo { + width: 90%; + height: 32px; + + align-self: center; + + margin: 40px 0; + + -unity-background-scale-mode: scale-to-fit; +} + +/* Cloud Login */ + +.cloud-button-login { + align-self: center; + + width: 75%; +} + +.cloud-button-login-label { + -unity-text-align: middle-center; + white-space: normal; + + min-height: 24px; + padding-right: 4px; +} + +.cloud-label-or { + align-self: center; + + -unity-text-align: middle-center; + + margin: 10px 0; +} + +/* Error Section */ + +.error-container { + flex-direction: row; + flex-shrink: 0; + + align-self: center; + + min-width: 300px; + max-width: 300px; + + margin: 5px 0 5px 1px; +} + +.error-container > Image { + flex-direction: row; + + width: 32px; + height: 32px; + + margin: 5px 10px; +} + +.error-container > Label { + flex-grow: 1; + flex-shrink: 1; + + -unity-text-align: middle-left; + white-space: normal; + + margin-right: 5px; + padding: 2px 0; +} + +/* Credentials Login */ + +.credentials-container { + align-self: center; + + width: 75%; + + padding: 15px; +} + +.credentials-input-container { + align-self: center; + + width: 100%; + + margin: 5px 0; +} + +.credentials-input-container > Label { + -unity-text-align: upper-left; + + margin: 2px 0; +} + +.credentials-input-container > TextField { + height: 20px; + margin: 0 1px; +} + +.credentials-button-login { + align-self: center; + + width: 100%; + margin: 10px 0 15px 0; +} + +.credentials-button-login-label { + -unity-text-align: middle-center; + white-space: normal; + + min-height: 24px; + padding-right: 4px; +} + +/* Help Section */ + +.help-section-container { + flex-direction: row; + + justify-content: space-between; + align-self: center; + + width: 75%; + margin: 5px 0; +} + +.help-section-hyperlink-button { + margin: 0 10px; + padding: 0; + + flex-shrink: 1; + white-space: normal; +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss.meta new file mode 100644 index 00000000..91ce4b51 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5e05fbdf7dd89a14985a87aa62a03a0e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/Style.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss new file mode 100644 index 00000000..39e3dfce --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss @@ -0,0 +1,44 @@ +/* Logo */ + +.asset-store-logo { + background-image: url("../../Icons/publisher-portal-dark.png"); +} + +/* Cloud Login */ + +.cloud-label-or { + color: rgb(200, 200, 200); +} + +/* Error Section */ + +.error-container { + background-color: rgb(63, 63, 63); +} + +.error-container > Image { + --unity-image: resource("console.erroricon@2x"); +} + +/* Credentials Login */ + +.credentials-container { + background-color: rgb(63, 63, 63); +} + +/* Help Section */ + +.help-section-hyperlink-button { + color: rgb(68, 113, 229); + border-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); +} + +.help-section-hyperlink-button:hover { + color: rgb(68, 133, 229); + cursor: link; +} + +.help-section-hyperlink-button:active { + color: rgb(68, 93, 229); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss.meta new file mode 100644 index 00000000..2beccfd3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: bea9503736c358b4e99eac03c0db32b7 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeDark.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss new file mode 100644 index 00000000..993c2b8c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss @@ -0,0 +1,44 @@ +/* Logo */ + +.asset-store-logo { + background-image: url("../../Icons/publisher-portal-light.png"); +} + +/* Cloud Login */ + +.cloud-label-or { + color: rgb(28, 28, 28); +} + +/* Error Section */ + +.error-container { + background-color: rgb(212, 212, 212); +} + +.error-container > Image { + --unity-image: resource("console.erroricon@2x"); +} + +/* Credentials Login */ + +.credentials-container { + background-color: rgb(212, 212, 212); +} + +/* Help Section */ + +.help-section-hyperlink-button { + color: rgb(68, 113, 229); + border-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); +} + +.help-section-hyperlink-button:hover { + color: rgb(68, 133, 229); + cursor: link; +} + +.help-section-hyperlink-button:active { + color: rgb(68, 93, 229); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss.meta new file mode 100644 index 00000000..10f17a4a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 895ecc4cb6c82b144b8423996c89f7ef +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/LoginView/ThemeLight.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView.meta new file mode 100644 index 00000000..f5446fd0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46d44b66f60dc484897f0afeee574dbe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss new file mode 100644 index 00000000..d36598c1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss @@ -0,0 +1,485 @@ +.package-list-view { + flex-grow: 1; +} + +/* Package List Toolbar */ + +.package-list-toolbar { + flex-direction: row; + flex-shrink: 0; + + justify-content: space-between; + + height: 24px; +} + +.package-search-field { + flex-grow: 1; + flex-shrink: 1; + align-items: center; + + margin: 1px; +} + +.package-search-field > #unity-search { + margin-top: 0; +} + +.package-search-field > * > .unity-base-field__input { + font-size: 12px; + + padding-left: 5px; +} + +.package-sort-menu { + flex-shrink: 0.001; + align-self: center; + + height: 21px; + + margin: 1px; + padding: 1px 6px; +} + +/* Loading Spinner */ + +.loading-spinner-box +{ + flex-grow: 1; + flex-shrink: 1; + + justify-content: center; +} + +.loading-spinner-image { + align-self: center; + + width: 16px; + height: 16px; +} + +/* Package Group */ + +.package-group-expander-box { + flex-direction: row; + flex-grow: 0; + flex-shrink: 0; + + align-items: center; + + min-height: 30px; + + margin: 10px 0 2px 0; + padding: 1px 5px; +} + +.package-group-expander +{ + align-self: center; + + width: 30px; + height: 30px; +} + +.package-group-label { + font-size: 14px; + -unity-font-style: bold; +} + +.package-group-content-box { + margin: 0; +} + +.package-group-separator { + height: 2px; + + margin: 5px 15px; + + display: none; +} + +.package-group-info-box { + flex-direction: row; + align-items: center; + font-size: 12px; + margin: 5px; + margin-top: 5px; +} + +.package-group-info-box > Image +{ + flex-direction: row; + flex-shrink: 0; + + width: 32px; + height: 32px; + + margin: 5px 10px; +} + +.package-group-info-box > Label +{ + flex-grow: 1; + flex-shrink: 1; + + -unity-text-align: middle-left; + white-space: normal; + + margin-right: 5px; +} + +/* Package Element */ + +.package-full-box { + flex-direction: column; + flex-shrink: 0; + flex-grow: 0; + + min-width: 280px; +} + +.package-foldout-box { + flex-direction: column; + margin: 0; +} + +.package-foldout-box-expanded { + padding-top: 3px; + top: -2px; +} + +.package-foldout-box-info { + flex-direction: row; + flex-grow: 0; + flex-shrink: 0; + + align-items: center; + justify-content: space-between; + + min-width: 200px; + min-height: 50px; + + margin: 2px; +} + +.package-expander-label-row { + flex-basis: 200px; + flex-direction: row; + flex-grow: 1; +} + +.package-expander { + align-self: center; + + width: 30px; + height: 30px; +} + +.package-image { + flex-shrink: 0; + + width: 48px; + height: 48px; + + margin: 0 5px; +} + +.package-label-info-box { + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + + align-self: center; +} + +.package-label { + flex-shrink: 1; + + align-self: stretch; + + -unity-text-align: middle-left; + -unity-font-style: bold; + white-space: normal; +} + +.package-info { + font-size: 11px; + -unity-text-align: middle-left; + white-space: normal; +} + +.package-open-in-browser-button { + flex-shrink: 0; + + width: 16px; + height: 16px; + + -unity-background-scale-mode: scale-to-fit; +} + +.package-header-progress-bar { + margin: 0 -6px -1px -6px; + padding: 0 0 2px 0; +} + +.package-header-progress-bar > * > .unity-progress-bar__background { + height: 5px; +} + +/* Package Content Element & its nested elements */ + +.package-content-element { + flex-grow: 1; + flex-shrink: 0; + + overflow: hidden; + + margin: -5px 0px 2px 0px; + padding: 5px 10px 5px 40px; +} + +.package-content-option-box { + flex-direction: row; + + margin-top: 10px; +} + +.package-content-option-label-help-row { + flex-direction: row; + flex-shrink: 0; + + align-self: flex-start; + align-items: center; + justify-content: flex-start; + + width: 115px; +} + +.package-content-option-label-help-row > Label { + -unity-text-align: middle-left; +} + +.package-content-option-label-help-row > Image { + height: 16px; + width: 16px; +} + +.package-content-option-dropdown { + flex-grow: 1; + flex-shrink: 1; + + align-self: stretch; + + margin-right: 0; + margin-left: 3px; +} + +.package-content-option-textfield { + flex-grow: 1; + flex-shrink: 1; + + align-self: stretch; +} + +.package-content-option-button { + margin-right: 0; +} + +.package-content-option-toggle { + flex-shrink: 1; +} + +.package-content-option-toggle > * { + flex-shrink: 1; +} + +.package-content-option-toggle * > .unity-label { + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; + margin-left: 5px; +} + +/* MutliToggleSelection Element */ + +.multi-toggle-box { + flex-grow: 1; + flex-direction: column; +} + +.multi-toggle-box-scrollview { + flex-grow: 1; + + height: 100px; + margin-left: 3px; +} + +.multi-toggle-box-scrollview > .unity-scroll-view__content-viewport +{ + margin-left: 1px; +} + +.multi-toggle-box-scrollview > * > .unity-scroll-view__content-container +{ + padding: 3px 0 5px 0; +} + +.multi-toggle-box-scrollview > * > .unity-scroll-view__vertical-scroller +{ + margin: -1px 0; +} + +.multi-toggle-box-empty-label { + flex-grow: 1; + + font-size: 11px; + -unity-text-align: middle-center; + white-space: normal; + + display: none; +} + +.multi-toggle-box-toolbar { + flex-direction: row; + margin: -1px 0 0 3px; +} + +.multi-toggle-box-toolbar-selecting-box { + flex-grow: 1; + flex-shrink: 1; + flex-direction: row; + + align-items: center; + justify-content: flex-end; + + margin-top: 1px; +} + +.multi-toggle-box-toolbar-selecting-box > Button { + flex-shrink: 1; + width: 75px; + margin-right: 0; +} + +.multi-toggle-box-toolbar-filtering-box { + flex-grow: 1; + flex-direction: row; + + align-items: center; + justify-content: flex-start; + + margin-top: 1px; + margin-left: 1px; +} + +.multi-toggle-box-toolbar-filtering-box > ToolbarMenu { + width: 100px; + margin: 0; +} + +.multi-toggle-box-toggle { + padding: 2px 0 0 5px; +} + +.multi-toggle-box-toggle > * > .unity-label { + margin-left: 5px; +} + +/* Validation Element */ + +.validation-result-box { + flex-direction: row; + + align-items: center; + + font-size: 12px; + + margin-top: 5px; +} + +.validation-result-box > Image { + flex-direction: row; + flex-shrink: 0; + + width: 32px; + height: 32px; + + margin: 5px 10px; +} + +.validation-result-box > Label { + flex-grow: 1; + flex-shrink: 1; + + -unity-text-align: middle-left; + white-space: normal; + + margin-right: 5px; +} + +.validation-result-box > Button { + margin-right: 10px; +} + +.validation-result-view-report-button-container { + flex-shrink: 0; + padding: 0 10px 0 10px; +} + +.validation-result-view-report-button { + margin: 0; + padding: 4px 0 4px 0; +} + +.validation-result-view-report-button:hover { + cursor: link; +} + +/* Uploading Element */ + +.uploading-box { + margin-top: 10px; +} + +.uploading-export-and-upload-container { + flex-direction: row; + flex-wrap: wrap; +} + +.uploading-export-button { + flex-basis: 110px; + flex-grow: 1; + height: 24px; + margin: 1px 2px 0 2px; +} + +.uploading-upload-button { + flex-basis: 110px; + flex-grow: 1; + height: 24px; + margin: 1px 2px 0 2px; +} + +.uploading-progress-container { + flex-direction: row; +} + +.uploading-progress-bar { + flex-grow: 1; + flex-shrink: 1; + + justify-content: center; + + padding: 0; + margin: 0 10px 0 0; +} + +.uploading-progress-bar > * > .unity-progress-bar__background { + height: 22px; +} + +.uploading-cancel-button { + width: 95px; + height: 24px; + margin: 0; +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss.meta new file mode 100644 index 00000000..d2610f84 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4b3b52dc166e3e24bb1ce4acd2592f3a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/Style.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss new file mode 100644 index 00000000..a0ef9ed4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss @@ -0,0 +1,238 @@ +/* Package List Toolbar */ + +.package-list-toolbar { + border-bottom-width: 1px; + border-color: rgb(33, 33, 33); + + background-color: rgb(68, 68, 68); +} + +.package-sort-menu { + color: rgb(238, 238, 238); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(36, 36, 36); + + background-color: rgb(88, 88, 88); +} + +.package-sort-menu:hover { + background-color: rgb(103, 103, 103); +} + +.package-sort-menu:active { + background-color: rgb(73, 73, 73); +} + +/* Loading Spinner */ + +.loading-spinner-image { + --unity-image: resource("WaitSpin00"); +} + +/* Package Group */ + +.package-group-expander-box { + border-width: 0; + border-color: rgba(33, 33, 33, 0); + + background-color: rgba(68, 68, 68, 0); +} + +.package-group-expander { + color: rgb(104, 104, 104); +} + +.package-group-label { + color: rgb(255, 255, 255); +} + +.package-group-separator { + background-color: rgb(48, 48, 48); +} + +.package-group-info-box { + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.package-group-info-box > Image { + --unity-image: resource("console.infoicon@2x"); +} + +/* Package Element */ + +.package-foldout-box { + border-width: 0; + border-radius: 0; + background-color: rgb(56, 56, 56); +} + +.package-foldout-box:hover { + background-color: rgb(68, 68, 68); +} + +.package-foldout-box-draft:active { + background-color: rgb(48, 48, 48); +} + +.package-foldout-box-expanded { + background-color: rgb(68, 68, 68); +} + +.package-expander { + color: rgb(104, 104, 104); +} + +.package-image { + border-radius: 5px; + background-image: resource("Sprite Icon"); +} + +.package-label { + color: rgb(255, 255, 255); +} + +.package-info { + color: rgb(200, 200, 200); +} + +.package-open-in-browser-button { + border-width: 0; + border-radius: 0; + + background-color: rgba(0, 0, 0, 0); + background-image: url("../../Icons/open-in-browser.png"); + + -unity-background-image-tint-color: rgb(200, 200, 200); +} + +.package-open-in-browser-button:hover { + -unity-background-image-tint-color: rgb(255, 255, 255); +} + +.package-open-in-browser-button:active { + -unity-background-image-tint-color: rgb(155, 155, 155); +} + +.package-header-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background { + border-width: 0; + background-color: rgba(0, 0, 0, 0); +} + +.package-header-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background > .unity-progress-bar__progress { + background-image: none; + background-color: rgb(33, 150, 243); +} + +/* Package Content Element */ + +.package-content-element { + background-color: rgb(68, 68, 68); +} + +.package-content-option-label-help-row > Image { + --unity-image: resource("d__Help@2x"); +} + +.package-content-option-dropdown { + color: rgb(238, 238, 238); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(36, 36, 36); + + background-color: rgb(88, 88, 88); +} + +.package-content-option-dropdown:hover { + background-color: rgb(103, 103, 103); +} + +/* MultiToggleSelection Element */ + +.multi-toggle-box-scrollview { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(58, 58, 58); +} + +.multi-toggle-box-scrollview > * > .unity-scroll-view__vertical-scroller { + border-right-width: 0; +} + +.multi-toggle-box-empty-label { + color: rgb(200, 200, 200); +} + +.multi-toggle-box-toolbar { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(58, 58, 58); +} + +.multi-toggle-box-toolbar-filtering-box > ToolbarMenu { + color: rgb(188, 188, 188); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(36, 36, 36); + + background-color: rgb(88, 88, 88); +} + +/* Validation Element */ + +.validation-result-box { + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.validation-result-box > Image { + --unity-image: resource("console.infoicon@2x"); +} + +.validation-result-view-report-button { + color: rgb(68, 113, 229); + border-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); +} + +.validation-result-view-report-button:hover { + color: rgb(68, 133, 229); +} + +.validation-result-view-report-button:active { + color: rgb(68, 93, 229); +} + +/* Uploading Element */ + +.uploading-export-button { + color: rgb(220, 220, 220); + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.uploading-upload-button { + color: rgb(220, 220, 220); + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.uploading-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background { + border-width: 0; + border-radius: 2px; +} + +.uploading-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background > .unity-progress-bar__progress { + background-image: none; + background-color: rgb(33, 150, 243); +} + +.uploading-cancel-button { + color: rgb(220, 220, 220); + border-width: 1px; + border-color: rgb(33, 33, 33); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss.meta new file mode 100644 index 00000000..59f35b0c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2096f0ee5b05ec643b409ded0d725eb3 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeDark.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss new file mode 100644 index 00000000..d375fca0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss @@ -0,0 +1,238 @@ +/* Package List Toolbar */ + +.package-list-toolbar { + border-bottom-width: 1px; + border-color: rgb(127, 127, 127); + + background-color: rgb(203, 203, 203); +} + +.package-sort-menu { + color: rgb(9, 9, 9); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(178, 178, 178); + + background-color: rgb(228, 228, 228); +} + +.package-sort-menu:hover { + background-color: rgb(236, 236, 236); +} + +.package-sort-menu:active { + background-color: rgb(220, 220, 220); +} + +/* Loading Spinner */ + +.loading-spinner-image { + --unity-image: resource("WaitSpin00"); +} + +/* Package Group */ + +.package-group-expander-box { + border-width: 0; + border-color: rgba(0, 0, 0, 0); + + background-color: rgba(0, 0, 0, 0); +} + +.package-group-expander { + color: rgb(77, 77, 77); +} + +.package-group-label { + color: rgb(0, 0, 0); +} + +.package-group-separator +{ + background-color: rgb(48, 48, 48); +} + +.package-group-info-box +{ + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.package-group-info-box > Image +{ + --unity-image: resource("console.infoicon@2x"); +} + +/* Package Element */ + +.package-foldout-box { + border-width: 0; + border-radius: 0; + background-color: rgb(198, 198, 198); +} + +.package-foldout-box:hover { + background-color: rgb(212, 212, 212); +} + +.package-foldout-box-draft:active { + background-color: rgb(180, 180, 180); +} + +.package-foldout-box-expanded { + background-color: rgb(212, 212, 212); +} + +.package-expander { + color: rgb(77, 77, 77); +} + +.package-image { + border-radius: 5px; + background-image: resource("Sprite Icon"); +} + +.package-label { + color: rgb(0, 0, 0); +} + +.package-info { + color: rgb(48, 48, 48); +} + +.package-open-in-browser-button { + border-width: 0; + border-radius: 0; + + background-color: rgba(0, 0, 0, 0); + background-image: url("../../Icons/open-in-browser.png"); + + -unity-background-image-tint-color: rgb(150, 150, 150); +} + +.package-open-in-browser-button:hover { + -unity-background-image-tint-color: rgb(100, 100, 100); +} + +.package-open-in-browser-button:active { + -unity-background-image-tint-color: rgb(50, 50, 50); +} + +.package-header-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background { + border-width: 0; + background-color: rgba(0, 0, 0, 0); +} + +.package-header-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background > .unity-progress-bar__progress { + background-image: none; + background-color: rgb(108, 157, 243); +} + +/* Package Content Element */ + +.package-content-element { + background-color: rgb(212, 212, 212); +} + +.package-content-option-label-help-row > Image { + --unity-image: resource("_Help@2x"); +} + +.package-content-option-dropdown { + color: rgb(9, 9, 9); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(178, 178, 178); + + background-color: rgb(228, 228, 228); +} + +.package-content-option-dropdown:hover { + background-color: rgb(236, 236, 236); +} + +/* MultiToggleSelection Element */ + +.multi-toggle-box-scrollview { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(200, 200, 200); +} + +.multi-toggle-box-scrollview > * > .unity-scroll-view__vertical-scroller { + border-right-width: 0; +} + +.multi-toggle-box-empty-label { + color: rgb(0, 0, 0); +} + +.multi-toggle-box-toolbar { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(200, 200, 200); +} + +.multi-toggle-box-toolbar-filtering-box > ToolbarMenu { + color: rgb(9, 9, 9); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(178, 178, 178); + + background-color: rgb(228, 228, 228); +} + +/* Validation Element */ + +.validation-result-box { + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.validation-result-box > Image { + --unity-image: resource("console.infoicon@2x"); +} + +.validation-result-view-report-button { + color: rgb(68, 113, 229); + border-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); +} + +.validation-result-view-report-button:hover { + color: rgb(68, 133, 229); +} + +.validation-result-view-report-button:active { + color: rgb(68, 93, 229); +} + +/* Uploading Element */ + +.uploading-export-button { + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.uploading-upload-button { + border-width: 1px; + border-color: rgb(33, 33, 33); +} + +.uploading-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background { + border-width: 0; + border-radius: 2px; +} + +.uploading-progress-bar > .unity-progress-bar__container > .unity-progress-bar__background > .unity-progress-bar__progress { + background-image: none; + background-color: rgb(108, 157, 243); +} + +.uploading-cancel-button { + border-width: 1px; + border-color: rgb(33, 33, 33); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss.meta new file mode 100644 index 00000000..3c75bb10 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9b79808cdce73b949abc32c5fada1bda +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/PackageListView/ThemeLight.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss new file mode 100644 index 00000000..6a692613 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss @@ -0,0 +1,74 @@ +.uploader-window-root { + flex-grow: 1; +} + +.uploader-window-root-scrollview { + flex-grow: 1; +} + +.uploader-window-root-scrollview > * > .unity-scroll-view__content-container { + flex-grow: 1; +} + +.uploader-window-root-scrollview > * > .unity-scroll-view__content-viewport { + flex-shrink: 1; +} + +.uploader-window-root-scrollview > * > * > .unity-scroll-view__content-container { + flex-grow: 1; + flex-shrink: 1; +} + +.account-toolbar { + flex-direction: row; + flex-shrink: 0; + + justify-content: space-between; + margin: 0; +} + +.account-toolbar-left-side-container { + flex-grow: 1; + flex-shrink: 0; + flex-basis: 0px; + overflow: hidden; + min-width: 16px; + align-self: center; + flex-direction: row; + margin: 3px 0px 3px 1px; +} + +.account-toolbar-right-side-container { + flex-shrink: 1; + flex-grow: 0; + flex-wrap: wrap; + align-self: center; + flex-direction: row; + margin: 0; +} + +.account-toolbar-user-image { + width: 16px; + height: 16px; + flex-shrink: 0; + margin-right: 1px; +} + +.account-toolbar-email-label { + flex-shrink: 1; + overflow: hidden; + text-overflow: ellipsis; + -unity-font-style: bold; +} + +.account-toolbar-button-refresh { + flex-grow: 1; + min-width: 50px; + margin-right: 1px; +} + +.account-toolbar-button-logout { + flex-grow: 1; + min-width: 50px; + margin-right: 1px; +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss.meta new file mode 100644 index 00000000..5c66c3e7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6f0343bfa66bbb344bee68a23d24cca8 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/Style.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss new file mode 100644 index 00000000..7f836d43 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss @@ -0,0 +1,9 @@ +.account-toolbar { + background-color: rgb(68, 68, 68); + border-color: rgb(33, 33, 33); + border-top-width: 1px; +} + +.account-toolbar-user-image { + background-image: url("../Icons/account-dark.png"); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss.meta new file mode 100644 index 00000000..ee3b491d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 26d328c2ffac2ff44af266e9c632f2ab +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeDark.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss new file mode 100644 index 00000000..16e3de4d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss @@ -0,0 +1,9 @@ +.account-toolbar { + background-color: rgb(203, 203, 203); + border-color: rgb(127, 127, 127); + border-top-width: 1px; +} + +.account-toolbar-user-image { + background-image: url("../Icons/account-light.png"); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss.meta new file mode 100644 index 00000000..8ddebb5f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a994594cc493b7346b4d4a71d39908dc +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/Styles/ThemeLight.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs b/Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs new file mode 100644 index 00000000..f9fffa9b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs @@ -0,0 +1,232 @@ +using AssetStoreTools.Api.Models; +using AssetStoreTools.Uploader.Services; +using AssetStoreTools.Uploader.Services.Analytics; +using AssetStoreTools.Uploader.Services.Api; +using AssetStoreTools.Uploader.UI.Elements; +using AssetStoreTools.Uploader.UI.Views; +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEditor; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Uploader +{ + internal class UploaderWindow : AssetStoreToolsWindow + { + private const string DebugPhrase = "debug"; + + // Services + private ICachingService _cachingService; + private IAuthenticationService _authenticationService; + private IPackageDownloadingService _packageDownloadingService; + private IPackageUploadingService _packageUploadingService; + private IAnalyticsService _analyticsService; + private IPackageFactoryService _packageFactoryService; + + // Data + private bool _isQuitting = false; + + // UI + private VisualElement _uploaderWindowRoot; + private ScrollView _rootScrollView; + + private LoginView _loginView; + private PackageListView _packageListView; + private AccountToolbar _accountToolbar; + + protected override string WindowTitle => "Asset Store Uploader"; + + protected override void Init() + { + RegisterServices(); + SetupWindow(); + } + + private void RegisterServices() + { + var uploaderServiceProvider = UploaderServiceProvider.Instance; + _analyticsService = uploaderServiceProvider.GetService(); + _cachingService = uploaderServiceProvider.GetService(); + _authenticationService = uploaderServiceProvider.GetService(); + _packageDownloadingService = uploaderServiceProvider.GetService(); + _packageUploadingService = uploaderServiceProvider.GetService(); + _packageFactoryService = uploaderServiceProvider.GetService(); + } + + private void SetupWindow() + { + minSize = new Vector2(400, 430); + this.SetAntiAliasing(4); + rootVisualElement.styleSheets.Add(StyleSelector.UploaderWindow.UploaderWindowStyle); + rootVisualElement.styleSheets.Add(StyleSelector.UploaderWindow.UploaderWindowTheme); + + if (_cachingService.GetCachedUploaderWindow(out _uploaderWindowRoot)) + { + rootVisualElement.Add(_uploaderWindowRoot); + return; + } + + _uploaderWindowRoot = new VisualElement(); + _uploaderWindowRoot.AddToClassList("uploader-window-root"); + rootVisualElement.Add(_uploaderWindowRoot); + + _rootScrollView = new ScrollView(); + _rootScrollView.AddToClassList("uploader-window-root-scrollview"); + _uploaderWindowRoot.Add(_rootScrollView); + + CreateLoginView(); + CreatePackageListView(); + CreateAccountToolbar(); + EditorApplication.wantsToQuit += OnWantsToQuit; + + _cachingService.CacheUploaderWindow(_uploaderWindowRoot); + + PerformAuthentication(); + } + + private void CreateLoginView() + { + _loginView = new LoginView(_authenticationService); + _loginView.OnAuthenticated += OnAuthenticationSuccess; + _rootScrollView.Add(_loginView); + } + + private void CreatePackageListView() + { + _packageListView = new PackageListView(_packageDownloadingService, _packageFactoryService); + _packageListView.OnInitializeError += PackageViewInitializationError; + _rootScrollView.Add(_packageListView); + } + + private void CreateAccountToolbar() + { + _accountToolbar = new AccountToolbar(); + _accountToolbar.OnRefresh += RefreshPackages; + _accountToolbar.OnLogout += LogOut; + _uploaderWindowRoot.Add(_accountToolbar); + } + + private void PerformAuthentication() + { + ShowAuthenticationView(); + _loginView.LoginWithSessionToken(); + } + + private async void OnAuthenticationSuccess(User user) + { + _accountToolbar.SetUser(user); + _accountToolbar.DisableButtons(); + + ShowAccountPackageView(); + await _packageListView.LoadPackages(true); + + _accountToolbar.EnableButtons(); + } + + private async Task RefreshPackages() + { + _packageUploadingService.StopAllUploadinng(); + _packageDownloadingService.StopDownloading(); + + await _packageListView.LoadPackages(false); + } + + private void LogOut() + { + _packageUploadingService.StopAllUploadinng(); + _packageDownloadingService.StopDownloading(); + + _authenticationService.Deauthenticate(); + _packageDownloadingService.ClearPackageData(); + + _accountToolbar.SetUser(null); + ShowAuthenticationView(); + } + + private void PackageViewInitializationError(Exception e) + { + _loginView.DisplayError(e.Message); + LogOut(); + } + + private void ShowAuthenticationView() + { + HideElement(_accountToolbar); + HideElement(_packageListView); + ShowElement(_loginView); + } + + private void ShowAccountPackageView() + { + HideElement(_loginView); + ShowElement(_accountToolbar); + ShowElement(_packageListView); + } + + private void ShowElement(params VisualElement[] elements) + { + foreach (var e in elements) + e.style.display = DisplayStyle.Flex; + } + + private void HideElement(params VisualElement[] elements) + { + foreach (var e in elements) + e.style.display = DisplayStyle.None; + } + + private void OnDestroy() + { + if (!_isQuitting && _packageUploadingService.IsUploading) + { + EditorUtility.DisplayDialog("Notice", "Assets are still being uploaded to the Asset Store. " + + "If you wish to check on the progress, please re-open the Asset Store Uploader window", "OK"); + } + } + + private bool OnWantsToQuit() + { + if (!_packageUploadingService.IsUploading) + return true; + + _isQuitting = EditorUtility.DisplayDialog("Notice", "Assets are still being uploaded to the Asset Store. " + + "Would you still like to close Unity Editor?", "Yes", "No"); + + return _isQuitting; + } + + #region Debug Utility + + private readonly List _debugBuffer = new List(); + + private void OnGUI() + { + CheckForDebugMode(); + } + + private void CheckForDebugMode() + { + Event e = Event.current; + + if (e.type != EventType.KeyDown || e.keyCode == KeyCode.None) + return; + + _debugBuffer.Add(e.keyCode.ToString().ToLower()[0]); + if (_debugBuffer.Count > DebugPhrase.Length) + _debugBuffer.RemoveAt(0); + + if (string.Join(string.Empty, _debugBuffer.ToArray()) != DebugPhrase) + return; + + ASDebug.DebugModeEnabled = !ASDebug.DebugModeEnabled; + ASDebug.Log($"DEBUG MODE ENABLED: {ASDebug.DebugModeEnabled}"); + _debugBuffer.Clear(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs.meta new file mode 100644 index 00000000..2a90137e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7b5319699cc84194a9a768ad33b86c21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Uploader/UploaderWindow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility.meta b/Packages/com.unity.asset-store-tools/Editor/Utility.meta new file mode 100644 index 00000000..9a2bdffe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3dfd03e520c145b45a32c7e2915fe3cb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs new file mode 100644 index 00000000..16fc4c8b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs @@ -0,0 +1,65 @@ +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Utility +{ + internal static class ASDebug + { + private enum LogType + { + Info, + Warning, + Error + } + + private static string FormatInfo(object message) => $"[AST Info] {message}"; + private static string FormatWarning(object message) => $"[AST Warning] {message}"; + private static string FormatError(object message) => $"[AST Error] {message}"; + + + private static bool s_debugModeEnabled = EditorPrefs.GetBool(Constants.Debug.DebugModeKey); + + public static bool DebugModeEnabled + { + get => s_debugModeEnabled; + set { s_debugModeEnabled = value; EditorPrefs.SetBool(Constants.Debug.DebugModeKey, value); } + } + + public static void Log(object message) + { + LogMessage(message, LogType.Info); + } + + public static void LogWarning(object message) + { + LogMessage(message, LogType.Warning); + } + + public static void LogError(object message) + { + LogMessage(message, LogType.Error); + } + + private static void LogMessage(object message, LogType type) + { + if (!DebugModeEnabled) + return; + + switch (type) + { + case LogType.Info: + Debug.Log(FormatInfo(message)); + break; + case LogType.Warning: + Debug.LogWarning(FormatWarning(message)); + break; + case LogType.Error: + Debug.LogError(FormatError(message)); + break; + default: + Debug.Log(message); + break; + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs.meta new file mode 100644 index 00000000..2af38a3e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 478caa497d99100429a0509fa487bfe4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/ASDebug.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs new file mode 100644 index 00000000..73ad2bde --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Utility +{ + internal class ASToolsPreferences + { + private static ASToolsPreferences s_instance; + public static ASToolsPreferences Instance => s_instance ?? (s_instance = new ASToolsPreferences()); + + public static event Action OnSettingsChange; + + private ASToolsPreferences() + { + Load(); + } + + private void Load() + { + CheckForUpdates = PlayerPrefs.GetInt("AST_CheckForUpdates", 1) == 1; + LegacyVersionCheck = PlayerPrefs.GetInt("AST_LegacyVersionCheck", 1) == 1; + UploadVersionCheck = PlayerPrefs.GetInt("AST_UploadVersionCheck", 1) == 1; + DisplayHiddenMetaDialog = PlayerPrefs.GetInt("AST_HiddenFolderMetaCheck", 1) == 1; + EnableSymlinkSupport = PlayerPrefs.GetInt("AST_EnableSymlinkSupport", 0) == 1; + UseLegacyExporting = PlayerPrefs.GetInt("AST_UseLegacyExporting", 0) == 1; + } + + public void Save(bool triggerSettingsChange = false) + { + PlayerPrefs.SetInt("AST_CheckForUpdates", CheckForUpdates ? 1 : 0); + PlayerPrefs.SetInt("AST_LegacyVersionCheck", LegacyVersionCheck ? 1 : 0); + PlayerPrefs.SetInt("AST_UploadVersionCheck", UploadVersionCheck ? 1 : 0); + PlayerPrefs.SetInt("AST_HiddenFolderMetaCheck", DisplayHiddenMetaDialog ? 1 : 0); + PlayerPrefs.SetInt("AST_EnableSymlinkSupport", EnableSymlinkSupport ? 1 : 0); + PlayerPrefs.SetInt("AST_UseLegacyExporting", UseLegacyExporting ? 1 : 0); + PlayerPrefs.Save(); + + if (triggerSettingsChange) + OnSettingsChange?.Invoke(); + } + + /// + /// Periodically check if an update for the Asset Store Publishing Tools is available + /// + public bool CheckForUpdates; + + /// + /// Check if legacy Asset Store Tools are in the Project + /// + public bool LegacyVersionCheck; + + /// + /// Enables a DisplayDialog when hidden folders are found to be missing meta files + /// + public bool DisplayHiddenMetaDialog; + + /// + /// Check if the package has been uploaded from a correct Unity version at least once + /// + public bool UploadVersionCheck; + + /// + /// Enables Junction symlink support + /// + public bool EnableSymlinkSupport; + + /// + /// Enables legacy exporting for Folder Upload workflow + /// + public bool UseLegacyExporting; + } + + internal class ASToolsPreferencesProvider : SettingsProvider + { + private const string SettingsPath = "Project/Asset Store Tools"; + + private class Styles + { + public static readonly GUIContent CheckForUpdatesLabel = EditorGUIUtility.TrTextContent("Check for Updates", "Periodically check if an update for the Asset Store Publishing Tools is available."); + public static readonly GUIContent LegacyVersionCheckLabel = EditorGUIUtility.TrTextContent("Legacy ASTools Check", "Enable Legacy Asset Store Tools version checking."); + public static readonly GUIContent UploadVersionCheckLabel = EditorGUIUtility.TrTextContent("Upload Version Check", "Check if the package has been uploader from a correct Unity version at least once."); + public static readonly GUIContent DisplayHiddenMetaDialogLabel = EditorGUIUtility.TrTextContent("Display Hidden Folder Meta Dialog", "Show a DisplayDialog when hidden folders are found to be missing meta files.\nNote: this only affects hidden folders ending with a '~' character"); + public static readonly GUIContent EnableSymlinkSupportLabel = EditorGUIUtility.TrTextContent("Enable Symlink Support", "Enable Junction Symlink support. Note: folder selection validation will take longer."); + public static readonly GUIContent UseLegacyExportingLabel = EditorGUIUtility.TrTextContent("Use Legacy Exporting", "Enabling this option uses native Unity methods when exporting packages for the Folder Upload workflow.\nNote: individual package dependency selection when choosing to 'Include Package Manifest' is unavailable when this option is enabled."); + public static readonly GUIContent UseCustomPreviewsLabel = EditorGUIUtility.TrTextContent("Enable High Quality Previews (experimental)", "Override native asset preview retrieval with higher-quality preview generation"); + } + + public static void OpenSettings() + { + SettingsService.OpenProjectSettings(SettingsPath); + } + + private ASToolsPreferencesProvider(string path, SettingsScope scopes, IEnumerable keywords = null) + : base(path, scopes, keywords) { } + + public override void OnGUI(string searchContext) + { + var preferences = ASToolsPreferences.Instance; + + EditorGUI.BeginChangeCheck(); + using (CreateSettingsWindowGUIScope()) + { + preferences.CheckForUpdates = EditorGUILayout.Toggle(Styles.CheckForUpdatesLabel, preferences.CheckForUpdates); + preferences.LegacyVersionCheck = EditorGUILayout.Toggle(Styles.LegacyVersionCheckLabel, preferences.LegacyVersionCheck); + preferences.UploadVersionCheck = EditorGUILayout.Toggle(Styles.UploadVersionCheckLabel, preferences.UploadVersionCheck); + preferences.DisplayHiddenMetaDialog = EditorGUILayout.Toggle(Styles.DisplayHiddenMetaDialogLabel, preferences.DisplayHiddenMetaDialog); + preferences.EnableSymlinkSupport = EditorGUILayout.Toggle(Styles.EnableSymlinkSupportLabel, preferences.EnableSymlinkSupport); + preferences.UseLegacyExporting = EditorGUILayout.Toggle(Styles.UseLegacyExportingLabel, preferences.UseLegacyExporting); + } + + if (EditorGUI.EndChangeCheck()) + { + ASToolsPreferences.Instance.Save(true); + } + } + + [SettingsProvider] + public static SettingsProvider CreateAssetStoreToolsSettingProvider() + { + var provider = new ASToolsPreferencesProvider(SettingsPath, SettingsScope.Project, GetSearchKeywordsFromGUIContentProperties()); + return provider; + } + + private IDisposable CreateSettingsWindowGUIScope() + { + var unityEditorAssembly = Assembly.GetAssembly(typeof(EditorWindow)); + var type = unityEditorAssembly.GetType("UnityEditor.SettingsWindow+GUIScope"); + return Activator.CreateInstance(type) as IDisposable; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs.meta new file mode 100644 index 00000000..de831827 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b75179c8d22a35b42a543d6fa7857ce0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsPreferences.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs new file mode 100644 index 00000000..698b9748 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs @@ -0,0 +1,250 @@ +using AssetStoreTools.Api; +using System; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Utility +{ + [InitializeOnLoad] + internal class ASToolsUpdater : AssetStoreToolsWindow + { + protected override string WindowTitle => "Asset Store Tools Update Check"; + + private static IAssetStoreApi _api; + + private VisualElement _loadingContainer; + private VisualElement _versionInfoContainer; + + private Image _loadingImage; + private double _lastTimeSinceStartup; + private double _timeSinceLoadingImageChange; + private int _loadingImageIndex; + + private static bool _updateCheckPerformed + { + get + { + return SessionState.GetBool("AST_UpdateChecked", false); + } + set + { + SessionState.SetBool("AST_UpdateChecked", value); + } + } + + static ASToolsUpdater() + { + _api = new AssetStoreApi(new AssetStoreClient()); + // Retrieving cached SessionState/PlayerPrefs values is not allowed from an instance field initializer + EditorApplication.update += CheckForUpdatesAfterEditorUpdate; + } + + private static async void CheckForUpdatesAfterEditorUpdate() + { + EditorApplication.update -= CheckForUpdatesAfterEditorUpdate; + + if (!ShouldCheckForUpdates()) + return; + + await CheckForUpdates((success, currentVersion, latestVersion) => + { + if (success && currentVersion < latestVersion) + { + AssetStoreTools.OpenUpdateChecker(); + } + }); + } + + private static bool ShouldCheckForUpdates() + { + if (!ASToolsPreferences.Instance.CheckForUpdates) + return false; + + return _updateCheckPerformed == false; + } + + private static async Task CheckForUpdates(Action OnUpdatesChecked) + { + _updateCheckPerformed = true; + var latestVersionResult = await _api.GetLatestAssetStoreToolsVersion(); + if (!latestVersionResult.Success) + { + OnUpdatesChecked?.Invoke(false, null, null); + return; + } + + Version currentVersion = null; + Version latestVersion = null; + + try + { + var latestVersionStr = latestVersionResult.Version; + var currentVersionStr = PackageUtility.GetAllPackages().FirstOrDefault(x => x.name == "com.unity.asset-store-tools").version; + + currentVersion = new Version(currentVersionStr); + latestVersion = new Version(latestVersionStr); + } + catch + { + OnUpdatesChecked?.Invoke(false, null, null); + } + + OnUpdatesChecked?.Invoke(true, currentVersion, latestVersion); + } + + protected override void Init() + { + rootVisualElement.styleSheets.Add(StyleSelector.UpdaterWindow.UpdaterWindowStyle); + rootVisualElement.styleSheets.Add(StyleSelector.UpdaterWindow.UpdaterWindowTheme); + + SetupLoadingSpinner(); + _ = CheckForUpdates(OnVersionsRetrieved); + } + + private void OnVersionsRetrieved(bool success, Version currentVersion, Version latestVersion) + { + if (_loadingContainer != null) + _loadingContainer.style.display = DisplayStyle.None; + + if (success) + { + SetupVersionInfo(currentVersion, latestVersion); + } + else + { + SetupFailInfo(); + } + } + + private void SetupLoadingSpinner() + { + _loadingContainer = new VisualElement(); + _loadingContainer.AddToClassList("updater-loading-container"); + _loadingImage = new Image(); + EditorApplication.update += LoadingSpinLoop; + + _loadingContainer.Add(_loadingImage); + rootVisualElement.Add(_loadingContainer); + } + + private void SetupVersionInfo(Version currentVersion, Version latestVersion) + { + _versionInfoContainer = new VisualElement(); + _versionInfoContainer.AddToClassList("updater-info-container"); + + AddDescriptionLabels(currentVersion, latestVersion); + AddUpdateButtons(currentVersion, latestVersion); + AddCheckForUpdatesToggle(); + + rootVisualElement.Add(_versionInfoContainer); + } + + private void AddDescriptionLabels(Version currentVersion, Version latestVersion) + { + var descriptionText = currentVersion < latestVersion ? + "An update to the Asset Store Publishing Tools is available. Updating to the latest version is highly recommended." : + "Asset Store Publishing Tools are up to date!"; + + var labelContainer = new VisualElement(); + labelContainer.AddToClassList("updater-info-container-labels"); + var descriptionLabel = new Label(descriptionText); + descriptionLabel.AddToClassList("updater-info-container-labels-description"); + + var currentVersionRow = new VisualElement(); + currentVersionRow.AddToClassList("updater-info-container-labels-row"); + var latestVersionRow = new VisualElement(); + latestVersionRow.AddToClassList("updater-info-container-labels-row"); + + var currentVersionLabel = new Label("Current version:"); + currentVersionLabel.AddToClassList("updater-info-container-labels-row-identifier"); + var latestVersionLabel = new Label("Latest version:"); + latestVersionLabel.AddToClassList("updater-info-container-labels-row-identifier"); + + var currentVersionLabelValue = new Label(currentVersion.ToString()); + var latestVersionLabelValue = new Label(latestVersion.ToString()); + + currentVersionRow.Add(currentVersionLabel); + currentVersionRow.Add(currentVersionLabelValue); + latestVersionRow.Add(latestVersionLabel); + latestVersionRow.Add(latestVersionLabelValue); + + labelContainer.Add(descriptionLabel); + labelContainer.Add(currentVersionRow); + labelContainer.Add(latestVersionRow); + + _versionInfoContainer.Add(labelContainer); + } + + private void AddUpdateButtons(Version currentVersion, Version latestVersion) + { + if (currentVersion >= latestVersion) + return; + + var buttonContainer = new VisualElement(); + buttonContainer.AddToClassList("updater-info-container-buttons"); + var latestVersionButton = new Button(() => Application.OpenURL(Constants.Updater.AssetStoreToolsUrl)) { text = "Get the latest version" }; + var skipVersionButton = new Button(Close) { text = "Skip for now" }; + + buttonContainer.Add(latestVersionButton); + buttonContainer.Add(skipVersionButton); + + _versionInfoContainer.Add(buttonContainer); + } + + private void AddCheckForUpdatesToggle() + { + var toggleContainer = new VisualElement(); + toggleContainer.AddToClassList("updater-info-container-toggle"); + var checkForUpdatesToggle = new Toggle() { text = "Check for Updates", value = ASToolsPreferences.Instance.CheckForUpdates }; + checkForUpdatesToggle.RegisterValueChangedCallback(OnCheckForUpdatesToggleChanged); + + toggleContainer.Add(checkForUpdatesToggle); + _versionInfoContainer.Add(toggleContainer); + } + + private void OnCheckForUpdatesToggleChanged(ChangeEvent evt) + { + ASToolsPreferences.Instance.CheckForUpdates = evt.newValue; + ASToolsPreferences.Instance.Save(); + } + + private void SetupFailInfo() + { + var failContainer = new VisualElement(); + failContainer.AddToClassList("updater-fail-container"); + + var failImage = new Image(); + var failDescription = new Label("Asset Store Publishing Tools could not retrieve information about the latest version."); + + failContainer.Add(failImage); + failContainer.Add(failDescription); + + rootVisualElement.Add(failContainer); + } + + private void LoadingSpinLoop() + { + var currentTimeSinceStartup = EditorApplication.timeSinceStartup; + var deltaTime = EditorApplication.timeSinceStartup - _lastTimeSinceStartup; + _lastTimeSinceStartup = currentTimeSinceStartup; + + _timeSinceLoadingImageChange += deltaTime; + if (_timeSinceLoadingImageChange < 0.075) + return; + + _timeSinceLoadingImageChange = 0; + + _loadingImage.image = EditorGUIUtility.IconContent($"WaitSpin{_loadingImageIndex++:00}").image; + if (_loadingImageIndex > 11) + _loadingImageIndex = 0; + } + + private void OnDestroy() + { + EditorApplication.update -= LoadingSpinLoop; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs.meta new file mode 100644 index 00000000..38afc154 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2ac370b9d2279ed4c9faec7134ba2759 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/ASToolsUpdater.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs new file mode 100644 index 00000000..a596352d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs @@ -0,0 +1,266 @@ +using System.IO; +using CacheConstants = AssetStoreTools.Constants.Cache; + +namespace AssetStoreTools.Utility +{ + internal static class CacheUtil + { + public static bool GetFileFromTempCache(string fileName, out string filePath) + { + return GetCacheFile(CacheConstants.TempCachePath, fileName, out filePath); + } + + public static bool GetFileFromPersistentCache(string fileName, out string filePath) + { + return GetCacheFile(CacheConstants.PersistentCachePath, fileName, out filePath); + } + + public static bool GetFileFromProjectPersistentCache(string projectPath, string fileName, out string filePath) + { + return GetCacheFile(Path.Combine(projectPath, CacheConstants.PersistentCachePath), fileName, out filePath); + } + + private static bool GetCacheFile(string rootPath, string fileName, out string filePath) + { + filePath = Path.Combine(rootPath, fileName); + return File.Exists(filePath); + } + + public static void CreateFileInTempCache(string fileName, object content, bool overwrite) + { + CreateCacheFile(CacheConstants.TempCachePath, fileName, content, overwrite); + } + + public static void CreateFileInPersistentCache(string fileName, object content, bool overwrite) + { + CreateCacheFile(CacheConstants.PersistentCachePath, fileName, content, overwrite); + } + + private static void CreateCacheFile(string rootPath, string fileName, object content, bool overwrite) + { + if (!Directory.Exists(rootPath)) + Directory.CreateDirectory(rootPath); + + var fullPath = Path.Combine(rootPath, fileName); + + bool willUpdate = false; + if (File.Exists(fullPath)) + { + if (overwrite) + { + File.Delete(fullPath); + willUpdate = true; + } + else + return; + } + + switch (content) + { + case byte[] bytes: + File.WriteAllBytes(fullPath, bytes); + break; + default: + File.WriteAllText(fullPath, content.ToString()); + break; + } + + var keyword = willUpdate ? "Updating" : "Creating"; + ASDebug.Log($"{keyword} cache file: '{fullPath}'"); + } + + public static void DeleteFileFromTempCache(string fileName) + { + DeleteFileFromCache(CacheConstants.TempCachePath, fileName); + } + + public static void DeleteFileFromPersistentCache(string fileName) + { + DeleteFileFromCache(CacheConstants.PersistentCachePath, fileName); + } + + private static void DeleteFileFromCache(string rootPath, string fileName) + { + var path = Path.Combine(rootPath, fileName); + if (File.Exists(path)) + File.Delete(path); + } + + //private static void CreateFileInPersistentCache(string fileName, object content, bool overwrite) + //{ + // CreateCacheFile(CacheConstants.PersistentCachePath, fileName, content, overwrite); + //} + + //private static void CreateCacheFile(string rootPath, string fileName, object content, bool overwrite) + //{ + // if (!Directory.Exists(rootPath)) + // Directory.CreateDirectory(rootPath); + + // var fullPath = Path.Combine(rootPath, fileName); + + // if (File.Exists(fullPath)) + // { + // if (overwrite) + // File.Delete(fullPath); + // else + // return; + // } + + // switch (content) + // { + // case byte[] bytes: + // File.WriteAllBytes(fullPath, bytes); + // break; + // default: + // File.WriteAllText(fullPath, content.ToString()); + // break; + // } + // ASDebug.Log($"Creating cached file: '{fullPath}'"); + //} + + //public static void ClearTempCache() + //{ + // if (!File.Exists(Path.Combine(CacheConstants.TempCachePath, CacheConstants.PackageDataFile))) + // return; + + + // // Cache consists of package data and package texture thumbnails. We don't clear + // // texture thumbnails here since they are less likely to change. They are still + // // deleted and redownloaded every project restart (because of being stored in the 'Temp' folder) + // var fullPath = Path.Combine(CacheConstants.TempCachePath, CacheConstants.PackageDataFile); + // ASDebug.Log($"Deleting cached file '{fullPath}'"); + // File.Delete(fullPath); + //} + + //public static void CachePackageMetadata(List data) + //{ + // var serializerSettings = new JsonSerializerSettings() + // { + // ContractResolver = Package.CachedPackageResolver.Instance, + // Formatting = Formatting.Indented + // }; + + // CreateFileInTempCache(CacheConstants.PackageDataFile, JsonConvert.SerializeObject(data, serializerSettings), true); + //} + + //public static void UpdatePackageMetadata(Package data) + //{ + // if (!GetCachedPackageMetadata(out var cachedData)) + // return; + + // var index = cachedData.FindIndex(x => x.PackageId.Equals(data.PackageId)); + // if (index == -1) + // { + // cachedData.Add(data); + // } + // else + // { + // cachedData.RemoveAt(index); + // cachedData.Insert(index, data); + // } + + // CachePackageMetadata(cachedData); + //} + + //public static bool GetCachedPackageMetadata(out List data) + //{ + // data = new List(); + // var path = Path.Combine(CacheConstants.TempCachePath, CacheConstants.PackageDataFile); + // if (!File.Exists(path)) + // return false; + + // try + // { + // var serializerSettings = new JsonSerializerSettings() + // { + // ContractResolver = Package.CachedPackageResolver.Instance + // }; + + // data = JsonConvert.DeserializeObject>(File.ReadAllText(path, Encoding.UTF8), serializerSettings); + // return true; + // } + // catch + // { + // return false; + // } + //} + + //public static void CacheTexture(string packageId, Texture2D texture) + //{ + // CreateFileInTempCache($"{packageId}.png", texture.EncodeToPNG(), true); + //} + + //public static bool GetCachedTexture(string packageId, out Texture2D texture) + //{ + // texture = new Texture2D(1, 1); + // var path = Path.Combine(CacheConstants.TempCachePath, $"{packageId}.png"); + // if (!File.Exists(path)) + // return false; + + // texture.LoadImage(File.ReadAllBytes(path)); + // return true; + //} + + //public static void CacheWorkflowStateData(string packageId, WorkflowStateData data) + //{ + // var fileName = $"{packageId}-workflowStateData.asset"; + // CreateFileInPersistentCache(fileName, JsonConvert.SerializeObject(data, Formatting.Indented), true); + //} + + //public static bool GetCachedWorkflowStateData(string packageId, out WorkflowStateData data) + //{ + // data = null; + // var path = Path.Combine(CacheConstants.PersistentCachePath, $"{packageId}-workflowStateData.asset"); + // if (!File.Exists(path)) + // return false; + + // data = JsonConvert.DeserializeObject(File.ReadAllText(path, Encoding.UTF8)); + // return true; + //} + + //public static void CacheValidationStateData(ValidationStateData data) + //{ + // var serializerSettings = new JsonSerializerSettings() + // { + // ContractResolver = ValidationStateDataContractResolver.Instance, + // Formatting = Formatting.Indented, + // TypeNameHandling = TypeNameHandling.Auto, + // Converters = new List() { new StringEnumConverter() } + // }; + + // CreateFileInPersistentCache(CacheConstants.ValidationResultFile, JsonConvert.SerializeObject(data, serializerSettings), true); + //} + + //public static bool GetCachedValidationStateData(out ValidationStateData data) + //{ + // return GetCachedValidationStateData(Constants.RootProjectPath, out data); + //} + + //public static bool GetCachedValidationStateData(string projectPath, out ValidationStateData data) + //{ + // data = null; + // var path = Path.Combine(projectPath, CacheConstants.PersistentCachePath, CacheConstants.ValidationResultFile); + // if (!File.Exists(path)) + // return false; + + // try + // { + // var serializerSettings = new JsonSerializerSettings() + // { + // ContractResolver = ValidationStateDataContractResolver.Instance, + // Formatting = Formatting.Indented, + // TypeNameHandling = TypeNameHandling.Auto, + // Converters = new List() { new StringEnumConverter() } + // }; + + // data = JsonConvert.DeserializeObject(File.ReadAllText(path, Encoding.UTF8), serializerSettings); + // return true; + // } + // catch (System.Exception e) + // { + // UnityEngine.Debug.LogException(e); + // return false; + // } + //} + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs.meta new file mode 100644 index 00000000..ab8d31b3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2e5fee0cad7655f458d9b600f4ae6d02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/CacheUtil.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs new file mode 100644 index 00000000..5e545f81 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs @@ -0,0 +1,207 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; + +namespace AssetStoreTools.Utility +{ + internal static class FileUtility + { + private class RenameInfo + { + public string OriginalName; + public string CurrentName; + } + + public static string AbsolutePathToRelativePath(string path, bool allowSymlinks) + { + if (!File.Exists(path) && !Directory.Exists(path)) + return path; + + string convertedPath = path.Replace("\\", "/"); + + var allPackages = PackageUtility.GetAllPackages(); + foreach (var package in allPackages) + { + if (Path.GetFullPath(package.resolvedPath) != Path.GetFullPath(convertedPath) + && !Path.GetFullPath(convertedPath).StartsWith(Path.GetFullPath(package.resolvedPath) + Path.DirectorySeparatorChar)) + continue; + + convertedPath = Path.GetFullPath(convertedPath) + .Replace(Path.GetFullPath(package.resolvedPath), package.assetPath) + .Replace("\\", "/"); + + return convertedPath; + } + + if (convertedPath.StartsWith(Constants.RootProjectPath)) + { + convertedPath = convertedPath.Substring(Constants.RootProjectPath.Length); + } + else + { + if (allowSymlinks && SymlinkUtil.FindSymlinkFolderRelative(convertedPath, out var symlinkPath)) + convertedPath = symlinkPath; + } + + return convertedPath; + } + + public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive) + { + // Get information about the source directory + var dir = new DirectoryInfo(sourceDir); + + // Check if the source directory exists + if (!dir.Exists) + throw new DirectoryNotFoundException($"Source directory not found: {dir.FullName}"); + + // Cache directories before we start copying + DirectoryInfo[] dirs = dir.GetDirectories(); + + // Create the destination directory + Directory.CreateDirectory(destinationDir); + + // Get the files in the source directory and copy to the destination directory + foreach (FileInfo file in dir.GetFiles()) + { + string targetFilePath = Path.Combine(destinationDir, file.Name); + file.CopyTo(targetFilePath); + } + + // If recursive and copying subdirectories, recursively call this method + if (recursive) + { + foreach (DirectoryInfo subDir in dirs) + { + string newDestinationDir = Path.Combine(destinationDir, subDir.Name); + CopyDirectory(subDir.FullName, newDestinationDir, true); + } + } + } + + public static bool ShouldHaveMeta(string assetPath) + { + if (string.IsNullOrEmpty(assetPath)) + return false; + + // Meta files never have other metas + if (assetPath.EndsWith(".meta", System.StringComparison.OrdinalIgnoreCase)) + return false; + + // File System entries ending with '~' are hidden in the context of ADB + if (assetPath.EndsWith("~")) + return false; + + // File System entries whose names start with '.' are hidden in the context of ADB + var assetName = assetPath.Replace("\\", "/").Split('/').Last(); + if (assetName.StartsWith(".")) + return false; + + return true; + } + + public static bool IsMissingMetaFiles(IEnumerable sourcePaths) + { + foreach (var sourcePath in sourcePaths) + { + if (!Directory.Exists(sourcePath)) + continue; + + var allDirectories = Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories); + foreach (var dir in allDirectories) + { + var dirInfo = new DirectoryInfo(dir); + if (!dirInfo.Name.EndsWith("~")) + continue; + + var nestedContent = dirInfo.GetFileSystemInfos("*", SearchOption.AllDirectories); + foreach (var nested in nestedContent) + { + if (!ShouldHaveMeta(nested.FullName)) + continue; + + if (!File.Exists(nested.FullName + ".meta")) + return true; + } + } + } + + return false; + } + + public static void GenerateMetaFiles(IEnumerable sourcePaths) + { + var renameInfos = new List(); + + foreach (var sourcePath in sourcePaths) + { + if (!Directory.Exists(sourcePath)) + continue; + + var hiddenDirectoriesInPath = Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories).Where(x => x.EndsWith("~")); + foreach (var hiddenDir in hiddenDirectoriesInPath) + { + var hiddenDirRelative = AbsolutePathToRelativePath(hiddenDir, ASToolsPreferences.Instance.EnableSymlinkSupport); + if (!hiddenDirRelative.StartsWith("Assets/") && !hiddenDirRelative.StartsWith("Packages/")) + { + ASDebug.LogWarning($"Path {sourcePath} is not part of the Asset Database and will be skipped"); + continue; + } + + renameInfos.Add(new RenameInfo() { CurrentName = hiddenDirRelative, OriginalName = hiddenDirRelative }); + } + } + + if (renameInfos.Count == 0) + return; + + try + { + EditorApplication.LockReloadAssemblies(); + + // Order paths from longest to shortest to avoid having to rename them multiple times + renameInfos = renameInfos.OrderByDescending(x => x.OriginalName.Length).ToList(); + + try + { + AssetDatabase.StartAssetEditing(); + foreach (var renameInfo in renameInfos) + { + renameInfo.CurrentName = renameInfo.OriginalName.TrimEnd('~'); + Directory.Move(renameInfo.OriginalName, renameInfo.CurrentName); + } + } + finally + { + AssetDatabase.StopAssetEditing(); + AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); + AssetDatabase.ReleaseCachedFileHandles(); + } + + // Restore the original path names in reverse order + renameInfos = renameInfos.OrderBy(x => x.OriginalName.Length).ToList(); + + try + { + AssetDatabase.StartAssetEditing(); + foreach (var renameInfo in renameInfos) + { + Directory.Move(renameInfo.CurrentName, renameInfo.OriginalName); + if (File.Exists($"{renameInfo.CurrentName}.meta")) + File.Delete($"{renameInfo.CurrentName}.meta"); + } + } + finally + { + AssetDatabase.StopAssetEditing(); + AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport); + } + } + finally + { + EditorApplication.UnlockReloadAssemblies(); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs.meta new file mode 100644 index 00000000..fe6eb7ce --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 80819cf6868374d478a8a38ebaba8e27 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/FileUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs new file mode 100644 index 00000000..c9df7c21 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs @@ -0,0 +1,86 @@ +using System; +using System.IO; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Utility +{ + [InitializeOnLoad] + internal class LegacyToolsRemover + { + private const string MessagePart1 = "A legacy version of Asset Store Tools " + + "was detected at the following path:\n"; + private const string MessagePart2 = "\n\nHaving both the legacy and the latest version installed at the same time is not supported " + + "and might prevent the latest version from functioning properly.\n\nWould you like the legacy version to be removed automatically?"; + + static LegacyToolsRemover() + { + try + { + if (Application.isBatchMode) + return; + + CheckAndRemoveLegacyTools(); + } + catch { } + } + + private static void CheckAndRemoveLegacyTools() + { + if (!ASToolsPreferences.Instance.LegacyVersionCheck || !ProjectContainsLegacyTools(out string path)) + return; + + var relativePath = path.Substring(Application.dataPath.Length - "Assets".Length).Replace("\\", "/"); + var result = EditorUtility.DisplayDialog("Asset Store Tools", MessagePart1 + relativePath + MessagePart2, "Yes", "No"); + + // If "No" - do nothing + if (!result) + return; + + // If "Yes" - remove legacy tools + File.Delete(path); + File.Delete(path + ".meta"); + RemoveEmptyFolders(Path.GetDirectoryName(path)?.Replace("\\", "/")); + AssetDatabase.Refresh(); + + // We could also optionally prevent future execution here + // but the ProjectContainsLegacyTools() function runs in less + // than a milisecond on an empty project + } + + private static bool ProjectContainsLegacyTools(out string path) + { + path = null; + + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + if (assembly.ManifestModule.Name == "AssetStoreTools.dll") + { + path = assembly.Location; + break; + } + } + + if (string.IsNullOrEmpty(path)) + return false; + return true; + } + + private static void RemoveEmptyFolders(string directory) + { + if (directory.EndsWith(Application.dataPath)) + return; + + if (Directory.GetFiles(directory).Length == 0 && Directory.GetDirectories(directory).Length == 0) + { + var parentPath = Path.GetDirectoryName(directory).Replace("\\", "/"); + + Directory.Delete(directory); + File.Delete(directory + ".meta"); + + RemoveEmptyFolders(parentPath); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs.meta new file mode 100644 index 00000000..aa03ddfb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 46ead42026b1f0b4e94153e1a7e10d12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/LegacyToolsRemover.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs new file mode 100644 index 00000000..a384f7ae --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs @@ -0,0 +1,170 @@ +#if !UNITY_2021_1_OR_NEWER +using System; +using System.Reflection; +#endif +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.PackageManager; +using UnityEngine; +using PackageInfo = UnityEditor.PackageManager.PackageInfo; + +namespace AssetStoreTools.Utility +{ + internal static class PackageUtility + { + public class PackageInfoSampleMetadata + { + public string DisplayName; + public string Description; + public string Path; + } + + public class PackageInfoUnityVersionMetadata + { + /// + /// Major bit of the Unity version, e.g. 2021.3 + /// + public string Version; + /// + /// Minor bit of the Unity version, e.g. 0f1 + /// + public string Release; + + public override string ToString() + { + if (string.IsNullOrEmpty(Version)) + return Release; + + if (string.IsNullOrEmpty(Release)) + return Release; + + return $"{Version}.{Release}"; + } + } + + /// + /// Returns a package identifier, consisting of package name and package version + /// + /// + /// + public static string GetPackageIdentifier(this PackageInfo package) + { + return $"{package.name}-{package.version}"; + } + + public static PackageInfo[] GetAllPackages() + { +#if !UNITY_2021_1_OR_NEWER + var method = typeof(PackageInfo).GetMethod("GetAll", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, null, new Type[0], null); + var packages = method?.Invoke(null, null) as PackageInfo[]; +#else + var packages = PackageInfo.GetAllRegisteredPackages(); +#endif + return packages; + } + + public static PackageInfo[] GetAllLocalPackages() + { + var packages = GetAllPackages(); + var localPackages = packages.Where(x => x.source == PackageSource.Embedded || x.source == PackageSource.Local) + .Where(x => x.isDirectDependency).ToArray(); + return localPackages; + } + + public static PackageInfo[] GetAllRegistryPackages() + { + var packages = GetAllPackages(); + var registryPackages = packages.Where(x => x.source == PackageSource.Registry || x.source == PackageSource.BuiltIn) + .OrderBy(x => string.Compare(x.type, "module", System.StringComparison.OrdinalIgnoreCase) == 0) + .ThenBy(x => x.name).ToArray(); + + return registryPackages; + } + + public static bool GetPackageByManifestPath(string packageManifestPath, out PackageInfo package) + { + package = null; + + if (string.IsNullOrEmpty(packageManifestPath)) + return false; + + var fileInfo = new FileInfo(packageManifestPath); + if (!fileInfo.Exists) + return false; + + var allPackages = GetAllPackages(); + + package = allPackages.FirstOrDefault(x => Path.GetFullPath(x.resolvedPath).Equals(fileInfo.Directory.FullName)); + return package != null; + } + + public static bool GetPackageByPackageName(string packageName, out PackageInfo package) + { + package = null; + + if (string.IsNullOrEmpty(packageName)) + return false; + + return GetPackageByManifestPath($"Packages/{packageName}/package.json", out package); + } + + public static TextAsset GetManifestAsset(this PackageInfo packageInfo) + { + return AssetDatabase.LoadAssetAtPath($"{packageInfo.assetPath}/package.json"); + } + + public static List GetSamples(this PackageInfo packageInfo) + { + var samples = new List(); + + var packageManifest = packageInfo.GetManifestAsset(); + var json = JObject.Parse(packageManifest.text); + + if (!json.ContainsKey("samples") || json["samples"].Type != JTokenType.Array) + return samples; + + var sampleList = json["samples"].ToList(); + foreach (JObject sample in sampleList) + { + var displayName = string.Empty; + var description = string.Empty; + var path = string.Empty; + + if (sample.ContainsKey("displayName")) + displayName = sample["displayName"].ToString(); + if (sample.ContainsKey("description")) + description = sample["description"].ToString(); + if (sample.ContainsKey("path")) + path = sample["path"].ToString(); + + if (!string.IsNullOrEmpty(displayName) || !string.IsNullOrEmpty(description) || !string.IsNullOrEmpty(path)) + samples.Add(new PackageInfoSampleMetadata() { DisplayName = displayName, Description = description, Path = path }); + } + + return samples; + } + + public static PackageInfoUnityVersionMetadata GetUnityVersion(this PackageInfo packageInfo) + { + var packageManifest = packageInfo.GetManifestAsset(); + var json = JObject.Parse(packageManifest.text); + + var unityVersion = string.Empty; + var unityRelease = string.Empty; + + if (json.ContainsKey("unity")) + unityVersion = json["unity"].ToString(); + if (json.ContainsKey("unityRelease")) + unityRelease = json["unityRelease"].ToString(); + + return new PackageInfoUnityVersionMetadata() + { + Version = unityVersion, + Release = unityRelease + }; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs.meta new file mode 100644 index 00000000..af0b5112 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 605ea62f8b11d674a95a53f895df4c67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/PackageUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs new file mode 100644 index 00000000..97510817 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AssetStoreTools.Utility +{ + internal abstract class ServiceProvider + { + private Dictionary _services = new Dictionary(); + private Dictionary> _queuedServices = new Dictionary>(); + + protected class MissingServiceDependencyException : Exception + { + public Type ServiceType { get; private set; } + public Type MissingDependencyType { get; private set; } + + public MissingServiceDependencyException(Type serviceType, Type missingDependencyType) + { + ServiceType = serviceType; + MissingDependencyType = missingDependencyType; + } + } + + protected ServiceProvider() + { + RegisterServices(); + CreateRegisteredServices(); + } + + protected abstract void RegisterServices(); + + protected void Register() where TService : Service where TInstance : TService + { + Register(() => CreateServiceInstance(typeof(TInstance))); + } + + protected void Register(Func initializer) where TService : Service + { + _queuedServices.Add(typeof(TService), initializer); + } + + private void CreateRegisteredServices() + { + if (_queuedServices.Count == 0) + return; + + var createdAnyService = false; + var missingServices = new List(); + + foreach (var service in _queuedServices) + { + try + { + var instance = service.Value.Invoke(); + _services.Add(service.Key, instance); + createdAnyService = true; + } + catch (MissingServiceDependencyException e) + { + missingServices.Add(e); + } + } + + foreach (var createdService in _services) + { + _queuedServices.Remove(createdService.Key); + } + + if (!createdAnyService) + { + var message = string.Join(", ", missingServices.Select(x => $"{x.ServiceType} depends on {x.MissingDependencyType}")); + throw new Exception("Could not create the following services due to missing dependencies: " + message); + } + + // Recursively register remaining queued services that may have failed + // due to missing depenedencies that are now registered + CreateRegisteredServices(); + } + + private Service CreateServiceInstance(Type concreteType) + { + if (concreteType.IsAbstract) + throw new Exception($"Cannot create an instance of an abstract class {concreteType}"); + + var constructor = concreteType.GetConstructors().First(); + var expectedParameters = constructor.GetParameters(); + var parametersToUse = new List(); + + foreach (var parameter in expectedParameters) + { + if (!_services.ContainsKey(parameter.ParameterType)) + throw new MissingServiceDependencyException(concreteType, parameter.ParameterType); + + parametersToUse.Add(_services[parameter.ParameterType]); + } + + return (Service)constructor.Invoke(parametersToUse.ToArray()); + } + + public T GetService() where T : Service + { + return (T)GetService(typeof(T)); + } + + public object GetService(Type type) + { + if (!_services.ContainsKey(type)) + throw new Exception($"Service of type {type} is not registered"); + + return _services[type]; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs.meta new file mode 100644 index 00000000..a35f4c80 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2fcadafa6431d1647a82d35e6e4a13c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/ServiceProvider.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs new file mode 100644 index 00000000..1076bca3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs @@ -0,0 +1,55 @@ +using System; +using UnityEditor; +using UnityEngine.UIElements; +using WindowStyles = AssetStoreTools.Constants.WindowStyles; + +namespace AssetStoreTools.Utility +{ + internal static class StyleSelector + { + private static StyleSheet GetStylesheet(string rootPath, string filePath) + { + var path = $"{rootPath}/{filePath}.uss"; + var sheet = AssetDatabase.LoadAssetAtPath(path); + if (sheet == null) + throw new Exception($"Stylesheet '{path}' was not found"); + return sheet; + } + + private static StyleSheet GetStylesheetTheme(string rootPath, string filePath) + { + var suffix = !EditorGUIUtility.isProSkin ? "Light" : "Dark"; + return GetStylesheet(rootPath, filePath + suffix); + } + + public static class UploaderWindow + { + public static StyleSheet UploaderWindowStyle => GetStylesheet(WindowStyles.UploaderStylesPath, "Style"); + public static StyleSheet UploaderWindowTheme => GetStylesheetTheme(WindowStyles.UploaderStylesPath, "Theme"); + + public static StyleSheet LoginViewStyle => GetStylesheet(WindowStyles.UploaderStylesPath, "LoginView/Style"); + public static StyleSheet LoginViewTheme => GetStylesheetTheme(WindowStyles.UploaderStylesPath, "LoginView/Theme"); + + public static StyleSheet PackageListViewStyle => GetStylesheet(WindowStyles.UploaderStylesPath, "PackageListView/Style"); + public static StyleSheet PackageListViewTheme => GetStylesheetTheme(WindowStyles.UploaderStylesPath, "PackageListView/Theme"); + } + + public static class ValidatorWindow + { + public static StyleSheet ValidatorWindowStyle => GetStylesheet(WindowStyles.ValidatorStylesPath, "Style"); + public static StyleSheet ValidatorWindowTheme => GetStylesheetTheme(WindowStyles.ValidatorStylesPath, "Theme"); + } + + public static class PreviewGeneratorWindow + { + public static StyleSheet PreviewGeneratorWindowStyle => GetStylesheet(WindowStyles.PreviewGeneratorStylesPath, "Style"); + public static StyleSheet PreviewGeneratorWindowTheme => GetStylesheetTheme(WindowStyles.PreviewGeneratorStylesPath, "Theme"); + } + + public static class UpdaterWindow + { + public static StyleSheet UpdaterWindowStyle => GetStylesheet(WindowStyles.UpdaterStylesPath, "Style"); + public static StyleSheet UpdaterWindowTheme => GetStylesheetTheme(WindowStyles.UpdaterStylesPath, "Theme"); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs.meta new file mode 100644 index 00000000..b7a9bb24 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8b066ce502a289a4ca311a86fbf83f45 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/StyleSelector.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles.meta new file mode 100644 index 00000000..0175b81a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f730eb0b8c48c434d93cc60a0b8aff40 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater.meta new file mode 100644 index 00000000..315b99b2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5367435d9abe935438f4d7b588a55488 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss new file mode 100644 index 00000000..1ee89cd5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss @@ -0,0 +1,76 @@ +.updater-loading-container { + flex-grow: 1; + align-items: center; + justify-content: center; +} + +.updater-loading-container > Image { + width: 16px; + height: 16px; +} + +.updater-info-container { + flex-grow: 1; + margin: 0 5px 5px 5px; +} + +.updater-info-container-labels { + flex-grow: 1; + margin-bottom: 10px; + margin-top: 5px; +} + +.updater-info-container-labels-description { + flex-grow: 0.5; + margin-bottom: 5px; + white-space: normal; + -unity-text-align: middle-left; +} + +.updater-info-container-labels-row { + flex-direction: row; +} + +.updater-info-container-labels-row-identifier { + -unity-font-style: bold; +} + +.updater-info-container-buttons { + flex-direction: row; + margin-bottom: 5px; +} + +.updater-info-container-buttons > Button { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 100%; + height: 25px; +} + +.updater-info-container-toggle { + align-self: flex-end; +} + +.updater-info-container-toggle > Toggle > VisualElement > Label { + margin-left: 5px; +} + +.updater-fail-container { + flex-grow: 1; + flex-direction: row; + margin: 0 5px 5px 5px; + justify-content: center; + align-items: center; +} + +.updater-fail-container > Image { + flex-shrink: 0; + width: 36px; + height: 36px; + margin-right: 5px; +} + +.updater-fail-container > Label { + flex-shrink: 1; + white-space: normal; +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss.meta new file mode 100644 index 00000000..a2dbb90f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 23112eed1f211274c94028490f81007c +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/Style.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss new file mode 100644 index 00000000..3510f8ac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss @@ -0,0 +1,3 @@ +.updater-fail-container > Image { + --unity-image: resource("console.erroricon@2x"); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss.meta new file mode 100644 index 00000000..82e770e1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0cbf43b8dabcd1242b32ed3ed2167a54 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeDark.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss new file mode 100644 index 00000000..3510f8ac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss @@ -0,0 +1,3 @@ +.updater-fail-container > Image { + --unity-image: resource("console.erroricon@2x"); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss.meta new file mode 100644 index 00000000..cdd5b1af --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d453bb92cd1f35943b1c5f652837ada9 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/Styles/Updater/ThemeLight.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs b/Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs new file mode 100644 index 00000000..93da1ee2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs @@ -0,0 +1,67 @@ +using System.IO; + +namespace AssetStoreTools.Utility +{ + internal static class SymlinkUtil + { + private const FileAttributes FolderSymlinkAttributes = FileAttributes.Directory | FileAttributes.ReparsePoint; + + public static bool FindSymlinkFolderRelative(string folderPathAbsolute, out string relativePath) + { + // Get directory info for path outside of the project + var absoluteInfo = new DirectoryInfo(folderPathAbsolute); + + // Get all directories within the project + var allFolderPaths = Directory.GetDirectories("Assets", "*", SearchOption.AllDirectories); + foreach (var path in allFolderPaths) + { + var fullPath = path.Replace("\\", "/"); + + // Get directory info for one of the paths within the project + var relativeInfo = new DirectoryInfo(fullPath); + + // Check if project's directory is a symlink + if (!relativeInfo.Attributes.HasFlag(FolderSymlinkAttributes)) + continue; + + // Compare metadata of outside directory with a directories within the project + if (!CompareDirectories(absoluteInfo, relativeInfo)) + continue; + + // Found symlink within the project, assign it + relativePath = fullPath; + return true; + } + + relativePath = string.Empty; + return false; + } + + private static bool CompareDirectories(DirectoryInfo directory, DirectoryInfo directory2) + { + var contents = directory.EnumerateFileSystemInfos("*", SearchOption.AllDirectories).GetEnumerator(); + var contents2 = directory2.EnumerateFileSystemInfos("*", SearchOption.AllDirectories).GetEnumerator(); + + while (true) + { + var firstNext = contents.MoveNext(); + var secondNext = contents2.MoveNext(); + + if (firstNext != secondNext) + return false; + + if (!firstNext && !secondNext) + break; + + var equals = contents.Current?.Name == contents2.Current?.Name + && contents.Current?.LastWriteTime == contents2.Current?.LastWriteTime; + + if (!equals) + return false; + } + + return true; + } + + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs.meta new file mode 100644 index 00000000..827d9ceb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 92092535fd064bb1843017f98db213e1 +timeCreated: 1659013521 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Utility/SymlinkUtil.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator.meta b/Packages/com.unity.asset-store-tools/Editor/Validator.meta new file mode 100644 index 00000000..e27c1efd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 980c7bb65c02d464684c2220c57fcd75 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons.meta new file mode 100644 index 00000000..7f4c321d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8490c57c02b441e4dab99565da835c99 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png new file mode 100644 index 00000000..8d294bc1 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png.meta new file mode 100644 index 00000000..38311469 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 0cc0ccdb7de3e964ab553ce3c299d83c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png new file mode 100644 index 00000000..451f6403 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png.meta new file mode 100644 index 00000000..07c06d2d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: cdf8d51df19d58341886cc474e810c7b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/error_d.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png new file mode 100644 index 00000000..a5f78532 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png.meta new file mode 100644 index 00000000..e883152d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 832e106a677623145b3d8dbe015e31a0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png new file mode 100644 index 00000000..094a810f Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png.meta new file mode 100644 index 00000000..f2240b95 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 3dc139a2b2a28a54a8f39e266fc0af9c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/success_d.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png new file mode 100644 index 00000000..a587baa4 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png.meta new file mode 100644 index 00000000..4911cd62 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 4a4eef842709db34cbb71baf22384730 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png new file mode 100644 index 00000000..b7e2681e Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png.meta new file mode 100644 index 00000000..f87e1273 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 88a36c7e4d60b6b4385c95cfc2d00c22 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/undefined_d.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png new file mode 100644 index 00000000..aab9fee1 Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png.meta new file mode 100644 index 00000000..efc2077e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 83d0e58aa5f608a4b8232fbacca5ca89 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png new file mode 100644 index 00000000..553bb16d Binary files /dev/null and b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png differ diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png.meta new file mode 100644 index 00000000..c7578479 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: d27d359f48fa1a14e9e4f02196589805 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + 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: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 0 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 0 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Icons/warning_d.png + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts.meta new file mode 100644 index 00000000..5a815351 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b5ff7c95381e82438f6c9dc40069031 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories.meta new file mode 100644 index 00000000..0c29f2c0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7a971a9a200a4438945853d71066f16a +timeCreated: 1657617558 \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs new file mode 100644 index 00000000..ba9acc2b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs @@ -0,0 +1,52 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; + +namespace AssetStoreTools.Validator.Categories +{ + internal class CategoryEvaluator + { + private string _category; + + public CategoryEvaluator(string category) + { + if (string.IsNullOrEmpty(category)) + _category = string.Empty; + else + _category = category; + } + + public void SetCategory(string category) + { + if (category == null) + _category = string.Empty; + else + _category = category; + } + + public string GetCategory() + { + return _category; + } + + public TestResultStatus Evaluate(ValidationTest validation, bool slugify = false) + { + var result = validation.Result.Status; + if (result != TestResultStatus.VariableSeverityIssue) + return result; + + var category = _category; + + if (slugify) + category = validation.Slugify(category); + + return validation.CategoryInfo.EvaluateByFilter(category); + } + +#if AB_BUILDER + public TestResultStatus EvaluateAndSlugify(ValidationTest validation) + { + return Evaluate(validation, true); + } +#endif + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs.meta new file mode 100644 index 00000000..252079de --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: eb61fd62b94248e4b5a3a07665b1a2bf +timeCreated: 1661420659 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/CategoryEvaluator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs new file mode 100644 index 00000000..631ef47b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using System; +using System.Linq; + +namespace AssetStoreTools.Validator.Categories +{ + [System.Serializable] + internal class ValidatorCategory + { + public bool IsFailFilter = false; + public bool IsInclusiveFilter = true; + public bool AppliesToSubCategories = true; + public string[] Filter = { "Tools", "Art" }; + + public TestResultStatus EvaluateByFilter(string category) + { + if (AppliesToSubCategories) + category = category.Split('/')[0]; + + var isCategoryInFilter = Filter.Any(x => String.Compare(x, category, StringComparison.OrdinalIgnoreCase) == 0); + + if (IsInclusiveFilter) + { + if (isCategoryInFilter) + return IsFailFilter ? TestResultStatus.Fail : TestResultStatus.Warning; + else + return IsFailFilter ? TestResultStatus.Warning : TestResultStatus.Fail; + } + else + { + if (isCategoryInFilter) + return IsFailFilter ? TestResultStatus.Warning : TestResultStatus.Fail; + else + return IsFailFilter ? TestResultStatus.Fail : TestResultStatus.Warning; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs.meta new file mode 100644 index 00000000..84e5678d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a5e60d3639f24063a4eabc21ea1a04a9 +timeCreated: 1657617578 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Categories/ValidatorCategory.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs new file mode 100644 index 00000000..79ef18c4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs @@ -0,0 +1,71 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; +using System; +using System.IO; + +namespace AssetStoreTools.Validator +{ + internal class CurrentProjectValidator : ValidatorBase + { + private CurrentProjectValidationSettings _settings; + + public CurrentProjectValidator(CurrentProjectValidationSettings settings) : base(settings) + { + _settings = settings; + } + + protected override void ValidateSettings() + { + if (_settings == null) + throw new Exception("Validation Settings is null"); + + if (_settings.ValidationPaths == null + || _settings.ValidationPaths.Count == 0) + throw new Exception("No validation paths were set"); + + switch (_settings.ValidationType) + { + case ValidationType.Generic: + case ValidationType.UnityPackage: + ValidateUnityPackageSettings(); + break; + default: + throw new NotImplementedException("Undefined validation type"); + } + } + + private void ValidateUnityPackageSettings() + { + var invalidPaths = string.Empty; + foreach (var path in _settings.ValidationPaths) + { + if (!Directory.Exists(path)) + invalidPaths += $"\n{path}"; + } + + if (!string.IsNullOrEmpty(invalidPaths)) + throw new Exception("The following directories do not exist:" + invalidPaths); + } + + protected override ValidationResult GenerateValidationResult() + { + ITestConfig config; + var applicableTests = GetApplicableTests(ValidationType.Generic); + switch (_settings.ValidationType) + { + case ValidationType.Generic: + config = new GenericTestConfig() { ValidationPaths = _settings.ValidationPaths.ToArray() }; + break; + case ValidationType.UnityPackage: + applicableTests.AddRange(GetApplicableTests(ValidationType.UnityPackage)); + config = new GenericTestConfig() { ValidationPaths = _settings.ValidationPaths.ToArray() }; + break; + default: + return new ValidationResult() { Status = ValidationStatus.Failed, Exception = new Exception("Undefined validation type") }; + } + + var validationResult = RunTests(applicableTests, config); + return validationResult; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs.meta new file mode 100644 index 00000000..16fe73b4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3a6371dcfa8545c478545b4a43433599 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/CurrentProjectValidator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data.meta new file mode 100644 index 00000000..3b400636 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c2a38ded8e054c4088aff1db7224f66 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs new file mode 100644 index 00000000..6b83057f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; + +namespace AssetStoreTools.Validator.Data +{ + internal class CurrentProjectValidationSettings : ValidationSettings + { + public List ValidationPaths; + public ValidationType ValidationType; + + public CurrentProjectValidationSettings() + { + Category = string.Empty; + ValidationPaths = new List(); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (obj == null || obj.GetType() != typeof(CurrentProjectValidationSettings)) + return false; + + var other = (CurrentProjectValidationSettings)obj; + return Category == other.Category + && ValidationType == other.ValidationType + && ValidationPaths.OrderBy(x => x).SequenceEqual(other.ValidationPaths.OrderBy(x => x)); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs.meta new file mode 100644 index 00000000..a1a99356 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9e4a4a4aa3f501847b1abb1e08505f9b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/CurrentProjectValidationSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs new file mode 100644 index 00000000..f770cd4c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs @@ -0,0 +1,7 @@ +namespace AssetStoreTools.Validator.Data +{ + internal class ExternalProjectValidationSettings : ValidationSettings + { + public string PackagePath; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs.meta new file mode 100644 index 00000000..4b1d4fcb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f79c895f4bb099b4983dd20eef72a7bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ExternalProjectValidationSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions.meta new file mode 100644 index 00000000..7f0bd9aa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d51c5c866dcd449488caa10a40dd3301 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs new file mode 100644 index 00000000..e642904a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs @@ -0,0 +1,31 @@ +using Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.Data.MessageActions +{ + internal class HighlightObjectAction : IMessageAction + { + public string Tooltip => "Click to highlight the associated object in Hierarchy/Project view"; + public Object Target => _target?.GetObject(); + + [JsonProperty] + private TestResultObject _target; + + public HighlightObjectAction() { } + + public HighlightObjectAction(Object target) + { + _target = new TestResultObject(target); + } + + public void Execute() + { + var targetObject = _target.GetObject(); + if (targetObject == null) + return; + + EditorGUIUtility.PingObject(targetObject); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs.meta new file mode 100644 index 00000000..7df75cac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: de24c0a7f8a22c142a224e6abd0ddc68 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/HighlightObjectAction.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs new file mode 100644 index 00000000..ec48b5b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; +using UnityEngine; + +namespace AssetStoreTools.Validator.Data.MessageActions +{ + internal interface IMessageAction + { + [JsonIgnore] + string Tooltip { get; } + + [JsonIgnore] + Object Target { get; } + + void Execute(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs.meta new file mode 100644 index 00000000..a1c2bfa3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f1636d7241abdf1498368f841aa818a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/IMessageAction.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs new file mode 100644 index 00000000..fb5dfa54 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs @@ -0,0 +1,38 @@ +using Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.Data.MessageActions +{ + internal class OpenAssetAction : IMessageAction + { + public string Tooltip => "Click to open the associated asset"; + public Object Target => _target?.GetObject(); + + [JsonProperty] + private TestResultObject _target; + [JsonProperty] + private int _lineNumber; + + public OpenAssetAction() { } + + public OpenAssetAction(Object target) + { + _target = new TestResultObject(target); + } + + public OpenAssetAction(Object target, int lineNumber) : this(target) + { + _lineNumber = lineNumber; + } + + public void Execute() + { + var targetObject = _target.GetObject(); + if (targetObject == null) + return; + + AssetDatabase.OpenAsset(targetObject, _lineNumber); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs.meta new file mode 100644 index 00000000..257d7589 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9fb4fec293bf73f4a8f870c535750613 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/MessageActions/OpenAssetAction.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs new file mode 100644 index 00000000..21d1dd04 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs @@ -0,0 +1,52 @@ +using AssetStoreTools.Validator.Data.MessageActions; +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.Data +{ + internal struct TestResult + { + public TestResultStatus Status; + + [JsonProperty] + private List _messages; + + [JsonIgnore] + public int MessageCount => _messages != null ? _messages.Count : 0; + + public TestResultMessage GetMessage(int index) + { + return _messages[index]; + } + + public void AddMessage(string msg) + { + AddMessage(msg, null, null); + } + + public void AddMessage(string msg, IMessageAction clickAction) + { + AddMessage(msg, clickAction, null); + } + + public void AddMessage(string msg, IMessageAction clickAction, params UnityEngine.Object[] messageObjects) + { + if (_messages == null) + _messages = new List(); + + var message = new TestResultMessage(msg, clickAction); + _messages.Add(message); + + if (messageObjects == null) + return; + + foreach (var obj in messageObjects) + { + if (obj == null) + continue; + + message.AddMessageObject(obj); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs.meta new file mode 100644 index 00000000..6aea0106 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 05d7d92bbda6bf44f8ed5fbd0cde57e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResult.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs new file mode 100644 index 00000000..7ebe0f5d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs @@ -0,0 +1,53 @@ +using AssetStoreTools.Validator.Data.MessageActions; +using Newtonsoft.Json; +using System.Collections.Generic; +using Object = UnityEngine.Object; + +namespace AssetStoreTools.Validator.Data +{ + internal class TestResultMessage + { + [JsonIgnore] + public int MessageObjectCount => _messageObjects.Count; + + [JsonProperty] + private string _text; + [JsonProperty] + private List _messageObjects; + [JsonProperty] + private IMessageAction _clickAction; + + public TestResultMessage() { } + + public TestResultMessage(string text) + { + _text = text; + _messageObjects = new List(); + } + + public TestResultMessage(string text, IMessageAction clickAction) : this(text) + { + _clickAction = clickAction; + } + + public string GetText() + { + return _text; + } + + public IMessageAction GetClickAction() + { + return _clickAction; + } + + public void AddMessageObject(Object obj) + { + _messageObjects.Add(new TestResultObject(obj)); + } + + public TestResultObject GetMessageObject(int index) + { + return _messageObjects[index]; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs.meta new file mode 100644 index 00000000..eaab5193 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0761356c44140ca49917f93b42926471 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultMessage.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs new file mode 100644 index 00000000..8b601d54 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.Data +{ + internal class TestResultObject + { + [JsonIgnore] + private Object _object; + [JsonProperty] + private string _objectGlobalId; + + public TestResultObject(Object obj) + { + _object = obj; + _objectGlobalId = GlobalObjectId.GetGlobalObjectIdSlow(obj).ToString(); + } + + public Object GetObject() + { + if (_object != null) + return _object; + + if (string.IsNullOrEmpty(_objectGlobalId)) + return null; + + if (!GlobalObjectId.TryParse(_objectGlobalId, out var globalObject)) + return null; + + _object = GlobalObjectId.GlobalObjectIdentifierToObjectSlow(globalObject); + return _object; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs.meta new file mode 100644 index 00000000..414f1e24 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: acce8e477b7fe2c4aa430ebdd65ea7d1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultObject.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs new file mode 100644 index 00000000..ccda879b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs @@ -0,0 +1,11 @@ +namespace AssetStoreTools.Validator.Data +{ + internal enum TestResultStatus + { + Undefined = 0, + Pass = 1, + Fail = 2, + Warning = 3, + VariableSeverityIssue = 4 + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs.meta new file mode 100644 index 00000000..118669eb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: eef1ba0cf35f1304d8929e23b94e7c23 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/TestResultStatus.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs new file mode 100644 index 00000000..89ae6337 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs @@ -0,0 +1,24 @@ +using AssetStoreTools.Validator.TestDefinitions; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.Data +{ + internal class ValidationResult + { + public ValidationStatus Status; + public bool HadCompilationErrors; + public string ProjectPath; + public List Tests; + public Exception Exception; + + public ValidationResult() + { + Status = ValidationStatus.NotRun; + HadCompilationErrors = false; + ProjectPath = string.Empty; + Tests = new List(); + Exception = null; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs.meta new file mode 100644 index 00000000..cb5e9c31 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b15525b8dcf3e654ca2f895472ab7cb1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationResult.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs new file mode 100644 index 00000000..5b51134a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs @@ -0,0 +1,7 @@ +namespace AssetStoreTools.Validator.Data +{ + internal abstract class ValidationSettings + { + public string Category; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs.meta new file mode 100644 index 00000000..4afa08fa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 33e99d6b6e1e7ef4abd6cd2c0137741a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs new file mode 100644 index 00000000..f0fb66c6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs @@ -0,0 +1,10 @@ +namespace AssetStoreTools.Validator.Data +{ + internal enum ValidationStatus + { + NotRun, + RanToCompletion, + Failed, + Cancelled + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs.meta new file mode 100644 index 00000000..dbb0e8c3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a1f1e1e94faa6284f8d71804ba2bbd24 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationStatus.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs new file mode 100644 index 00000000..dd3b51cc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs @@ -0,0 +1,8 @@ +namespace AssetStoreTools.Validator.Data +{ + internal enum ValidationType + { + Generic = 0, + UnityPackage = 1 + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs.meta new file mode 100644 index 00000000..88f9f2ae --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 079f8963464230145853d86eff935e04 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Data/ValidationType.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs new file mode 100644 index 00000000..3556d1a3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs @@ -0,0 +1,259 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator +{ + internal class ExternalProjectValidator : ValidatorBase + { + private ExternalProjectValidationSettings _settings; + + public ExternalProjectValidator(ExternalProjectValidationSettings settings) : base(settings) + { + _settings = settings; + } + + protected override void ValidateSettings() + { + if (_settings == null) + throw new Exception("Validation Settings is null"); + + if (string.IsNullOrEmpty(_settings.PackagePath) + || !File.Exists(_settings.PackagePath)) + throw new Exception("Package was not found"); + } + + protected override ValidationResult GenerateValidationResult() + { + bool interactiveMode = false; + try + { + // Step 1 - prepare a temporary project + var result = PrepareTemporaryValidationProject(interactiveMode); + + // If preparation was cancelled or setting up project failed - return immediately + if (result.Status == ValidationStatus.Cancelled || result.Status == ValidationStatus.Failed) + return result; + + // Step 2 - load the temporary project and validate the package + result = ValidateTemporaryValidationProject(result, interactiveMode); + + // Step 3 - copy validation results + result = ParseValidationResult(result.ProjectPath); + + return result; + } + catch (Exception e) + { + return new ValidationResult() { Status = ValidationStatus.Failed, Exception = e }; + } + finally + { + EditorUtility.ClearProgressBar(); + } + } + + private ValidationResult PrepareTemporaryValidationProject(bool interactiveMode) + { + EditorUtility.DisplayProgressBar("Validating...", "Preparing the validation project. This may take a while.", 0.3f); + + var result = new ValidationResult(); + var tempProjectPath = Path.Combine(Constants.RootProjectPath, "Temp", GUID.Generate().ToString()).Replace("\\", "/"); + result.ProjectPath = tempProjectPath; + + if (!Directory.Exists(tempProjectPath)) + Directory.CreateDirectory(tempProjectPath); + + // Cannot edit a package.json file that does not yet exist - copy over AST instead + var tempPackagesPath = $"{tempProjectPath}/Packages"; + if (!Directory.Exists(tempPackagesPath)) + Directory.CreateDirectory(tempPackagesPath); + var assetStoreToolsPath = PackageUtility.GetAllPackages().FirstOrDefault(x => x.name == "com.unity.asset-store-tools").resolvedPath.Replace("\\", "/"); + FileUtility.CopyDirectory(assetStoreToolsPath, $"{tempPackagesPath}/com.unity.asset-store-tools", true); + + var logFilePath = $"{tempProjectPath}/preparation.log"; + + // Create the temporary project + var processInfo = new System.Diagnostics.ProcessStartInfo() + { + FileName = Constants.UnityPath, + Arguments = $"-createProject \"{tempProjectPath}\" -logFile \"{logFilePath}\" -importpackage \"{Path.GetFullPath(_settings.PackagePath)}\" -quit" + }; + + if (!interactiveMode) + processInfo.Arguments += " -batchmode"; + + var exitCode = 0; + + using (var process = System.Diagnostics.Process.Start(processInfo)) + { + while (!process.HasExited) + { + if (EditorUtility.DisplayCancelableProgressBar("Validating...", "Preparing the validation project. This may take a while.", 0.3f)) + process.Kill(); + + Thread.Sleep(10); + } + + exitCode = process.ExitCode; + + // Windows and MacOS exit codes + if (exitCode == -1 || exitCode == 137) + { + result.Status = ValidationStatus.Cancelled; + return result; + } + } + + if (exitCode != 0) + { + result.Status = ValidationStatus.Failed; + result.Exception = new Exception($"Setting up the temporary project failed (exit code {exitCode})\n\nMore information can be found in the log file: {logFilePath}"); + } + else + { + result.Status = ValidationStatus.RanToCompletion; + } + + return result; + } + + private ValidationResult ValidateTemporaryValidationProject(ValidationResult result, bool interactiveMode) + { + EditorUtility.DisplayProgressBar("Validating...", "Performing validation...", 0.6f); + + var logFilePath = $"{result.ProjectPath}/validation.log"; + var processInfo = new System.Diagnostics.ProcessStartInfo() + { + FileName = Constants.UnityPath, + Arguments = $"-projectPath \"{result.ProjectPath}\" -logFile \"{logFilePath}\" -executeMethod AssetStoreTools.Validator.ExternalProjectValidator.ValidateProject -category \"{_settings.Category}\"" + }; + + if (!interactiveMode) + processInfo.Arguments += " -batchmode -ignorecompilererrors"; + + var exitCode = 0; + + using (var process = System.Diagnostics.Process.Start(processInfo)) + { + process.WaitForExit(); + exitCode = process.ExitCode; + } + + if (exitCode != 0) + { + result.Status = ValidationStatus.Failed; + result.Exception = new Exception($"Validating the temporary project failed (exit code {exitCode})\n\nMore information can be found in the log file: {logFilePath}"); + } + else + { + result.Status = ValidationStatus.RanToCompletion; + } + + return result; + } + + private ValidationResult ParseValidationResult(string externalProjectPath) + { + if (!CachingService.GetCachedValidatorStateData(externalProjectPath, out var validationStateData)) + throw new Exception("Could not find external project's validation results"); + + var cachedResult = validationStateData.GetResults(); + var cachedTestResults = cachedResult.GetResults(); + var tests = GetApplicableTests(ValidationType.Generic, ValidationType.UnityPackage); + + foreach (var test in tests) + { + if (!cachedTestResults.Any(x => x.Key == test.Id)) + continue; + + var matchingTest = cachedTestResults.First(x => x.Key == test.Id); + test.Result = matchingTest.Value; + } + + var result = new ValidationResult() + { + Status = cachedResult.GetStatus(), + HadCompilationErrors = cachedResult.GetHadCompilationErrors(), + ProjectPath = cachedResult.GetProjectPath(), + Tests = tests + }; + + return result; + } + + public static void OpenExternalValidationProject(string projectPath) + { + var unityPath = Constants.UnityPath; + var logFilePath = $"{projectPath}/editor.log"; + + var processInfo = new System.Diagnostics.ProcessStartInfo() + { + FileName = unityPath, + Arguments = $"-projectPath \"{projectPath}\" -logFile \"{logFilePath}\" -executeMethod AssetStoreTools.AssetStoreTools.ShowAssetStoreToolsValidator" + }; + + using (var process = System.Diagnostics.Process.Start(processInfo)) + { + process.WaitForExit(); + } + } + + // Invoked via Command Line Arguments + private static void ValidateProject() + { + var exitCode = 0; + try + { + // Determine whether to validate Assets folder or Packages folders + var validationPaths = new List(); + var packageDirectories = Directory.GetDirectories("Packages", "*", SearchOption.TopDirectoryOnly) + .Select(x => x.Replace("\\", "/")) + .Where(x => x != "Packages/com.unity.asset-store-tools").ToArray(); + + if (packageDirectories.Length > 0) + validationPaths.AddRange(packageDirectories); + else + validationPaths.Add("Assets"); + + // Parse category + var category = string.Empty; + var args = Environment.GetCommandLineArgs().ToList(); + var categoryIndex = args.IndexOf("-category"); + if (categoryIndex != -1 && categoryIndex + 1 < args.Count) + category = args[categoryIndex + 1]; + + // Run validation + var validationSettings = new CurrentProjectValidationSettings() + { + Category = category, + ValidationPaths = validationPaths, + ValidationType = ValidationType.UnityPackage + }; + + var validator = new CurrentProjectValidator(validationSettings); + var result = validator.Validate(); + + // Display results + AssetStoreTools.ShowAssetStoreToolsValidator(validationSettings, result); + EditorUtility.DisplayDialog("Validation complete", "Package validation complete.\n\nTo resume work in the original project, close this Editor instance", "OK"); + } + catch + { + exitCode = 1; + throw; + } + finally + { + if (Application.isBatchMode) + EditorApplication.Exit(exitCode); + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs.meta new file mode 100644 index 00000000..09ea3715 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2664bbca63a2444498f13beb7e4fa731 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ExternalProjectValidator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs new file mode 100644 index 00000000..bd16b586 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs @@ -0,0 +1,11 @@ +using AssetStoreTools.Validator.Data; + +namespace AssetStoreTools.Validator +{ + internal interface IValidator + { + ValidationSettings Settings { get; } + + ValidationResult Validate(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs.meta new file mode 100644 index 00000000..e6d257e4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d49e9393288e0ed418c546e57c4cb425 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/IValidator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services.meta new file mode 100644 index 00000000..03e42344 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9315c4052243ab2488208604c11c53c7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService.meta new file mode 100644 index 00000000..5d9a1cb4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a52c1c4a2b7caa458af5b9a212b80a5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs new file mode 100644 index 00000000..cff8d95f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs @@ -0,0 +1,55 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.UI.Data.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace AssetStoreTools.Validator.Services +{ + internal class CachingService : ICachingService + { + public bool GetCachedValidatorStateData(out ValidatorStateData stateData) + { + return GetCachedValidatorStateData(Constants.RootProjectPath, out stateData); + } + + public bool GetCachedValidatorStateData(string projectPath, out ValidatorStateData stateData) + { + stateData = null; + if (!CacheUtil.GetFileFromProjectPersistentCache(projectPath, Constants.Cache.ValidationResultFile, out var filePath)) + return false; + + try + { + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = ValidatorStateDataContractResolver.Instance, + TypeNameHandling = TypeNameHandling.Auto, + Converters = new List() { new StringEnumConverter() } + }; + + stateData = JsonConvert.DeserializeObject(File.ReadAllText(filePath, Encoding.UTF8), serializerSettings); + return true; + } + catch + { + return false; + } + } + + public void CacheValidatorStateData(ValidatorStateData stateData) + { + var serializerSettings = new JsonSerializerSettings() + { + ContractResolver = ValidatorStateDataContractResolver.Instance, + Formatting = Formatting.Indented, + TypeNameHandling = TypeNameHandling.Auto, + Converters = new List() { new StringEnumConverter() } + }; + + CacheUtil.CreateFileInPersistentCache(Constants.Cache.ValidationResultFile, JsonConvert.SerializeObject(stateData, serializerSettings), true); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs.meta new file mode 100644 index 00000000..9a7597ac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b2d545f659acb4343bf485ffb20ecf72 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/CachingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs new file mode 100644 index 00000000..bee25d59 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs @@ -0,0 +1,11 @@ +using AssetStoreTools.Validator.UI.Data.Serialization; + +namespace AssetStoreTools.Validator.Services +{ + internal interface ICachingService : IValidatorService + { + void CacheValidatorStateData(ValidatorStateData stateData); + bool GetCachedValidatorStateData(out ValidatorStateData stateData); + bool GetCachedValidatorStateData(string projectPath, out ValidatorStateData stateData); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs.meta new file mode 100644 index 00000000..6abd7bfa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a8a3e36c133848447b043a91e709c63e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/ICachingService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs new file mode 100644 index 00000000..aa495ee2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json.Serialization; + +namespace AssetStoreTools.Previews.Services +{ + internal class PreviewDatabaseContractResolver : DefaultContractResolver + { + private static PreviewDatabaseContractResolver _instance; + public static PreviewDatabaseContractResolver Instance => _instance ?? (_instance = new PreviewDatabaseContractResolver()); + + private NamingStrategy _namingStrategy; + + private PreviewDatabaseContractResolver() + { + _namingStrategy = new SnakeCaseNamingStrategy(); + } + + protected override string ResolvePropertyName(string propertyName) + { + var resolvedName = _namingStrategy.GetPropertyName(propertyName, false); + if (resolvedName.StartsWith("_")) + return resolvedName.Substring(1); + + return resolvedName; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs.meta new file mode 100644 index 00000000..e423e2a7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: aee615e9aaf50fb4f989cd4698e8947e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/CachingService/PreviewDatabaseContractResolver.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs new file mode 100644 index 00000000..3ff09b82 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs @@ -0,0 +1,4 @@ +namespace AssetStoreTools.Validator.Services +{ + internal interface IValidatorService { } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs.meta new file mode 100644 index 00000000..0623f405 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 075953f4ab4a65d4fae6e891360df0d0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/IValidatorService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation.meta new file mode 100644 index 00000000..bf10d70d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 184dcfbfe1d21454fa8cf49f1c637871 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions.meta new file mode 100644 index 00000000..d6c2cf03 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed0af5acc22551645ae4cb7d75bd1c36 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs new file mode 100644 index 00000000..a73e3ce1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal interface IAssetUtilityService : IValidatorService + { + IEnumerable GetAssetPathsFromAssets(string[] searchPaths, AssetType type); + IEnumerable GetObjectsFromAssets(string[] searchPaths, AssetType type) where T : Object; + IEnumerable GetObjectsFromAssets(string[] searchPaths, AssetType type); + string ObjectToAssetPath(Object obj); + T AssetPathToObject(string assetPath) where T : Object; + Object AssetPathToObject(string assetPath); + AssetImporter GetAssetImporter(string assetPath); + AssetImporter GetAssetImporter(Object asset); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs.meta new file mode 100644 index 00000000..85142f31 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d28c5ea40f4c9954bae02804e416b898 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IAssetUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs new file mode 100644 index 00000000..7633ffdf --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs @@ -0,0 +1,7 @@ +namespace AssetStoreTools.Validator.Services.Validation +{ + internal interface IFileSignatureUtilityService : IValidatorService + { + ArchiveType GetArchiveType(string filePath); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs.meta new file mode 100644 index 00000000..9b6cbb82 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 609c423482ecf8844a71166b4ef49cb6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IFileSignatureUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs new file mode 100644 index 00000000..ba4959e8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal interface IMeshUtilityService : IValidatorService + { + IEnumerable GetCustomMeshesInObject(GameObject obj); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs.meta new file mode 100644 index 00000000..28ce709f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: acde6f9b97c9cac4b88a84aa9001a0fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IMeshUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs new file mode 100644 index 00000000..fa29424f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal interface IModelUtilityService : IValidatorService + { + Dictionary> GetImportLogs(params Object[] models); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs.meta new file mode 100644 index 00000000..e710e854 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 91f6bacccdfecb84fb5ab0ba384353b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IModelUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs new file mode 100644 index 00000000..d80f1841 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs @@ -0,0 +1,13 @@ +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal interface ISceneUtilityService : IValidatorService + { + string CurrentScenePath { get; } + + Scene OpenScene(string scenePath); + GameObject[] GetRootGameObjects(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs.meta new file mode 100644 index 00000000..ac0e61d0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cf5ef331063e5aa4e95dfe3eadedf9af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/ISceneUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs new file mode 100644 index 00000000..04214c3c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using Object = UnityEngine.Object; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal interface IScriptUtilityService : IValidatorService + { + IReadOnlyDictionary> GetTypeNamespacesFromScriptAssets(IList monoScripts); + IReadOnlyDictionary> GetTypesFromAssemblies(IList assemblies); + IReadOnlyDictionary> GetTypesFromScriptAssets(IList monoScripts); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs.meta new file mode 100644 index 00000000..cf09904e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e0a9f88d37222e4428853b6d3d00b1bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Abstractions/IScriptUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs new file mode 100644 index 00000000..fb51d8a4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs @@ -0,0 +1,216 @@ +using AssetStoreTools.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class AssetUtilityService : IAssetUtilityService + { + public IEnumerable GetAssetPathsFromAssets(string[] searchPaths, AssetType type) + { + string filter = string.Empty; + string[] extensions = null; + + switch (type) + { + // General Types + case AssetType.All: + filter = ""; + break; + case AssetType.Prefab: + filter = "t:prefab"; + break; + case AssetType.Material: + filter = "t:material"; + break; + case AssetType.Model: + filter = "t:model"; + break; + case AssetType.Scene: + filter = "t:scene"; + break; + case AssetType.Texture: + filter = "t:texture"; + break; + case AssetType.Video: + filter = "t:VideoClip"; + break; + // Specific Types + case AssetType.LossyAudio: + filter = "t:AudioClip"; + extensions = new[] { ".mp3", ".ogg" }; + break; + case AssetType.NonLossyAudio: + filter = "t:AudioClip"; + extensions = new[] { ".wav", ".aif", ".aiff" }; + break; + case AssetType.JavaScript: + filter = "t:TextAsset"; + extensions = new[] { ".js" }; + break; + case AssetType.Mixamo: + filter = "t:model"; + extensions = new[] { ".fbx" }; + break; + case AssetType.JPG: + filter = "t:texture"; + extensions = new[] { ".jpg", "jpeg" }; + break; + case AssetType.Executable: + filter = string.Empty; + extensions = new[] { ".exe", ".bat", ".msi", ".apk" }; + break; + case AssetType.Documentation: + filter = string.Empty; + extensions = new[] { ".txt", ".pdf", ".html", ".rtf", ".md" }; + break; + case AssetType.SpeedTree: + filter = string.Empty; + extensions = new[] { ".spm", ".srt", ".stm", ".scs", ".sfc", ".sme", ".st" }; + break; + case AssetType.Shader: + filter = string.Empty; + extensions = new[] { ".shader", ".shadergraph", ".raytrace", ".compute" }; + break; + case AssetType.MonoScript: + filter = "t:script"; + extensions = new[] { ".cs" }; + break; + case AssetType.UnityPackage: + filter = string.Empty; + extensions = new[] { ".unitypackage" }; + break; + case AssetType.PrecompiledAssembly: + var assemblyPaths = GetPrecompiledAssemblies(searchPaths); + return assemblyPaths; + default: + return Array.Empty(); + } + + var guids = AssetDatabase.FindAssets(filter, searchPaths); + var paths = guids.Select(AssetDatabase.GUIDToAssetPath); + + if (extensions != null) + paths = paths.Where(x => extensions.Any(x.ToLower().EndsWith)); + + if (type == AssetType.Mixamo) + paths = paths.Where(IsMixamoFbx); + + paths = paths.Distinct(); + return paths; + } + + public IEnumerable GetObjectsFromAssets(string[] searchPaths, AssetType type) where T : Object + { + var paths = GetAssetPathsFromAssets(searchPaths, type); +#if !AB_BUILDER + var objects = paths.Select(AssetDatabase.LoadAssetAtPath).Where(x => x != null); +#else + var objects = new AssetEnumerator(paths); +#endif + return objects; + } + + public IEnumerable GetObjectsFromAssets(string[] searchPaths, AssetType type) + { + return GetObjectsFromAssets(searchPaths, type); + } + + private IEnumerable GetPrecompiledAssemblies(string[] searchPaths) + { + // Note - for packages, Compilation Pipeline returns full paths, as they appear on disk, not Asset Database + var allDllPaths = CompilationPipeline.GetPrecompiledAssemblyPaths(CompilationPipeline.PrecompiledAssemblySources.UserAssembly); + var rootProjectPath = Application.dataPath.Substring(0, Application.dataPath.Length - "Assets".Length); + var packages = PackageUtility.GetAllLocalPackages(); + + var result = new List(); + foreach (var dllPath in allDllPaths) + { + var absoluteDllPath = Path.GetFullPath(dllPath).Replace("\\", "/"); + foreach (var validationPath in searchPaths) + { + var absoluteValidationPath = Path.GetFullPath(validationPath).Replace("\\", "/"); + if (absoluteDllPath.StartsWith(absoluteValidationPath)) + { + int pathSeparatorLength = 1; + if (absoluteDllPath.StartsWith(Application.dataPath)) + { + var adbPath = $"Assets/{absoluteDllPath.Remove(0, Application.dataPath.Length + pathSeparatorLength)}"; + result.Add(adbPath); + } + else + { + // For non-Asset folder paths (i.e. local and embedded packages), convert disk path to ADB path + var package = packages.FirstOrDefault(x => dllPath.StartsWith(x.resolvedPath.Replace('\\', '/'))); + + if (package == null) + continue; + + var dllPathInPackage = absoluteDllPath.Remove(0, Path.GetFullPath(package.resolvedPath).Length + pathSeparatorLength); + var adbPath = $"Packages/{package.name}/{dllPathInPackage}"; + + result.Add(adbPath); + } + } + } + } + + return result; + } + + private bool IsMixamoFbx(string fbxPath) + { + // Location of Mixamo Header, this is located in every mixamo fbx file exported + //const int mixamoHeader = 0x4c0 + 2; // < this is the original location from A$ Tools, unsure if Mixamo file headers were changed since then + const int mixamoHeader = 1622; + // Length of Mixamo header + const int length = 0xa; + + var fs = new FileStream(fbxPath, FileMode.Open); + // Check if length is further than + if (fs.Length < mixamoHeader) + return false; + + byte[] buffer = new byte[length]; + using (BinaryReader reader = new BinaryReader(fs)) + { + reader.BaseStream.Seek(mixamoHeader, SeekOrigin.Begin); + reader.Read(buffer, 0, length); + } + + string result = System.Text.Encoding.ASCII.GetString(buffer); + return result.Contains("Mixamo"); + } + + public string ObjectToAssetPath(Object obj) + { + return AssetDatabase.GetAssetPath(obj); + } + + public T AssetPathToObject(string assetPath) where T : Object + { + return AssetDatabase.LoadAssetAtPath(assetPath); + } + + public Object AssetPathToObject(string assetPath) + { + return AssetPathToObject(assetPath); + } + + public AssetImporter GetAssetImporter(string assetPath) + { + return AssetImporter.GetAtPath(assetPath); + } + + public AssetImporter GetAssetImporter(Object asset) + { + return GetAssetImporter(ObjectToAssetPath(asset)); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs.meta new file mode 100644 index 00000000..f28cb1cd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9634968648d355c47b7cb12aead7abab +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/AssetUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data.meta new file mode 100644 index 00000000..32569358 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8dcc2f4da0b6cea4ab4733ebf32edab4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs new file mode 100644 index 00000000..d225180e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs @@ -0,0 +1,19 @@ +namespace AssetStoreTools.Validator.Services.Validation +{ + internal enum ArchiveType + { + None, + TarGz, + Zip, + Rar, + Tar, + TarZip, + Bz2, + LZip, + SevenZip, + GZip, + QuickZip, + Xz, + Wim + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs.meta new file mode 100644 index 00000000..dcf4f0c6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 4061cb7aed3883346a66494c23e2e77b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/ArchiveType.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs new file mode 100644 index 00000000..0df889a8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using Object = UnityEngine.Object; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class AssetEnumerator : IEnumerator, IEnumerable where T : Object + { + public const int Capacity = 32; + + private Queue _pathQueue; + private Queue _loadedAssetQueue; + + private T _currentElement; + + public AssetEnumerator(IEnumerable paths) + { + _pathQueue = new Queue(paths); + _loadedAssetQueue = new Queue(); + } + + public bool MoveNext() + { + bool hasPathsButHasNoAssets = _pathQueue.Count != 0 && _loadedAssetQueue.Count == 0; + if (hasPathsButHasNoAssets) + { + LoadMore(); + } + + bool dequeued = false; + if (_loadedAssetQueue.Count != 0) + { + _currentElement = _loadedAssetQueue.Dequeue(); + dequeued = true; + } + + return dequeued; + } + + private void LoadMore() + { + int limit = Capacity; + while (limit > 0 && _pathQueue.Count != 0) + { + string path = _pathQueue.Dequeue(); + T asset = AssetDatabase.LoadAssetAtPath(path); + if (asset != null) + { + _loadedAssetQueue.Enqueue(asset); + limit--; + } + } + + // Unload other loose asset references + EditorUtility.UnloadUnusedAssetsImmediate(); + } + + public void Reset() + { + throw new NotSupportedException("Asset Enumerator cannot be reset."); + } + + public T Current => _currentElement; + + object IEnumerator.Current => Current; + + public void Dispose() + { + // No need to dispose + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + public IEnumerator GetEnumerator() + { + return this; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs.meta new file mode 100644 index 00000000..01ead66d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 0859579889cc56f4aa26eb863a1487b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetEnumerator.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs new file mode 100644 index 00000000..2fc188d0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs @@ -0,0 +1,25 @@ +namespace AssetStoreTools.Validator.Services.Validation +{ + internal enum AssetType + { + All, + Documentation, + Executable, + JPG, + JavaScript, + LossyAudio, + Material, + Mixamo, + Model, + MonoScript, + NonLossyAudio, + PrecompiledAssembly, + Prefab, + Scene, + Shader, + SpeedTree, + Texture, + UnityPackage, + Video + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs.meta new file mode 100644 index 00000000..5519b783 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b81d00d4ed0a7da4289d4d6248ef9d34 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/AssetType.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs new file mode 100644 index 00000000..67663be5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class LogEntry + { + public string Message; + public LogType Severity; + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs.meta new file mode 100644 index 00000000..e4d2006d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a1e81104d6b0f4c449ee57503c3b6669 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/Data/LogEntry.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs new file mode 100644 index 00000000..2a140f45 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class FileSignatureUtilityService : IFileSignatureUtilityService + { + private class FileSignature + { + public byte[] SignatureBytes; + public int Offset; + + public FileSignature(byte[] signatureBytes, int offset) + { + SignatureBytes = signatureBytes; + Offset = offset; + } + } + + private static readonly Dictionary ArchiveSignatures = new Dictionary + { + { new FileSignature(new byte[] { 0x1f, 0x8b }, 0), ArchiveType.TarGz }, + { new FileSignature(new byte[] { 0x50, 0x4b, 0x03, 0x04 }, 0), ArchiveType.Zip }, + { new FileSignature(new byte[] { 0x50, 0x4b, 0x05, 0x06 }, 0), ArchiveType.Zip }, // Empty Zip Archive + { new FileSignature(new byte[] { 0x50, 0x4b, 0x07, 0x08 }, 0), ArchiveType.Zip }, // Spanned Zip Archive + + { new FileSignature(new byte[] { 0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00 }, 0), ArchiveType.Rar }, // RaR v1.50+ + { new FileSignature(new byte[] { 0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x01, 0x00 }, 0), ArchiveType.Rar }, // RaR v5.00+ + { new FileSignature(new byte[] { 0x75, 0x73, 0x74, 0x61, 0x72, 0x00, 0x30, 0x30 }, 257), ArchiveType.Tar }, + { new FileSignature(new byte[] { 0x75, 0x73, 0x74, 0x61, 0x72, 0x20, 0x20, 0x00 }, 257), ArchiveType.Tar }, + { new FileSignature(new byte[] { 0x1f, 0x9d }, 0), ArchiveType.TarZip }, // TarZip LZW algorithm + { new FileSignature(new byte[] { 0x1f, 0xa0 }, 0), ArchiveType.TarZip }, // TarZip LZH algorithm + { new FileSignature(new byte[] { 0x42, 0x5a, 0x68 }, 0), ArchiveType.Bz2 }, + { new FileSignature(new byte[] { 0x4c, 0x5a, 0x49, 0x50 }, 0), ArchiveType.LZip }, + { new FileSignature(new byte[] { 0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c }, 0), ArchiveType.SevenZip }, + { new FileSignature(new byte[] { 0x1f, 0x8b }, 0), ArchiveType.GZip }, + { new FileSignature(new byte[] { 0x52, 0x53, 0x56, 0x4b, 0x44, 0x41, 0x54, 0x41 }, 0), ArchiveType.QuickZip }, + { new FileSignature(new byte[] { 0xfd, 0x37, 0x7a, 0x58, 0x5a, 0x00 }, 0), ArchiveType.Xz }, + { new FileSignature(new byte[] { 0x4D, 0x53, 0x57, 0x49, 0x4D, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00 }, 0), ArchiveType.Wim } + }; + + public ArchiveType GetArchiveType(string filePath) + { + if (!File.Exists(filePath)) + return ArchiveType.None; + + try + { + using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + { + foreach (var kvp in ArchiveSignatures) + { + var fileSignature = kvp.Key; + var archiveType = kvp.Value; + + if (stream.Length < fileSignature.SignatureBytes.Length) + continue; + + var bytes = new byte[fileSignature.SignatureBytes.Length]; + stream.Seek(fileSignature.Offset, SeekOrigin.Begin); + stream.Read(bytes, 0, bytes.Length); + + if (fileSignature.SignatureBytes.SequenceEqual(bytes.Take(fileSignature.SignatureBytes.Length))) + return archiveType; + } + } + } + catch (DirectoryNotFoundException) + { + Debug.LogWarning($"File '{filePath}' exists, but could not be opened for reading. Please make sure the project path lengths are not too long for the Operating System"); + } + + return ArchiveType.None; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs.meta new file mode 100644 index 00000000..744f983f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 695ed79ad88c3b44b8ae41b650ebe16c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/FileSignatureUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs new file mode 100644 index 00000000..fba268ce --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class MeshUtilityService : IMeshUtilityService + { + public IEnumerable GetCustomMeshesInObject(GameObject obj) + { + var meshes = new List(); + + var meshFilters = obj.GetComponentsInChildren(true); + var skinnedMeshes = obj.GetComponentsInChildren(true); + + meshes.AddRange(meshFilters.Select(m => m.sharedMesh)); + meshes.AddRange(skinnedMeshes.Select(m => m.sharedMesh)); + + meshes = meshes.Where(m => AssetDatabase.GetAssetPath(m).StartsWith("Assets/") || + AssetDatabase.GetAssetPath(m).StartsWith("Packages/")).ToList(); + + return meshes; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs.meta new file mode 100644 index 00000000..5f404712 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 307f5dd7be983e246adbda52ac50ecf3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/MeshUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs new file mode 100644 index 00000000..b0189914 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs @@ -0,0 +1,147 @@ +#if !UNITY_2022_2_OR_NEWER +using System; +using System.Reflection; +#endif +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +#if UNITY_2022_2_OR_NEWER +using UnityEditor.AssetImporters; +#endif +using UnityEngine; +using Object = UnityEngine.Object; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class ModelUtilityService : IModelUtilityService + { + private IAssetUtilityService _assetUtility; + +#if !UNITY_2022_2_OR_NEWER + // Rig fields + private const string RigImportWarningsField = "m_RigImportWarnings"; + private const string RigImportErrorsField = "m_RigImportErrors"; + + // Animation fields + private const string AnimationImportWarningsField = "m_AnimationImportWarnings"; + private const string AnimationImportErrorsField = "m_AnimationImportErrors"; + + private static Editor _modelImporterEditor = null; +#endif + + public ModelUtilityService(IAssetUtilityService assetUtility) + { + _assetUtility = assetUtility; + } + + public Dictionary> GetImportLogs(params Object[] models) + { +#if UNITY_2022_2_OR_NEWER + return GetImportLogsDefault(models); +#else + return GetImportLogsLegacy(models); +#endif + } + +#if UNITY_2022_2_OR_NEWER + private Dictionary> GetImportLogsDefault(params Object[] models) + { + var modelsWithLogs = new Dictionary>(); + + foreach (var model in models) + { + var modelLogs = new List(); + + var importLog = AssetImporter.GetImportLog(_assetUtility.ObjectToAssetPath(model)); + + if (importLog == null) + continue; + + var entries = importLog.logEntries.Where(x => x.flags.HasFlag(ImportLogFlags.Warning) || x.flags.HasFlag(ImportLogFlags.Error)); + foreach (var entry in entries) + { + var severity = entry.flags.HasFlag(ImportLogFlags.Error) ? LogType.Error : LogType.Warning; + modelLogs.Add(new LogEntry() { Message = entry.message, Severity = severity }); + } + + if (modelLogs.Count > 0) + modelsWithLogs.Add(model, modelLogs); + } + + return modelsWithLogs; + } +#endif + +#if !UNITY_2022_2_OR_NEWER + private Dictionary> GetImportLogsLegacy(params Object[] models) + { + var modelsWithLogs = new Dictionary>(); + + foreach (var model in models) + { + var modelLogs = new List(); + + // Load the Model Importer + var modelImporter = _assetUtility.GetAssetImporter(model) as ModelImporter; + + var editorAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name.Equals("UnityEditor")); + + var modelImporterEditorType = editorAssembly.GetType("UnityEditor.ModelImporterEditor"); + + // Load its Model Importer Editor + Editor.CreateCachedEditorWithContext(new Object[] { modelImporter }, model, modelImporterEditorType, ref _modelImporterEditor); + + // Find the base type + var modelImporterEditorTypeBase = _modelImporterEditor.GetType().BaseType; + + // Get the tabs value + var tabsArrayType = modelImporterEditorTypeBase.GetRuntimeProperties().FirstOrDefault(x => x.Name == "tabs"); + var tabsArray = (Array)tabsArrayType.GetValue(_modelImporterEditor); + + // Get the tabs (Model | Rig | Animation | Materials) + var rigTab = tabsArray.GetValue(1); + var animationTab = tabsArray.GetValue(2); + + var rigErrorsCheckSuccess = CheckFieldForSerializedProperty(rigTab, RigImportErrorsField, out var rigErrors); + var rigWarningsCheckSuccess = CheckFieldForSerializedProperty(rigTab, RigImportWarningsField, out var rigWarnings); + var animationErrorsCheckSuccess = CheckFieldForSerializedProperty(animationTab, AnimationImportErrorsField, out var animationErrors); + var animationWarningsCheckSuccess = CheckFieldForSerializedProperty(animationTab, AnimationImportWarningsField, out var animationWarnings); + + if (!rigErrorsCheckSuccess || !rigWarningsCheckSuccess || !animationErrorsCheckSuccess || !animationWarningsCheckSuccess) + UnityEngine.Debug.LogWarning($"An error was encountered when checking import logs for model '{model.name}'"); + + if (!string.IsNullOrEmpty(rigWarnings)) + modelLogs.Add(new LogEntry() { Message = rigWarnings, Severity = LogType.Warning }); + if (!string.IsNullOrEmpty(rigErrors)) + modelLogs.Add(new LogEntry() { Message = rigErrors, Severity = LogType.Error }); + if (!string.IsNullOrEmpty(animationWarnings)) + modelLogs.Add(new LogEntry() { Message = animationWarnings, Severity = LogType.Warning }); + if (!string.IsNullOrEmpty(animationErrors)) + modelLogs.Add(new LogEntry() { Message = animationErrors, Severity = LogType.Error }); + + if (modelLogs.Count > 0) + modelsWithLogs.Add(model, modelLogs); + } + + return modelsWithLogs; + } + + private static bool CheckFieldForSerializedProperty(object source, string propertyName, out string message) + { + message = string.Empty; + + try + { + var propertyType = source.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)); + var propertyValue = propertyType.GetValue(source) as SerializedProperty; + message = propertyValue.stringValue; + return true; + } + catch + { + return false; + } + } +#endif + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs.meta new file mode 100644 index 00000000..2db45203 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c50ca4c87e66f1b478279e5d1db4a08e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ModelUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs new file mode 100644 index 00000000..ec7a43b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs @@ -0,0 +1,26 @@ +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class SceneUtilityService : ISceneUtilityService + { + public string CurrentScenePath => SceneManager.GetActiveScene().path; + + public Scene OpenScene(string scenePath) + { + EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); + if (string.IsNullOrEmpty(scenePath) || AssetDatabase.LoadAssetAtPath(scenePath) == null) + return EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects); + else + return EditorSceneManager.OpenScene(scenePath); + } + + public GameObject[] GetRootGameObjects() + { + return SceneManager.GetSceneByPath(CurrentScenePath).GetRootGameObjects(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs.meta new file mode 100644 index 00000000..e88be26f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 53e8deb0ebfb7ea47956f3a859580cd4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/SceneUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs new file mode 100644 index 00000000..2e85c2a4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs @@ -0,0 +1,658 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using UnityEditor; +using Object = UnityEngine.Object; + +namespace AssetStoreTools.Validator.Services.Validation +{ + internal class ScriptUtilityService : IScriptUtilityService + { + private const int ScriptTimeoutMs = 10000; + private const string IgnoredAssemblyCharacters = "!@#$%^*&()-+=[]{}\\|;:'\",.<>/?"; + + /// + /// For a given list of script assets, retrieves a list of types and their namespaces + /// + /// + /// A dictionary mapping each script asset with a list of its types. + /// The type tuple contains a name (e.g. class MyClass) and its namespace (e.g. MyNamespace) + /// + public IReadOnlyDictionary> GetTypeNamespacesFromScriptAssets(IList monoScripts) + { + var typesAndNamespaces = new Dictionary>(); + var typeInfos = GetTypeInfosFromScriptAssets(monoScripts); + + foreach (var kvp in typeInfos) + { + var namespacesInScript = new List<(string Name, string Namespace)>(); + foreach (var typeInfo in kvp.Value) + { + bool isValidType = typeInfo.TypeName == ScriptParser.TypeName.Class || typeInfo.TypeName == ScriptParser.TypeName.Struct || + typeInfo.TypeName == ScriptParser.TypeName.Interface || typeInfo.TypeName == ScriptParser.TypeName.Enum; + + if (isValidType) + namespacesInScript.Add(($"{typeInfo.TypeName.ToString().ToLower()} {typeInfo.Name}", typeInfo.Namespace)); + } + + typesAndNamespaces.Add(kvp.Key, namespacesInScript); + } + + return typesAndNamespaces; + } + + /// + /// Scans the given precompiled assembly assets to retrieve a list of their contained types + /// + /// + /// A dictionary mapping each precompiled assembly asset with a list of System.Type objects. + public IReadOnlyDictionary> GetTypesFromAssemblies(IList assemblies) + { + var dllPaths = assemblies.ToDictionary(t => AssetDatabase.GetAssetPath(t), t => t); + var types = new ConcurrentDictionary>(); + var failedDllPaths = new ConcurrentBag(); + + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + + Parallel.ForEach(dllPaths.Keys, + (assemblyPath) => + { + try + { + var assembly = allAssemblies.FirstOrDefault(x => Path.GetFullPath(x.Location).Equals(Path.GetFullPath(assemblyPath), StringComparison.OrdinalIgnoreCase)); + if (assembly == null) + return; + + var assemblyTypes = assembly.GetTypes().Where(x => !IgnoredAssemblyCharacters.Any(c => x.Name.Contains(c))).ToList(); + types.TryAdd(dllPaths[assemblyPath], assemblyTypes); + } + catch + { + failedDllPaths.Add(assemblyPath); + } + }); + + if (failedDllPaths.Count > 0) + { + var message = new StringBuilder("The following precompiled assemblies could not be checked:"); + foreach (var path in failedDllPaths) + message.Append($"\n{path}"); + UnityEngine.Debug.LogWarning(message); + } + + // Types are sorted randomly due to parallelism, therefore need to be sorted before returning + var sortedTypes = dllPaths.Where(x => types.ContainsKey(x.Value)) + .Select(x => new KeyValuePair>(x.Value, types[x.Value])) + .ToDictionary(t => t.Key, t => t.Value); + + return sortedTypes; + } + + /// + /// Scans the given script assets to retrieve a list of their contained types + /// + /// + /// A dictionary mapping each precompiled assembly asset with a list of System.Type objects. + public IReadOnlyDictionary> GetTypesFromScriptAssets(IList monoScripts) + { + var realTypes = new Dictionary>(); + var typeInfos = GetTypeInfosFromScriptAssets(monoScripts); + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (var kvp in typeInfos) + { + var realTypesInScript = new List(); + foreach (var typeInfo in kvp.Value) + { + bool isValidType = typeInfo.TypeName == ScriptParser.TypeName.Class || typeInfo.TypeName == ScriptParser.TypeName.Struct || + typeInfo.TypeName == ScriptParser.TypeName.Interface || typeInfo.TypeName == ScriptParser.TypeName.Enum; + + if (isValidType) + { + var realType = assemblies.Where(a => a.GetType(typeInfo.GetReflectionFriendlyFullName()) != null) + .Select(a => a.GetType(typeInfo.GetReflectionFriendlyFullName())).FirstOrDefault(); + if (realType != null) + realTypesInScript.Add(realType); + } + } + + realTypes.Add(kvp.Key, realTypesInScript); + } + + return realTypes; + } + + /// + /// Scans the given MonoScript assets to retrieve a list of their contained types + /// + /// + /// A dictionary mapping each script asset with a list of TypeInfo objects. + private IReadOnlyDictionary> GetTypeInfosFromScriptAssets(IList monoScripts) + { + var types = new ConcurrentDictionary>(); + var monoScriptContents = new Dictionary(); + var failedScripts = new ConcurrentBag(); + + // A separate dictionary is needed because MonoScript contents cannot be accessed outside of the main thread + foreach (var kvp in monoScripts) + monoScriptContents.Add(kvp, kvp.text); + + var tasks = new List>(); + + try + { + foreach (var kvp in monoScriptContents) + { + var cancellationTokenSource = new CancellationTokenSource(ScriptTimeoutMs); + + var task = Task.Run(() => + { + var parsingTask = new ScriptParser(cancellationTokenSource.Token); + var parsed = parsingTask.GetTypesInScript(kvp.Value, out IList parsedTypes); + if (parsed) + types.TryAdd(kvp.Key, parsedTypes); + else + failedScripts.Add(kvp.Key); + }); + + tasks.Add(new Tuple(task, cancellationTokenSource)); + } + + foreach (var t in tasks) + t.Item1.Wait(); + } + finally + { + foreach (var t in tasks) + t.Item2.Dispose(); + } + + if (failedScripts.Count > 0) + { + var message = new StringBuilder("The following scripts could not be checked:"); + foreach (var s in failedScripts) + message.Append($"\n{AssetDatabase.GetAssetPath(s)}"); + UnityEngine.Debug.LogWarning(message); + } + + // Types are sorted randomly due to parallelism, therefore need to be sorted before returning + var sortedTypes = monoScriptContents.Where(x => types.ContainsKey(x.Key)) + .Select(x => new KeyValuePair>(x.Key, types[x.Key])) + .ToDictionary(t => t.Key, t => t.Value); + + return sortedTypes; + } + + /// + /// A simple script parser class to detect types declared within a script + /// + private class ScriptParser + { + /// + /// Types that can be identified by the script parser + /// + public enum TypeName + { + Undefined, + Namespace, + Class, + Struct, + Interface, + Enum, + IdentationStart, + IdentationEnd + } + + /// + /// A class containing information about each block of a C# script + /// + /// A block in this context is defined as script text that is contained within curly brackets. + /// If it's a type, it may have a preceding name and a namespace + /// + public class BlockInfo + { + public TypeName TypeName = TypeName.Undefined; + public string Name = string.Empty; + public string FullName = string.Empty; + public string Namespace = string.Empty; + public int FoundIndex; + public int StartIndex; + + public BlockInfo ParentBlock; + + public string GetReflectionFriendlyFullName() + { + StringBuilder sb = new StringBuilder(FullName); + for (int i = sb.Length - 1; i >= Namespace.Length + 1; i--) + if (sb[i] == '.') + sb[i] = '+'; + + return sb.ToString(); + } + } + + private CancellationToken _token; + + public ScriptParser(CancellationToken token) + { + _token = token; + } + + public bool GetTypesInScript(string text, out IList types) + { + types = null; + + try + { + var sanitized = SanitizeScript(text); + types = ScanForTypes(sanitized); + return true; + } + catch + { + return false; + } + } + + private string SanitizeScript(string source) + { + var sb = new StringBuilder(source); + + // Remove comments and strings + sb = RemoveStringsAndComments(sb); + + // Replace newlines with spaces + sb.Replace("\r", " ").Replace("\n", " "); + + // Space out the brackets + sb.Replace("{", " { ").Replace("}", " } "); + + // Insert a space at the start for more convenient parsing + sb.Insert(0, " "); + + // Remove repeating spaces + var sanitized = Regex.Replace(sb.ToString(), @"\s{2,}", " "); + + return sanitized; + } + + private StringBuilder RemoveStringsAndComments(StringBuilder sb) + { + void CheckStringIdentifiers(int index, out bool isVerbatim, out bool isInterpolated) + { + isVerbatim = false; + isInterpolated = false; + + string precedingChars = string.Empty; + for (int i = index - 1; i >= 0; i--) + { + if (sb[i] == ' ') + break; + precedingChars += sb[i]; + } + + if (precedingChars.Contains("@")) + isVerbatim = true; + if (precedingChars.Contains("$")) + isInterpolated = true; + } + + bool IsRegion(int index) + { + if (sb.Length - index < "#region".Length) + return false; + if (sb[index] == '#' && sb[index + 1] == 'r' && sb[index + 2] == 'e' && sb[index + 3] == 'g' && sb[index + 4] == 'i' && + sb[index + 5] == 'o' && sb[index + 6] == 'n') + return true; + return false; + } + + var removeRanges = new List>(); + + for (int i = 0; i < sb.Length; i++) + { + _token.ThrowIfCancellationRequested(); + + // Comment code + if (sb[i] == '/') + { + if (sb[i + 1] == '/') + { + for (int j = i + 1; j < sb.Length; j++) + { + _token.ThrowIfCancellationRequested(); + if (sb[j] == '\n' || j == sb.Length - 1) + { + removeRanges.Add(new Tuple(i, j - i + 1)); + i = j; + break; + } + } + } + else if (sb[i + 1] == '*') + { + for (int j = i + 2; j < sb.Length; j++) + { + _token.ThrowIfCancellationRequested(); + if (sb[j] == '/' && sb[j - 1] == '*') + { + removeRanges.Add(new Tuple(i, j - i + 1)); + i = j + 1; + break; + } + } + } + } + // Char code + else if (sb[i] == '\'') + { + for (int j = i + 1; j < sb.Length; j++) + { + _token.ThrowIfCancellationRequested(); + if (sb[j] == '\'') + { + if (sb[j - 1] == '\\') + { + int slashCount = 0; + int k = j - 1; + while (sb[k--] == '\\') + slashCount++; + if (slashCount % 2 != 0) + continue; + } + removeRanges.Add(new Tuple(i, j - i + 1)); + i = j; + break; + } + } + } + // String code + else if (sb[i] == '"') + { + if (sb[i - 1] == '\'' && sb[i + 1] == '\'' || (sb[i - 2] == '\'' && sb[i - 1] == '\\' && sb[i + 1] == '\'')) + continue; + + CheckStringIdentifiers(i, out bool isVerbatim, out bool isInterpolated); + + var bracketCount = 0; + bool interpolationEnd = true; + for (int j = i + 1; j < sb.Length; j++) + { + _token.ThrowIfCancellationRequested(); + if (isInterpolated && (sb[j] == '{' || sb[j] == '}')) + { + if (sb[j] == '{') + { + if (sb[j + 1] != '{') + bracketCount++; + else + j += 1; + } + else if (sb[j] == '}') + { + if (sb[j + 1] != '}') + bracketCount--; + else + j += 1; + } + + if (bracketCount == 0) + interpolationEnd = true; + else + interpolationEnd = false; + + continue; + } + + if (sb[j] == '\"') + { + if (isVerbatim) + { + if (sb[j + 1] != '\"') + { + if (!isInterpolated || isInterpolated && interpolationEnd == true) + { + removeRanges.Add(new Tuple(i, j - i + 1)); + i = j + 1; + break; + } + } + else + j += 1; + } + else + { + bool endOfComment = false; + if (sb[j - 1] != '\\') + endOfComment = true; + else + { + int slashCount = 0; + int k = j - 1; + while (sb[k--] == '\\') + slashCount++; + if (slashCount % 2 == 0) + endOfComment = true; + } + + if (!isInterpolated && endOfComment || (isInterpolated && interpolationEnd && endOfComment)) + { + removeRanges.Add(new Tuple(i, j - i + 1)); + i = j + 1; + break; + } + } + } + } + } + // Region code + else if (IsRegion(i)) + { + i += "#region".Length; + for (int j = i; j < sb.Length; j++) + { + _token.ThrowIfCancellationRequested(); + if (sb[j] == '\n') + { + removeRanges.Add(new Tuple(i, j - i + 1)); + i = j; + break; + } + } + } + } + + for (int i = removeRanges.Count - 1; i >= 0; i--) + sb = sb.Remove(removeRanges[i].Item1, removeRanges[i].Item2); + + return sb; + } + + private IList ScanForTypes(string script) + { + var typeList = new SortedList(); + BlockInfo currentActiveBlock = new BlockInfo(); + + int i = 0; + + BlockInfo nextNamespace = null; + BlockInfo nextClass = null; + BlockInfo nextStruct = null; + BlockInfo nextInterface = null; + BlockInfo nextEnum = null; + + while (i < script.Length) + { + _token.ThrowIfCancellationRequested(); + if (nextNamespace == null) + nextNamespace = FindNextTypeBlock(script, i, TypeName.Namespace); + if (nextClass == null) + nextClass = FindNextTypeBlock(script, i, TypeName.Class); + if (nextStruct == null) + nextStruct = FindNextTypeBlock(script, i, TypeName.Struct); + if (nextInterface == null) + nextInterface = FindNextTypeBlock(script, i, TypeName.Interface); + if (nextEnum == null) + nextEnum = FindNextTypeBlock(script, i, TypeName.Enum); + + var nextIdentationIncrease = FindNextTypeBlock(script, i, TypeName.IdentationStart); + var nextIdentationDecrease = FindNextTypeBlock(script, i, TypeName.IdentationEnd); + + if (!TryFindClosestBlock(out var closestBlock, nextNamespace, nextClass, + nextStruct, nextInterface, nextEnum, nextIdentationIncrease, nextIdentationDecrease)) + break; + + switch (closestBlock) + { + case var _ when closestBlock == nextIdentationIncrease: + closestBlock.ParentBlock = currentActiveBlock; + currentActiveBlock = closestBlock; + break; + case var _ when closestBlock == nextIdentationDecrease: + if (currentActiveBlock.TypeName != TypeName.Undefined) + typeList.Add(currentActiveBlock.StartIndex, currentActiveBlock); + currentActiveBlock = currentActiveBlock.ParentBlock; + break; + case var _ when closestBlock == nextNamespace: + closestBlock.Namespace = currentActiveBlock.TypeName == TypeName.Namespace ? currentActiveBlock.FullName : currentActiveBlock.Namespace; + closestBlock.FullName = string.IsNullOrEmpty(currentActiveBlock.FullName) ? closestBlock.Name : $"{currentActiveBlock.FullName}.{closestBlock.Name}"; + closestBlock.ParentBlock = currentActiveBlock; + currentActiveBlock = closestBlock; + nextNamespace = null; + break; + case var _ when closestBlock == nextClass: + case var _ when closestBlock == nextStruct: + case var _ when closestBlock == nextInterface: + case var _ when closestBlock == nextEnum: + closestBlock.FullName = string.IsNullOrEmpty(currentActiveBlock.FullName) ? closestBlock.Name : $"{currentActiveBlock.FullName}.{closestBlock.Name}"; + closestBlock.Namespace = currentActiveBlock.TypeName == TypeName.Namespace ? currentActiveBlock.FullName : currentActiveBlock.Namespace; + closestBlock.ParentBlock = currentActiveBlock; + currentActiveBlock = closestBlock; + switch (closestBlock) + { + case var _ when closestBlock == nextClass: + nextClass = null; + break; + case var _ when closestBlock == nextStruct: + nextStruct = null; + break; + case var _ when closestBlock == nextInterface: + nextInterface = null; + break; + case var _ when closestBlock == nextEnum: + nextEnum = null; + break; + } + break; + } + + i = closestBlock.StartIndex; + } + + return typeList.Select(x => x.Value).ToList(); + } + + private bool TryFindClosestBlock(out BlockInfo closestBlock, params BlockInfo[] blocks) + { + closestBlock = null; + for (int i = 0; i < blocks.Length; i++) + { + if (blocks[i].FoundIndex == -1) + continue; + + if (closestBlock == null || closestBlock.FoundIndex > blocks[i].FoundIndex) + closestBlock = blocks[i]; + } + + return closestBlock != null; + } + + private BlockInfo FindNextTypeBlock(string text, int startIndex, TypeName blockType) + { + string typeKeyword; + switch (blockType) + { + case TypeName.Namespace: + typeKeyword = "namespace"; + break; + case TypeName.Class: + typeKeyword = "class"; + break; + case TypeName.Struct: + typeKeyword = "struct"; + break; + case TypeName.Interface: + typeKeyword = "interface"; + break; + case TypeName.Enum: + typeKeyword = "enum"; + break; + case TypeName.IdentationStart: + var identationStart = text.IndexOf("{", startIndex); + return new BlockInfo() { FoundIndex = identationStart, StartIndex = identationStart + 1, TypeName = TypeName.Undefined }; + case TypeName.IdentationEnd: + var identationEnd = text.IndexOf("}", startIndex); + return new BlockInfo() { FoundIndex = identationEnd, StartIndex = identationEnd + 1, TypeName = TypeName.Undefined }; + default: + throw new ArgumentException("Invalid block type provided"); + } + + int start = -1; + int blockStart = -1; + string name = string.Empty; + while (startIndex < text.Length) + { + _token.ThrowIfCancellationRequested(); + start = text.IndexOf($" {typeKeyword} ", startIndex); + if (start == -1) + return new BlockInfo { FoundIndex = -1 }; + + // Check if the caught type keyword matches the type definition + var openingBracket = text.IndexOf("{", start); + if (openingBracket == -1) + return new BlockInfo { FoundIndex = -1 }; + + var declaration = text.Substring(start, openingBracket - start); + var split = declaration.Split(' '); + + // Namespace detection + if (typeKeyword == "namespace") + { + // Expected result: [null] [namespace] [null] + if (split.Length == 4) + { + name = split[2]; + blockStart = openingBracket + 1; + break; + } + else + startIndex = openingBracket + 1; + } + // Class, Interface, Struct, Enum detection + else + { + // Expected result: [null] [keywordName] [typeName] ... [null] + // Skip any keywords that only contains [null] [keywordName] [null] + if (split.Length != 3) + { + name = split[2]; + blockStart = openingBracket + 1; + break; + } + else + startIndex = openingBracket + 1; + } + } + + var info = new BlockInfo() { FoundIndex = start, StartIndex = blockStart, Name = name, TypeName = blockType }; + return info; + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs.meta new file mode 100644 index 00000000..d89e8d7c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9db4298044e2add44bc3aa6ba898d7c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/Validation/ScriptUtilityService.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs new file mode 100644 index 00000000..0407f8ff --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs @@ -0,0 +1,24 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.Services.Validation; + +namespace AssetStoreTools.Validator.Services +{ + internal class ValidatorServiceProvider : ServiceProvider + { + public static ValidatorServiceProvider Instance => _instance ?? (_instance = new ValidatorServiceProvider()); + private static ValidatorServiceProvider _instance; + + private ValidatorServiceProvider() { } + + protected override void RegisterServices() + { + Register(); + Register(); + Register(); + Register(); + Register(); + Register(); + Register(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs.meta new file mode 100644 index 00000000..888d94f7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 47ac495c61171824abb2b72b1b7ef676 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Services/ValidatorServiceProvider.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions.meta new file mode 100644 index 00000000..7b3ebc2b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 462cf5f916fad974a831f6a44aadcc82 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs new file mode 100644 index 00000000..fa49d8c5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs @@ -0,0 +1,121 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestDefinitions +{ + internal class AutomatedTest : ValidationTest + { + public AutomatedTest(ValidationTestScriptableObject source) : base(source) { } + + public override void Run(ITestConfig config) + { + Type testClass = null; + MethodInfo testMethod = null; + + try + { + ValidateTestMethod(ref testClass, ref testMethod); + ValidateConfig(config); + } + catch (Exception e) + { + Debug.LogError(e.Message); + return; + } + + object testClassInstance; + try + { + testClassInstance = CreateInstance(testClass, config); + } + catch (Exception e) + { + Debug.LogError($"Could not create an instance of class {testClass}:\n{e}"); + return; + } + + try + { + Result = (TestResult)testMethod.Invoke(testClassInstance, new object[0]); + } + catch (Exception e) + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + result.AddMessage("An exception was caught when running this test case. See Console for more details"); + Debug.LogError($"An exception was caught when running validation for test case '{Title}'\n{e}"); + Result = result; + } + } + + private void ValidateTestMethod(ref Type testClass, ref MethodInfo testMethod) + { + if (TestScript == null || (testClass = TestScript.GetClass()) == null) + throw new Exception($"Cannot run test {Title} - Test Script class was not found"); + + var interfaces = testClass.GetInterfaces(); + if (!interfaces.Contains(typeof(ITestScript))) + throw new Exception($"Cannot run test {Title} - Test Script class is not derived from {nameof(ITestScript)}"); + + testMethod = testClass.GetMethod("Run"); + if (testMethod == null) + throw new Exception($"Cannot run test {Title} - Run() method was not found"); + } + + private void ValidateConfig(ITestConfig config) + { + switch (ValidationType) + { + case ValidationType.Generic: + case ValidationType.UnityPackage: + if (config is GenericTestConfig) + return; + break; + default: + throw new NotImplementedException("Undefined validation type"); + } + + throw new Exception("Config does not match the validation type"); + } + + private object CreateInstance(Type testClass, ITestConfig testConfig) + { + var constructors = testClass.GetConstructors(); + if (constructors.Length != 1) + throw new Exception($"Test class {testClass} should only contain a single constructor"); + + var constructor = constructors[0]; + var expectedParameters = constructor.GetParameters(); + var parametersToUse = new List(); + foreach (var expectedParam in expectedParameters) + { + var paramType = expectedParam.ParameterType; + + if (paramType == testConfig.GetType()) + { + parametersToUse.Add(testConfig); + continue; + } + + if (typeof(IValidatorService).IsAssignableFrom(paramType)) + { + var matchingService = ValidatorServiceProvider.Instance.GetService(paramType); + if (matchingService == null) + throw new Exception($"Service {paramType} is not registered and could not be retrieved"); + + parametersToUse.Add(matchingService); + continue; + } + + throw new Exception($"Invalid parameter type: {paramType}"); + } + + var instance = constructor.Invoke(parametersToUse.ToArray()); + return instance; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs.meta new file mode 100644 index 00000000..c3fca08a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b284048af6fef0d49b8c3a37f7083d04 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/AutomatedTest.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs new file mode 100644 index 00000000..22dfedfd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs @@ -0,0 +1,7 @@ +namespace AssetStoreTools.Validator.TestDefinitions +{ + internal class GenericTestConfig : ITestConfig + { + public string[] ValidationPaths { get; set; } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs.meta new file mode 100644 index 00000000..00f3efac --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ba1ae4e7b45a6c84ca8ad0eb391bf95d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/GenericTestConfig.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs new file mode 100644 index 00000000..5db2e328 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs @@ -0,0 +1,4 @@ +namespace AssetStoreTools.Validator.TestDefinitions +{ + internal interface ITestConfig { } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs.meta new file mode 100644 index 00000000..9bfe992d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c7e57766d04022c4dac58caf8ebe339a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestConfig.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs new file mode 100644 index 00000000..e705ab8b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs @@ -0,0 +1,9 @@ +using AssetStoreTools.Validator.Data; + +namespace AssetStoreTools.Validator.TestDefinitions +{ + internal interface ITestScript + { + TestResult Run(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs.meta new file mode 100644 index 00000000..e2246b18 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 839ef1f3e773ab347b66932d3f810aec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ITestScript.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects.meta new file mode 100644 index 00000000..1dfe2af7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d62652f91f698904ea662c6ab252ea59 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/AutomatedTestScriptableObject.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/AutomatedTestScriptableObject.cs new file mode 100644 index 00000000..31e64989 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/AutomatedTestScriptableObject.cs @@ -0,0 +1,11 @@ +#if UNITY_ASTOOLS_DEVELOPMENT +using UnityEngine; +#endif + +namespace AssetStoreTools.Validator.TestDefinitions +{ +#if UNITY_ASTOOLS_DEVELOPMENT + [CreateAssetMenu(fileName = "AutomatedTest", menuName = "Asset Store Validator/Automated Test")] +#endif + internal class AutomatedTestScriptableObject : ValidationTestScriptableObject { } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/AutomatedTestScriptableObject.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/AutomatedTestScriptableObject.cs.meta new file mode 100644 index 00000000..bd737f4d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/AutomatedTestScriptableObject.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: d813ff809ae82f643bf975031305d541 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable + Objects/AutomatedTestScriptableObject.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor.meta new file mode 100644 index 00000000..eebb8673 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cd52466a2239344d90c3043b7afc1e4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor/ValidationTestScriptableObjectInspector.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor/ValidationTestScriptableObjectInspector.cs new file mode 100644 index 00000000..5b283899 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor/ValidationTestScriptableObjectInspector.cs @@ -0,0 +1,196 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Utility; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestDefinitions +{ + [CustomEditor(typeof(ValidationTestScriptableObject), true)] + internal class ValidationTestScriptableObjectInspector : UnityEditor.Editor + { + private enum FilterSeverity + { + Warning, + Fail + } + + private enum FilterType + { + UseFilter, + ExcludeFilter + } + + private ValidationTestScriptableObject _data; + private ValidationTestScriptableObject[] _allObjects; + + private SerializedProperty _script; + private SerializedProperty _validationType; + + private SerializedProperty _testScript; + private SerializedProperty _category; + private SerializedProperty _failFilterProperty; + private SerializedProperty _isInclusiveProperty; + private SerializedProperty _appliesToSubCategories; + private SerializedProperty _categoryFilter; + + private bool _hadChanges; + + private void OnEnable() + { + if (target == null) return; + + _data = target as ValidationTestScriptableObject; + + _script = serializedObject.FindProperty("m_Script"); + + _validationType = serializedObject.FindProperty(nameof(ValidationTestScriptableObject.ValidationType)); + + _testScript = serializedObject.FindProperty(nameof(ValidationTestScriptableObject.TestScript)); + _category = serializedObject.FindProperty(nameof(ValidationTestScriptableObject.CategoryInfo)); + _failFilterProperty = _category.FindPropertyRelative(nameof(ValidationTestScriptableObject.CategoryInfo.IsFailFilter)); + _isInclusiveProperty = _category.FindPropertyRelative(nameof(ValidationTestScriptableObject.CategoryInfo.IsInclusiveFilter)); + _appliesToSubCategories = _category.FindPropertyRelative(nameof(ValidationTestScriptableObject.CategoryInfo.AppliesToSubCategories)); + _categoryFilter = _category.FindPropertyRelative(nameof(ValidationTestScriptableObject.CategoryInfo.Filter)); + + _allObjects = ValidatorUtility.GetAutomatedTestCases(ValidatorUtility.SortType.Id); + _hadChanges = false; + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + + EditorGUILayout.LabelField(GetInspectorTitle(), new GUIStyle(EditorStyles.centeredGreyMiniLabel) { fontSize = 24 }, GUILayout.MinHeight(50)); + + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.PropertyField(_script); + + EditorGUI.BeginChangeCheck(); + // ID field + EditorGUILayout.IntField("Test Id", _data.Id); + if (!ValidateID()) + EditorGUILayout.HelpBox("ID is already in use", MessageType.Warning); + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.Space(8); + EditorGUILayout.LabelField("Test Data", new GUIStyle(EditorStyles.centeredGreyMiniLabel) { alignment = TextAnchor.MiddleLeft, fontSize = 14, padding = new RectOffset(0, 0, 0, 0) }); + + // Validation Type + var validationType = (ValidationType)EditorGUILayout.EnumPopup("Validation Type", (ValidationType)_validationType.enumValueIndex); + _validationType.enumValueIndex = (int)validationType; + + // Other fields + _data.Title = EditorGUILayout.TextField("Title", _data.Title); + if (string.IsNullOrEmpty(_data.Title)) + EditorGUILayout.HelpBox("Title cannot be empty", MessageType.Warning); + + EditorGUILayout.LabelField("Description"); + GUIStyle myTextAreaStyle = new GUIStyle(EditorStyles.textArea) { wordWrap = true }; + _data.Description = EditorGUILayout.TextArea(_data.Description, myTextAreaStyle); + + // Test script + EditorGUILayout.Space(8); + EditorGUILayout.LabelField("Test Script", new GUIStyle(EditorStyles.centeredGreyMiniLabel) { alignment = TextAnchor.MiddleLeft, fontSize = 14, padding = new RectOffset(0, 0, 0, 0) }); + + EditorGUILayout.PropertyField(_testScript); + if (_testScript.objectReferenceValue != null) + { + var generatedScriptType = (_testScript.objectReferenceValue as MonoScript).GetClass(); + if (generatedScriptType == null || !generatedScriptType.GetInterfaces().Contains(typeof(ITestScript))) + EditorGUILayout.HelpBox($"Test Script does not derive from {nameof(ITestScript)}. Test execution will fail", MessageType.Warning); + } + else if (!string.IsNullOrEmpty(_data.Title)) + { + var generatedScriptName = GenerateTestScriptName(); + EditorGUILayout.LabelField($"Proposed script name: {generatedScriptName}.cs", new GUIStyle("Label") { richText = true }); + EditorGUILayout.Space(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Generate Test Method Script", GUILayout.MaxWidth(200f))) + { + var generatedScript = ValidatorUtility.GenerateTestScript(generatedScriptName, (ValidationType)_validationType.enumValueIndex); + _testScript.objectReferenceValue = generatedScript; + } + EditorGUILayout.EndHorizontal(); + } + + // Variable Sevetity Options + EditorGUILayout.Space(8); + EditorGUILayout.LabelField("Variable Severity Status Filtering", new GUIStyle(EditorStyles.centeredGreyMiniLabel) { alignment = TextAnchor.MiddleLeft, fontSize = 14, padding = new RectOffset(0, 0, 0, 0) }); + + var filterSeverity = (FilterSeverity)EditorGUILayout.EnumPopup("Fail Type", _failFilterProperty.boolValue ? FilterSeverity.Fail : FilterSeverity.Warning); + _failFilterProperty.boolValue = filterSeverity == FilterSeverity.Fail ? true : false; + var filterType = (FilterType)EditorGUILayout.EnumPopup("Filtering rule", _isInclusiveProperty.boolValue ? FilterType.UseFilter : FilterType.ExcludeFilter); + _isInclusiveProperty.boolValue = filterType == FilterType.UseFilter ? true : false; + + EditorGUILayout.PropertyField(_appliesToSubCategories); + + EditorGUILayout.Space(10); + + EditorGUILayout.BeginHorizontal(GUI.skin.FindStyle("HelpBox")); + EditorGUILayout.LabelField(GetFilterDescription(_failFilterProperty.boolValue, _isInclusiveProperty.boolValue), new GUIStyle(GUI.skin.label) { wordWrap = true, richText = true }); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(10); + + EditorGUILayout.PropertyField(_categoryFilter); + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(target); + _hadChanges = true; + } + + _hadChanges = serializedObject.ApplyModifiedProperties() || _hadChanges; + } + + private string GetInspectorTitle() + { + switch (_data) + { + case AutomatedTestScriptableObject _: + return "Automated Test"; + default: + return "Miscellaneous Test"; + } + } + + private string GenerateTestScriptName() + { + var name = _data.Title.Replace(" ", ""); + return name; + } + + private string GetFilterDescription(bool isFailFilter, bool isInclusive) + { + string text = $"When a {TestResultStatus.VariableSeverityIssue} result type is returned from the test method:\n\n"; + if (isFailFilter) + { + if (isInclusive) + return text + "• Categories IN the filter will result in a FAIL.\n• Categories NOT in the filter will result in a WARNING"; + else + return text + "• Categories NOT in the filter will result in a FAIL.\n• Categories IN the filter will result in a WARNING"; + } + else + { + if (isInclusive) + return text + "• Categories IN the filter will result in a WARNING.\n• Categories NOT in the filter will result in a FAIL"; + else + return text + "• Categories NOT in the filter will result in a WARNING.\n• Categories IN the filter will result in a FAIL"; + } + } + + private bool ValidateID() + { + return !_allObjects.Any(x => x.Id == _data.Id && x != _data); + } + + private void OnDisable() + { + if (!_hadChanges) return; + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor/ValidationTestScriptableObjectInspector.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor/ValidationTestScriptableObjectInspector.cs.meta new file mode 100644 index 00000000..ad96ec9d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/Editor/ValidationTestScriptableObjectInspector.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 06d76b0e6df91eb43ac956f883c4a2da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable + Objects/Editor/ValidationTestScriptableObjectInspector.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/ValidationTestScriptableObject.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/ValidationTestScriptableObject.cs new file mode 100644 index 00000000..9c2a29f9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/ValidationTestScriptableObject.cs @@ -0,0 +1,35 @@ +using AssetStoreTools.Validator.Categories; +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Utility; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestDefinitions +{ + internal abstract class ValidationTestScriptableObject : ScriptableObject + { + [SerializeField, HideInInspector] + private bool HasBeenInitialized; + + public int Id; + public string Title; + public string Description; + public ValidatorCategory CategoryInfo; + public ValidationType ValidationType; + public MonoScript TestScript; + + private void OnEnable() + { + // To do: maybe replace with Custom Inspector + if (HasBeenInitialized) + return; + + var existingTestCases = ValidatorUtility.GetAutomatedTestCases(ValidatorUtility.SortType.Id); + if (existingTestCases.Length > 0) + Id = existingTestCases[existingTestCases.Length - 1].Id + 1; + else + Id = 1; + HasBeenInitialized = true; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/ValidationTestScriptableObject.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/ValidationTestScriptableObject.cs.meta new file mode 100644 index 00000000..943d5d8e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable Objects/ValidationTestScriptableObject.cs.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 11c2422f057b75a458e184d169a00eb6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/Scriptable + Objects/ValidationTestScriptableObject.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs new file mode 100644 index 00000000..abb77f69 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Categories; +using AssetStoreTools.Validator.Data; +using UnityEditor; + +namespace AssetStoreTools.Validator.TestDefinitions +{ + internal abstract class ValidationTest + { + public int Id; + public string Title; + public string Description; + public MonoScript TestScript; + + public ValidationType ValidationType; + public ValidatorCategory CategoryInfo; + + public TestResult Result; + + protected ValidationTest(ValidationTestScriptableObject source) + { + Id = source.Id; + Title = source.Title; + Description = source.Description; + TestScript = source.TestScript; + CategoryInfo = source.CategoryInfo; + ValidationType = source.ValidationType; + Result = new TestResult(); + } + + public abstract void Run(ITestConfig config); + + public string Slugify(string value) + { + string newValue = value.Replace(' ', '-').ToLower(); + return newValue; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs.meta new file mode 100644 index 00000000..a5cadef5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 095d629656748914bb6202598876fdf4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Definitions/ValidationTest.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods.meta new file mode 100644 index 00000000..5a3363e9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: daedaf78228b5184297e7ca334ea2a12 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic.meta new file mode 100644 index 00000000..a9b691ed --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ecfb23f95f16d2347a4063411aad8063 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs new file mode 100644 index 00000000..e7543b04 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs @@ -0,0 +1,64 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckAnimationClips : ITestScript + { + private static readonly string[] InvalidNames = new[] { "Take 001" }; + + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckAnimationClips(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + var badModels = new Dictionary>(); + var models = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Model); + + foreach (var model in models) + { + var badClips = new List(); + var clips = AssetDatabase.LoadAllAssetsAtPath(_assetUtility.ObjectToAssetPath(model)); + foreach (var clip in clips) + { + if (InvalidNames.Any(x => x.ToLower().Equals(clip.name.ToLower()))) + { + badClips.Add(clip); + } + } + + if (badClips.Count > 0) + badModels.Add(model, badClips); + } + + if (badModels.Count > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following models have animation clips with invalid names. Animation clip names should be unique and reflective of the animation itself"); + foreach (var kvp in badModels) + { + result.AddMessage(_assetUtility.ObjectToAssetPath(kvp.Key), null, kvp.Value.ToArray()); + } + } + else + { + result.AddMessage("No animation clips with invalid names were found!"); + result.Status = TestResultStatus.Pass; + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs.meta new file mode 100644 index 00000000..3e273b61 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7a28985886f182c4bacc89a44777c742 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAnimationClips.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs new file mode 100644 index 00000000..6f960e92 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs @@ -0,0 +1,128 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckAudioClipping : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckAudioClipping(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + // How many peaks above threshold are required for Audio Clips to be considered clipping + const int TOLERANCE = 2; + // Min. amount of consecutive samples above threshold required for peak detection + const int PEAK_STEPS = 1; + // Clipping threshold. More lenient here than Submission Guidelines (-0.3db) due to the problematic nature of + // correctly determining how sensitive the audio clipping flagging should be, as well as to account for any + // distortion introduced when AudioClips are compresssed after importing to Unity. + const float THRESHOLD = -0.05f; + // Samples for 16-bit audio files + const float S16b = 32767f; + float clippingThreshold = (S16b - (S16b / (2 * Mathf.Log10(1 / S16b)) * THRESHOLD)) / S16b; + TestResult result = new TestResult(); + var clippingAudioClips = new Dictionary(); + + var losslessAudioClips = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.NonLossyAudio).Select(x => x as AudioClip).ToList(); + foreach (var clip in losslessAudioClips) + { + var path = AssetDatabase.GetAssetPath(clip.GetInstanceID()); + + if (IsClipping(clip, TOLERANCE, PEAK_STEPS, clippingThreshold)) + clippingAudioClips.Add(clip, path); + } + + var lossyAudioClips = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.LossyAudio).Select(x => x as AudioClip).ToList(); + foreach (var clip in lossyAudioClips) + { + var path = AssetDatabase.GetAssetPath(clip.GetInstanceID()); + + if (IsClipping(clip, TOLERANCE, PEAK_STEPS, clippingThreshold)) + clippingAudioClips.Add(clip, path); + } + + if (clippingAudioClips.Count > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following AudioClips are clipping or are very close to 0db ceiling. Please ensure your exported audio files have at least 0.3db of headroom (should peak at no more than -0.3db):", null, clippingAudioClips.Select(x => x.Key).ToArray()); + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No clipping audio files were detected."); + } + + return result; + } + + private bool IsClipping(AudioClip clip, int tolerance, int peakTolerance, float clippingThreshold) + { + if (DetectNumPeaksAboveThreshold(clip, peakTolerance, clippingThreshold) >= tolerance) + return true; + + return false; + } + + private int DetectNumPeaksAboveThreshold(AudioClip clip, int peakTolerance, float clippingThreshold) + { + float[] samples = new float[clip.samples * clip.channels]; + var data = clip.GetData(samples, 0); + + float[] samplesLeft = samples.Where((s, i) => i % 2 == 0).ToArray(); + float[] samplesRight = samples.Where((s, i) => i % 2 == 1).ToArray(); + + int peaks = 0; + + peaks = GetPeaksInChannel(samplesLeft, peakTolerance, clippingThreshold) + + GetPeaksInChannel(samplesRight, peakTolerance, clippingThreshold); + + return peaks; + } + + private int GetPeaksInChannel(float[] samples, int peakTolerance, float clippingThreshold) + { + int peaks = 0; + bool evalPeak = false; + int peakSteps = 0; + int step = 0; + + while (step < samples.Length) + { + if (Mathf.Abs(samples[step]) >= clippingThreshold && evalPeak) + { + peakSteps++; + } + + if (Mathf.Abs(samples[step]) >= clippingThreshold && !evalPeak) + { + evalPeak = true; + peakSteps++; + } + + if (Mathf.Abs(samples[step]) < clippingThreshold && evalPeak) + { + evalPeak = false; + if (peakSteps >= peakTolerance) + peaks++; + peakSteps = 0; + } + + step++; + } + + return peaks; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs.meta new file mode 100644 index 00000000..3d306388 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f604db0353da0cb46bb048f5cd37186f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckAudioClipping.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs new file mode 100644 index 00000000..5f4499b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs @@ -0,0 +1,55 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckColliders : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IMeshUtilityService _meshUtility; + + public CheckColliders(GenericTestConfig config, IAssetUtilityService assetUtility, IMeshUtilityService meshUtility) + { + _config = config; + _assetUtility = assetUtility; + _meshUtility = meshUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var prefabs = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Prefab); + var badPrefabs = new List(); + + foreach (var p in prefabs) + { + var meshes = _meshUtility.GetCustomMeshesInObject(p); + + if (!p.isStatic || !meshes.Any()) + continue; + + var colliders = p.GetComponentsInChildren(true); + if (!colliders.Any()) + badPrefabs.Add(p); + } + + if (badPrefabs.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All found prefabs have colliders!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following prefabs contain meshes, but colliders were not found", null, badPrefabs.ToArray()); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs.meta new file mode 100644 index 00000000..f5f4edf4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 308b3d7b7a883b949a14f47cfd5c7ebe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckColliders.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs new file mode 100644 index 00000000..330c0175 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs @@ -0,0 +1,121 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckCompressedFiles : ITestScript + { + private enum ArchiveResult + { + Allowed, + NotAllowed, + TarGzWithIssues, + ZipWithIssues + } + + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IFileSignatureUtilityService _fileSignatureUtility; + + public CheckCompressedFiles(GenericTestConfig config, IAssetUtilityService assetUtility, IFileSignatureUtilityService fileSignatureUtility) + { + _config = config; + _assetUtility = assetUtility; + _fileSignatureUtility = fileSignatureUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var checkedArchives = new Dictionary(); + + // Retrieving assets via GetObjectsFromAssets() is insufficient because + // archives might be renamed and not use the expected extension + var allAssetPaths = _assetUtility.GetAssetPathsFromAssets(_config.ValidationPaths, AssetType.All); + + foreach (var assetPath in allAssetPaths) + { + ArchiveType archiveType; + if ((archiveType = _fileSignatureUtility.GetArchiveType(assetPath)) == ArchiveType.None) + continue; + + var archiveObj = _assetUtility.AssetPathToObject(assetPath); + + switch (archiveType) + { + case ArchiveType.TarGz: + if (assetPath.ToLower().EndsWith(".unitypackage")) + checkedArchives.Add(archiveObj, ArchiveResult.Allowed); + else + checkedArchives.Add(archiveObj, ArchiveResult.TarGzWithIssues); + break; + case ArchiveType.Zip: + if (FileNameContainsKeyword(assetPath, "source") && assetPath.ToLower().EndsWith(".zip")) + checkedArchives.Add(archiveObj, ArchiveResult.Allowed); + else + checkedArchives.Add(archiveObj, ArchiveResult.ZipWithIssues); + break; + default: + checkedArchives.Add(archiveObj, ArchiveResult.NotAllowed); + break; + } + } + + if (checkedArchives.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No archives were found in the package content!"); + return result; + } + + if (checkedArchives.Any(x => x.Value == ArchiveResult.Allowed)) + { + result.Status = TestResultStatus.Warning; + result.AddMessage("The following archives of allowed format were found in the package content.\n" + + "Please make sure they adhere to the nested archive guidelines:", null, + checkedArchives.Where(x => x.Value == ArchiveResult.Allowed).Select(x => x.Key).ToArray()); + } + + if (checkedArchives.Any(x => x.Value == ArchiveResult.TarGzWithIssues)) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following .gz archives were found in the package content.\n" + + " Gz archives are only allowed in form of '.unitypackage' files", null, + checkedArchives.Where(x => x.Value == ArchiveResult.TarGzWithIssues).Select(x => x.Key).ToArray()); + } + + if (checkedArchives.Any(x => x.Value == ArchiveResult.ZipWithIssues)) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following .zip archives were found in the package content.\n" + + " Zip archives should contain the keyword 'source' in the file name", null, + checkedArchives.Where(x => x.Value == ArchiveResult.ZipWithIssues).Select(x => x.Key).ToArray()); + } + + if (checkedArchives.Any(x => x.Value == ArchiveResult.NotAllowed)) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following archives are using formats that are not allowed:", null, + checkedArchives.Where(x => x.Value == ArchiveResult.NotAllowed).Select(x => x.Key).ToArray()); + } + + return result; + } + + private bool FileNameContainsKeyword(string filePath, string keyword) + { + var fileInfo = new FileInfo(filePath); + + if (!fileInfo.Exists) + return false; + + return fileInfo.Name.Remove(fileInfo.Name.Length - fileInfo.Extension.Length).ToLower().Contains(keyword.ToLower()); + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs.meta new file mode 100644 index 00000000..b9c85a69 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 84b23febe0d923842aef73b95da5f25b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckCompressedFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs new file mode 100644 index 00000000..8a87dad8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs @@ -0,0 +1,46 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckEmptyPrefabs : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckEmptyPrefabs(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var prefabs = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Prefab); + var badPrefabs = new List(); + + foreach (var p in prefabs) + { + if (p.GetComponents().Length == 1 && p.transform.childCount == 0) + badPrefabs.Add(p); + } + + if (badPrefabs.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No empty prefabs were found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following prefabs are empty", null, badPrefabs.ToArray()); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs.meta new file mode 100644 index 00000000..3ada9d5a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8055bed9373283e4793463b90b42f08f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckEmptyPrefabs.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs new file mode 100644 index 00000000..3f51144f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs @@ -0,0 +1,153 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckFileMenuNames : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IScriptUtilityService _scriptUtility; + + public CheckFileMenuNames(GenericTestConfig config, IAssetUtilityService assetUtility, IScriptUtilityService scriptUtility) + { + _config = config; + _assetUtility = assetUtility; + _scriptUtility = scriptUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | + BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly; + + #region Scripts + + var scripts = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.MonoScript).ToArray(); + var scriptTypes = _scriptUtility.GetTypesFromScriptAssets(scripts); + var affectedScripts = new Dictionary>(); + + foreach (var kvp in scriptTypes) + { + var badMethods = new List(); + foreach (var type in kvp.Value) + { + foreach (var method in type.GetMethods(bindingFlags)) + { + var attributes = method.GetCustomAttributes().ToList(); + if (attributes.Count == 0) + continue; + + var badAttributes = attributes.Where(x => !IsValidMenuItem(x.menuItem)).ToList(); + if (badAttributes.Count > 0) + badMethods.Add($"{string.Join("\n", badAttributes.Select(x => $"\'{x.menuItem}\'"))}\n(for method '{method.Name}')\n"); + } + } + + if (badMethods.Count > 0) + affectedScripts.Add(kvp.Key, badMethods); + } + + #endregion + + #region Precompiled Assemblies + + var assemblies = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.PrecompiledAssembly).ToArray(); + var assemblyTypes = _scriptUtility.GetTypesFromAssemblies(assemblies); + var affectedAssemblies = new Dictionary>(); + + foreach (var kvp in assemblyTypes) + { + var badMethods = new List(); + foreach (var type in kvp.Value) + { + foreach (var method in type.GetMethods(bindingFlags)) + { + var attributes = method.GetCustomAttributes().ToList(); + if (attributes.Count == 0) + continue; + + var badAttributes = attributes.Where(x => !IsValidMenuItem(x.menuItem)).ToList(); + if (badAttributes.Count > 0) + badMethods.Add($"{string.Join("\n", badAttributes.Select(x => (x as MenuItem).menuItem))}\n(Method '{method.Name}')\n"); + } + } + + if (badMethods.Count > 0) + affectedAssemblies.Add(kvp.Key, badMethods); + } + + #endregion + + if (affectedScripts.Count > 0 || affectedAssemblies.Count > 0) + { + if (affectedScripts.Count > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following scripts contain invalid MenuItem names:"); + foreach (var kvp in affectedScripts) + { + var message = string.Empty; + foreach (var type in kvp.Value) + message += type + "\n"; + + message = message.Remove(message.Length - "\n".Length); + result.AddMessage(message, null, kvp.Key); + } + } + + if (affectedAssemblies.Count > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following assemblies contain invalid MenuItem names:"); + foreach (var kvp in affectedAssemblies) + { + var message = string.Empty; + foreach (var type in kvp.Value) + message += type + "\n"; + + message = message.Remove(message.Length - "\n".Length); + result.AddMessage(message, null, kvp.Key); + } + } + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No MenuItems with invalid names were found!"); + } + + return result; + } + + private bool IsValidMenuItem(string menuItemName) + { + var acceptableMenuItems = new string[] + { + "File", + "Edit", + "Assets", + "GameObject", + "Component", + "Window", + "Help", + "CONTEXT", + "Tools" + }; + + menuItemName = menuItemName.Replace("\\", "/"); + if (acceptableMenuItems.Any(x => menuItemName.ToLower().StartsWith($"{x.ToLower()}/"))) + return true; + + return false; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs.meta new file mode 100644 index 00000000..2e594500 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d8e3b12ecc1fcd74d9a9f8d2b549fc63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckFileMenuNames.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs new file mode 100644 index 00000000..8b8975c5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs @@ -0,0 +1,79 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Data.MessageActions; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckLODs : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckLODs(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var prefabs = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Prefab); + var badPrefabs = new Dictionary>(); + + foreach (var p in prefabs) + { + var meshFilters = p.GetComponentsInChildren(true); + var badMeshFilters = new List(); + var lodGroups = p.GetComponentsInChildren(true); + + foreach (var mf in meshFilters) + { + if (mf.name.Contains("LOD") && !IsPartOfLodGroup(mf, lodGroups)) + badMeshFilters.Add(mf); + } + + if (badMeshFilters.Count > 0) + badPrefabs.Add(p, badMeshFilters); + } + + if (badPrefabs.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All found prefabs are meeting the LOD requirements!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following prefabs do not meet the LOD requirements"); + + foreach (var p in badPrefabs) + { + var resultList = new List(); + resultList.Add(p.Key); + resultList.AddRange(p.Value); + result.AddMessage($"{p.Key.name}.prefab", new OpenAssetAction(p.Key), resultList.ToArray()); + } + + return result; + } + + private bool IsPartOfLodGroup(MeshFilter mf, LODGroup[] lodGroups) + { + foreach (var lodGroup in lodGroups) + { + // If MeshFilter is a child/deep child of a LodGroup AND is referenced in this LOD group - it is valid + if (mf.transform.IsChildOf(lodGroup.transform) && + lodGroup.GetLODs().Any(lod => lod.renderers.Any(renderer => renderer != null && renderer.gameObject == mf.gameObject))) + return true; + } + + return false; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs.meta new file mode 100644 index 00000000..e860a67d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 43b2158602f87704fa7b91561cfc8678 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLODs.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs new file mode 100644 index 00000000..adb381c7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs @@ -0,0 +1,77 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; +using UnityEditor; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckLineEndings : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckLineEndings(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var scripts = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.MonoScript); + + var affectedScripts = new ConcurrentBag(); + var scriptContents = new ConcurrentDictionary(); + + // A separate dictionary is needed because MonoScript contents cannot be accessed outside of the main thread + foreach (var s in scripts) + if (s != null) + scriptContents.TryAdd(s, s.text); + + Parallel.ForEach(scriptContents, (s) => + { + if (HasInconsistentLineEndings(s.Value)) + affectedScripts.Add(s.Key); + }); + + if (affectedScripts.Count > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following scripts have inconsistent line endings:", null, affectedScripts.ToArray()); + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No scripts with inconsistent line endings were found!"); + } + + return result; + } + + private bool HasInconsistentLineEndings(string text) + { + int crlfEndings = 0; + int lfEndings = 0; + + var split = text.Split(new[] { "\n" }, StringSplitOptions.None); + for (int i = 0; i < split.Length; i++) + { + var line = split[i]; + if (line.EndsWith("\r")) + crlfEndings++; + else if (i != split.Length - 1) + lfEndings++; + } + + if (crlfEndings > 0 && lfEndings > 0) + return true; + return false; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs.meta new file mode 100644 index 00000000..13dc5ad4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 85885005d1c594f42826de3555e98365 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckLineEndings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs new file mode 100644 index 00000000..2c378033 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs @@ -0,0 +1,106 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckMeshPrefabs : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IMeshUtilityService _meshUtility; + + public CheckMeshPrefabs(GenericTestConfig config, IAssetUtilityService assetUtility, IMeshUtilityService meshUtility) + { + _config = config; + _assetUtility = assetUtility; + _meshUtility = meshUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var usedModelPaths = new List(); + var prefabs = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Prefab); + var missingMeshReferencePrefabs = new List(); + + // Get all meshes in existing prefabs and check if prefab has missing mesh references + foreach (var p in prefabs) + { + var meshes = _meshUtility.GetCustomMeshesInObject(p); + foreach (var mesh in meshes) + { + string meshPath = _assetUtility.ObjectToAssetPath(mesh); + usedModelPaths.Add(meshPath); + } + + if (HasMissingMeshReferences(p)) + missingMeshReferencePrefabs.Add(p); + } + + // Get all meshes in existing models + var allModelPaths = GetAllModelMeshPaths(_config.ValidationPaths); + + // Get the list of meshes without prefabs + List unusedModels = allModelPaths.Except(usedModelPaths).ToList(); + + if (unusedModels.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All found prefabs have meshes!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + var models = unusedModels.Select(_assetUtility.AssetPathToObject).ToArray(); + result.AddMessage("The following models do not have associated prefabs", null, models); + + if (missingMeshReferencePrefabs.Count > 0) + result.AddMessage("The following prefabs have missing mesh references", null, missingMeshReferencePrefabs.ToArray()); + + return result; + } + + private IEnumerable GetAllModelMeshPaths(string[] validationPaths) + { + var models = _assetUtility.GetObjectsFromAssets(validationPaths, AssetType.Model); + var paths = new List(); + + foreach (var o in models) + { + var m = (GameObject)o; + var modelPath = _assetUtility.ObjectToAssetPath(m); + var assetImporter = _assetUtility.GetAssetImporter(modelPath); + if (assetImporter is UnityEditor.ModelImporter modelImporter) + { + var clips = modelImporter.clipAnimations.Count(); + var meshes = _meshUtility.GetCustomMeshesInObject(m); + + // Only add if the model has meshes and no clips + if (meshes.Any() && clips == 0) + paths.Add(modelPath); + } + } + + return paths; + } + + private bool HasMissingMeshReferences(GameObject go) + { + var meshes = go.GetComponentsInChildren(true); + var skinnedMeshes = go.GetComponentsInChildren(true); + + if (meshes.Length == 0 && skinnedMeshes.Length == 0) + return false; + + if (meshes.Any(x => x.sharedMesh == null) || skinnedMeshes.Any(x => x.sharedMesh == null)) + return true; + + return false; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs.meta new file mode 100644 index 00000000..ee337cfa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3c3d0d642ac6a6a48aa124a93dae3734 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMeshPrefabs.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs new file mode 100644 index 00000000..089d95ec --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs @@ -0,0 +1,66 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckMissingComponentsinAssets : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckMissingComponentsinAssets(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var assets = GetAllAssetsWithMissingComponents(_config.ValidationPaths); + + if (assets.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No assets have missing components!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following assets contain missing components", null, assets); + + return result; + } + + private GameObject[] GetAllAssetsWithMissingComponents(string[] validationPaths) + { + var missingReferenceAssets = new List(); + var prefabObjects = _assetUtility.GetObjectsFromAssets(validationPaths, AssetType.Prefab); + + foreach (var p in prefabObjects) + { + if (p != null && IsMissingReference(p)) + missingReferenceAssets.Add(p); + } + + return missingReferenceAssets.ToArray(); + } + + private bool IsMissingReference(GameObject asset) + { + var components = asset.GetComponentsInChildren(); + + foreach (var c in components) + { + if (!c) + return true; + } + + return false; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs.meta new file mode 100644 index 00000000..965a2156 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 22d8f814e2363e34ea220736a4042728 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinAssets.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs new file mode 100644 index 00000000..3c0ee061 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs @@ -0,0 +1,93 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Data.MessageActions; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using SceneAsset = UnityEditor.SceneAsset; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckMissingComponentsinScenes : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private ISceneUtilityService _sceneUtility; + + public CheckMissingComponentsinScenes(GenericTestConfig config, IAssetUtilityService assetUtility, ISceneUtilityService sceneUtility) + { + _config = config; + _assetUtility = assetUtility; + _sceneUtility = sceneUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var originalScenePath = _sceneUtility.CurrentScenePath; + + var scenePaths = _assetUtility.GetAssetPathsFromAssets(_config.ValidationPaths, AssetType.Scene); + foreach (var scenePath in scenePaths) + { + var missingComponentGOs = GetMissingComponentGOsInScene(scenePath); + + if (missingComponentGOs.Count == 0) + continue; + + result.Status = TestResultStatus.VariableSeverityIssue; + var message = $"GameObjects with missing components or prefab references found in {scenePath}.\n\nClick this message to open the Scene and see the affected GameObjects:"; + result.AddMessage(message, new OpenAssetAction(_assetUtility.AssetPathToObject(scenePath)), missingComponentGOs.ToArray()); + } + + _sceneUtility.OpenScene(originalScenePath); + + if (result.Status == TestResultStatus.Undefined) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No missing components were found!"); + } + + return result; + } + + private List GetMissingComponentGOsInScene(string path) + { + var missingComponentGOs = new List(); + + var scene = _sceneUtility.OpenScene(path); + + if (!scene.IsValid()) + { + Debug.LogWarning("Unable to get Scene in " + path); + return new List(); + } + + var rootObjects = scene.GetRootGameObjects(); + + foreach (var obj in rootObjects) + { + missingComponentGOs.AddRange(GetMissingComponentGOs(obj)); + } + + return missingComponentGOs; + } + + private List GetMissingComponentGOs(GameObject root) + { + var missingComponentGOs = new List(); + var rootComponents = root.GetComponents(); + + if (UnityEditor.PrefabUtility.GetPrefabInstanceStatus(root) == UnityEditor.PrefabInstanceStatus.MissingAsset || rootComponents.Any(c => !c)) + { + missingComponentGOs.Add(root); + } + + foreach (Transform child in root.transform) + missingComponentGOs.AddRange(GetMissingComponentGOs(child.gameObject)); + + return missingComponentGOs; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs.meta new file mode 100644 index 00000000..93b8efb1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 511e76d0ebcb23d40a7b49dda0e2980f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckMissingComponentsinScenes.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs new file mode 100644 index 00000000..b628aac8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs @@ -0,0 +1,64 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckModelImportLogs : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IModelUtilityService _modelUtility; + + public CheckModelImportLogs(GenericTestConfig config, IAssetUtilityService assetUtility, IModelUtilityService modelUtility) + { + _config = config; + _assetUtility = assetUtility; + _modelUtility = modelUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var models = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Model); + var importLogs = _modelUtility.GetImportLogs(models.ToArray()); + + var warningModels = new List(); + var errorModels = new List(); + + foreach (var kvp in importLogs) + { + if (kvp.Value.Any(x => x.Severity == UnityEngine.LogType.Error)) + errorModels.Add(kvp.Key); + if (kvp.Value.Any(x => x.Severity == UnityEngine.LogType.Warning)) + warningModels.Add(kvp.Key); + } + + if (warningModels.Count > 0 || errorModels.Count > 0) + { + if (warningModels.Count > 0) + { + result.Status = TestResultStatus.Warning; + result.AddMessage("The following models contain import warnings:", null, warningModels.ToArray()); + } + + if (errorModels.Count > 0) + { + result.Status = TestResultStatus.Warning; + result.AddMessage("The following models contain import errors:", null, errorModels.ToArray()); + } + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No issues were detected when importing your models!"); + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs.meta new file mode 100644 index 00000000..a12e3951 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 98f3ec209166855408eaf4abe5bff591 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelImportLogs.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs new file mode 100644 index 00000000..82e9dd08 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs @@ -0,0 +1,71 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckModelOrientation : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IMeshUtilityService _meshUtility; + + public CheckModelOrientation(GenericTestConfig config, IAssetUtilityService assetUtility, IMeshUtilityService meshUtility) + { + _config = config; + _assetUtility = assetUtility; + _meshUtility = meshUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var models = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Model); + var badModels = new List(); + + foreach (var m in models) + { + var meshes = _meshUtility.GetCustomMeshesInObject(m); + var assetImporter = _assetUtility.GetAssetImporter(m); + + if (!(assetImporter is UnityEditor.ModelImporter modelImporter)) + continue; + + var clips = modelImporter.clipAnimations.Length; + + // Only check if the model has meshes and no clips + if (!meshes.Any() || clips != 0) + continue; + + Transform[] transforms = m.GetComponentsInChildren(true); + + foreach (var t in transforms) + { + var hasMeshComponent = t.TryGetComponent(out _) || t.TryGetComponent(out _); + + if (t.localRotation == Quaternion.identity || !hasMeshComponent) + continue; + + badModels.Add(m); + break; + } + } + + if (badModels.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All found models are facing the right way!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following models have incorrect rotation", null, badModels.ToArray()); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs.meta new file mode 100644 index 00000000..27e5a097 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 56cdcdc41a80fbc46b5b2b83ec8d66d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelOrientation.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs new file mode 100644 index 00000000..a434a0cb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs @@ -0,0 +1,58 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckModelTypes : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckModelTypes(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var allowedExtensions = new string[] { ".fbx", ".dae", ".abc", ".obj" }; + // Should retrieve All assets and not models here since ADB will not recognize certain + // types if appropriate software is not installed (e.g. .blend without Blender) + var allAssetPaths = _assetUtility.GetAssetPathsFromAssets(_config.ValidationPaths, AssetType.All); + var badModels = new List(); + + foreach (var assetPath in allAssetPaths) + { + var importer = _assetUtility.GetAssetImporter(assetPath); + if (importer == null || !(importer is ModelImporter)) + continue; + + if (allowedExtensions.Any(x => importer.assetPath.ToLower().EndsWith(x))) + continue; + + badModels.Add(_assetUtility.AssetPathToObject(assetPath)); + } + + if (badModels.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All models are of allowed formats!"); + } + else + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following models are of formats that should not be used for Asset Store packages:", null, badModels.ToArray()); + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs.meta new file mode 100644 index 00000000..b168b6e6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 428b1fb838e6f5a469bbfd26ca3fbfd2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckModelTypes.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs new file mode 100644 index 00000000..d9113511 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs @@ -0,0 +1,94 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckNormalMapTextures : ITestScript + { + public const int TextureCacheLimit = 8; + + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckNormalMapTextures(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var materials = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Material); + var badTextures = new List(); + var badPaths = new List(); + + foreach (var mat in materials) + { + for (int i = 0; i < mat.shader.GetPropertyCount(); i++) + { + if ((mat.shader.GetPropertyFlags(i) & UnityEngine.Rendering.ShaderPropertyFlags.Normal) != 0) + { + var propertyName = mat.shader.GetPropertyName(i); + var assignedTexture = mat.GetTexture(propertyName); + + if (assignedTexture == null) + continue; + + var texturePath = _assetUtility.ObjectToAssetPath(assignedTexture); + var textureImporter = _assetUtility.GetAssetImporter(texturePath) as TextureImporter; + if (textureImporter == null) + continue; + + if (textureImporter.textureType != TextureImporterType.NormalMap && !badTextures.Contains(assignedTexture)) + { + if (badTextures.Count < TextureCacheLimit) + { + badTextures.Add(assignedTexture); + } + else + { + string path = AssetDatabase.GetAssetPath(assignedTexture); + badPaths.Add(path); + } + } + } + } + + EditorUtility.UnloadUnusedAssetsImmediate(); + } + + if (badTextures.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All normal map textures have the correct texture type!"); + } + else if (badPaths.Count != 0) + { + foreach (Texture texture in badTextures) + { + string path = AssetDatabase.GetAssetPath(texture); + badPaths.Add(path); + } + + string paths = string.Join("\n", badPaths); + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following textures are not set to type 'Normal Map'", null); + result.AddMessage(paths); + } + else + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following textures are not set to type 'Normal Map'", null, badTextures.ToArray()); + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs.meta new file mode 100644 index 00000000..8ca6ddbd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d55cea510248f814eb2194c2b53f88d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckNormalMapTextures.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs new file mode 100644 index 00000000..5b9bf466 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs @@ -0,0 +1,295 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckPackageNaming : ITestScript + { + private const string ForbiddenCharacters = "~`!@#$%^&*()-_=+[{]}\\|;:'\",<>?/"; + private readonly string[] PathsToCheckForForbiddenCharacters = new string[] + { + "Assets/", + "Assets/Editor/", + "Assets/Plugins/", + "Assets/Resources/", + "Assets/StreamingAssets/", + "Assets/WebGLTemplates/" + }; + + private class PathCheckResult + { + public Object[] InvalidMainPaths; + public Object[] InvalidMainPathContentPaths; + public Object[] InvalidMainPathLeadingUpPaths; + public Object[] InvalidHybridPackages; + public Object[] PotentiallyInvalidContent; + + public bool HasIssues => InvalidMainPaths.Length > 0 + || InvalidMainPathContentPaths.Length > 0 + || InvalidMainPathLeadingUpPaths.Length > 0 + || InvalidHybridPackages.Length > 0 + || PotentiallyInvalidContent.Length > 0; + } + + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + // Constructor also accepts dependency injection of registered IValidatorService types + public CheckPackageNaming(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var checkResult = GetInvalidPathsInAssets(); + + if (checkResult.HasIssues) + { + result.Status = TestResultStatus.Warning; + + if (checkResult.InvalidMainPaths.Length > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following assets appear to be artificially bumped up in the project hierarchy within commonly used folders", null, checkResult.InvalidMainPaths); + } + + if (checkResult.InvalidMainPathContentPaths.Length > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following assets appear to be artificially bumped up in the project hierarchy within commonly used folders", null, checkResult.InvalidMainPathContentPaths); + } + + if (checkResult.InvalidMainPathLeadingUpPaths.Length > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("Despite not being directly validated, this path would be automatically created by the Unity Importer when importing your package", null, checkResult.InvalidMainPathLeadingUpPaths); + } + + if (checkResult.InvalidHybridPackages.Length > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following packages appear to be artificially bumped up in the Package hierarchy with their 'Display Name' configuration", null, checkResult.InvalidHybridPackages); + } + + if (checkResult.PotentiallyInvalidContent.Length > 0) + { + // Do not override previously set severities + result.AddMessage("It is recommended that nested package content refrains from starting with a special character", null, checkResult.PotentiallyInvalidContent); + } + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All package asset names are valid!"); + } + + return result; + } + + private PathCheckResult GetInvalidPathsInAssets() + { + var allInvalidMainPaths = new List(); + var allInvalidMainContentPaths = new List(); + var allInvalidMainLeadingUpPaths = new List(); + var allInvalidPackagePaths = new List(); + var allInvalidOtherContentPaths = new List(); + + foreach (var validationPath in _config.ValidationPaths) + { + // Is path itself not forbidden e.g.: when validating Assets/_Package, the folder _Package would be invalid + if (!IsDirectMainPathValid(validationPath)) + allInvalidMainPaths.Add(validationPath); + + // Are path contents not forbidden e.g.: when validating Assets/, the folder _Package would be invalid + if (!IsDirectMainPathContentValid(validationPath, out var invalidContentPaths)) + allInvalidMainContentPaths.AddRange(invalidContentPaths); + + // Is the path leading up to this path not forbidden e.g: when validating Assets/_WorkDir/Package, the folder _Workdir would be invalid + if (!IsPathLeadingUpToMainPathValid(validationPath, out var invalidLeadingUpPath)) + allInvalidMainLeadingUpPaths.Add(invalidLeadingUpPath); + + // Is the path pointing to a package valid, e.g.: when validating Packages/com.company.product its display name _Product would be invalid + if (!IsHybridPackageMainPathValid(validationPath, out string invalidPackagePath)) + allInvalidPackagePaths.Add(invalidPackagePath); + } + + var ignoredPaths = new List(); + ignoredPaths.AddRange(allInvalidMainPaths); + ignoredPaths.AddRange(allInvalidMainContentPaths); + ignoredPaths.AddRange(allInvalidMainLeadingUpPaths); + ignoredPaths.AddRange(allInvalidPackagePaths); + + // Mark any other paths that start with a forbidden character + if (!ArePackageContentsValid(ignoredPaths, out var invalidContents)) + allInvalidOtherContentPaths.AddRange(invalidContents); + + return new PathCheckResult() + { + InvalidMainPaths = PathsToObjects(allInvalidMainPaths), + InvalidMainPathContentPaths = PathsToObjects(allInvalidMainContentPaths), + InvalidMainPathLeadingUpPaths = PathsToObjects(allInvalidMainLeadingUpPaths), + InvalidHybridPackages = PathsToObjects(allInvalidPackagePaths), + PotentiallyInvalidContent = PathsToObjects(allInvalidOtherContentPaths) + }; + } + + private bool IsDirectMainPathValid(string validationPath) + { + foreach (var forbiddenPath in PathsToCheckForForbiddenCharacters) + { + var forbiddenPathWithSeparator = forbiddenPath.EndsWith("/") ? forbiddenPath : forbiddenPath + "/"; + if (!validationPath.StartsWith(forbiddenPathWithSeparator)) + continue; + + var truncatedPath = validationPath.Remove(0, forbiddenPathWithSeparator.Length); + var truncatedPathSplit = truncatedPath.Split('/'); + + // It is not a direct main path if it has deeper paths + if (truncatedPathSplit.Length != 1) + continue; + + if (ForbiddenCharacters.Any(x => truncatedPath.StartsWith(x.ToString()))) + return false; + } + + return true; + } + + private bool IsDirectMainPathContentValid(string validationPath, out List invalidContentPaths) + { + invalidContentPaths = new List(); + + var contents = Directory.EnumerateFileSystemEntries(validationPath, "*", SearchOption.AllDirectories) + .Where(x => !x.EndsWith(".meta")) + .Select(GetAdbPath); + + foreach (var contentPath in contents) + { + foreach (var forbiddenPath in PathsToCheckForForbiddenCharacters) + { + var forbiddenPathWithSeparator = forbiddenPath.EndsWith("/") ? forbiddenPath : forbiddenPath + "/"; + if (!contentPath.StartsWith(forbiddenPathWithSeparator)) + continue; + + var truncatedPath = contentPath.Remove(0, forbiddenPathWithSeparator.Length); + var truncatedPathSplit = truncatedPath.Split('/'); + + // Only check the first level of content relative to the forbidden path + if (truncatedPathSplit.Length > 1) + continue; + + if (ForbiddenCharacters.Any(x => truncatedPathSplit[0].StartsWith(x.ToString()))) + invalidContentPaths.Add(contentPath); + } + } + + return invalidContentPaths.Count == 0; + } + + private bool IsPathLeadingUpToMainPathValid(string validationPath, out string invalidLeadingUpPath) + { + invalidLeadingUpPath = string.Empty; + + foreach (var forbiddenPath in PathsToCheckForForbiddenCharacters) + { + var forbiddenPathWithSeparator = forbiddenPath.EndsWith("/") ? forbiddenPath : forbiddenPath + "/"; + if (!validationPath.StartsWith(forbiddenPathWithSeparator)) + continue; + + var truncatedPath = validationPath.Remove(0, forbiddenPathWithSeparator.Length); + var truncatedPathSplit = truncatedPath.Split('/'); + + // It is not a leading up path if it has no deeper path + if (truncatedPathSplit.Length == 1) + continue; + + if (ForbiddenCharacters.Any(x => truncatedPathSplit[0].StartsWith(x.ToString()))) + { + invalidLeadingUpPath = forbiddenPathWithSeparator + truncatedPathSplit[0]; + return false; + } + } + + return true; + } + + private bool IsHybridPackageMainPathValid(string validationPath, out string invalidPackagePath) + { + invalidPackagePath = string.Empty; + + if (!PackageUtility.GetPackageByManifestPath($"{validationPath}/package.json", out var package)) + return true; + + var packageName = package.displayName; + if (ForbiddenCharacters.Any(x => packageName.StartsWith(x.ToString()))) + { + invalidPackagePath = validationPath; + return false; + } + + return true; + } + + private bool ArePackageContentsValid(IEnumerable ignoredPaths, out List invalidContentPaths) + { + invalidContentPaths = new List(); + + foreach (var validationPath in _config.ValidationPaths) + { + var validationPathFolderName = validationPath.Split('/').Last(); + if (!ignoredPaths.Contains(validationPath) && ForbiddenCharacters.Any(x => validationPathFolderName.StartsWith(x.ToString()))) + invalidContentPaths.Add(validationPath); + + var contents = Directory.EnumerateFileSystemEntries(validationPath, "*", SearchOption.AllDirectories) + .Where(x => !x.EndsWith(".meta")) + .Select(GetAdbPath); + + foreach (var contentEntry in contents) + { + if (ignoredPaths.Contains(contentEntry)) + continue; + + var entryName = contentEntry.Split('/').Last(); + if (ForbiddenCharacters.Any(x => entryName.StartsWith(x.ToString()))) + invalidContentPaths.Add(contentEntry); + } + } + + return invalidContentPaths.Count == 0; + } + + private string GetAdbPath(string path) + { + path = path.Replace("\\", "/"); + if (path.StartsWith(Constants.RootProjectPath)) + path = path.Remove(Constants.RootProjectPath.Length); + + return path; + } + + private Object[] PathsToObjects(IEnumerable paths) + { + var objects = new List(); + + foreach (var path in paths) + { + var obj = _assetUtility.AssetPathToObject(path); + if (obj != null) + objects.Add(obj); + } + + return objects.ToArray(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs.meta new file mode 100644 index 00000000..6372a66c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: afe9e04825c7d904981a54404b222290 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPackageNaming.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs new file mode 100644 index 00000000..8e69b105 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs @@ -0,0 +1,76 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Data.MessageActions; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckParticleSystems : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private ISceneUtilityService _sceneUtility; + + public CheckParticleSystems(GenericTestConfig config, IAssetUtilityService assetUtility, ISceneUtilityService sceneUtility) + { + _config = config; + _assetUtility = assetUtility; + _sceneUtility = sceneUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var originalScenePath = _sceneUtility.CurrentScenePath; + + var scenePaths = _assetUtility.GetAssetPathsFromAssets(_config.ValidationPaths, AssetType.Scene); + + foreach (var path in scenePaths) + { + var badParticleSystems = new List(); + + var scene = _sceneUtility.OpenScene(path); + + if (!scene.IsValid()) + { + Debug.LogWarning("Unable to get Scene in " + path); + continue; + } + +#if UNITY_2023_1_OR_NEWER + var particleSystems = GameObject.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); +#else + var particleSystems = GameObject.FindObjectsOfType(); +#endif + + foreach (var ps in particleSystems) + { + if (PrefabUtility.IsPartOfAnyPrefab(ps.gameObject)) + continue; + badParticleSystems.Add(ps); + } + + if (badParticleSystems.Count == 0) + continue; + + result.Status = TestResultStatus.VariableSeverityIssue; + var message = $"Particle Systems not belonging to any Prefab were found in {path}.\n\nClick this message to open the Scene and see the affected Particle Systems:"; + result.AddMessage(message, new OpenAssetAction(AssetDatabase.LoadAssetAtPath(path)), badParticleSystems.ToArray()); + } + + _sceneUtility.OpenScene(originalScenePath); + + if (result.Status == TestResultStatus.Undefined) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No Particle Systems without Prefabs were found!"); + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs.meta new file mode 100644 index 00000000..36bce088 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 6a623f7988c75884bb17b169ccd3e993 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckParticleSystems.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs new file mode 100644 index 00000000..27750c53 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs @@ -0,0 +1,98 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using AssetStoreTools.Validator.Utility; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckPathLengths : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckPathLengths(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + TestResult result = new TestResult(); + + int pathLengthLimit = 140; + // Get all project paths and sort by length so that folders always come before files + var allPaths = ValidatorUtility.GetProjectPaths(_config.ValidationPaths).OrderBy(x => x.Length); + + var filteredDirs = new Dictionary(); + var filteredFiles = new Dictionary(); + + foreach (var path in allPaths) + { + // Truncated path examples: + // Assets/[Scenes/SampleScene.unity] + // Packages/com.example.package/[Editor/EditorScript.cs] + var truncatedPath = path; + if (path.StartsWith("Assets/")) + truncatedPath = path.Remove(0, "Assets/".Length); + else if (path.StartsWith("Packages/")) + { + var splitPath = path.Split('/'); + truncatedPath = string.Join("/", splitPath.Skip(2)); + } + + // Skip paths under the character limit + if (truncatedPath.Length < pathLengthLimit) + continue; + + // Skip children of already added directories + if (filteredDirs.Keys.Any(x => truncatedPath.StartsWith(x))) + continue; + + if (AssetDatabase.IsValidFolder(path)) + { + filteredDirs.Add(truncatedPath, _assetUtility.AssetPathToObject(path)); + continue; + } + + if (!filteredFiles.ContainsKey(truncatedPath)) + filteredFiles.Add(truncatedPath, _assetUtility.AssetPathToObject(path)); + } + + if (filteredDirs.Count == 0 && filteredFiles.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All package content matches the path limit criteria!"); + return result; + } + + if (filteredDirs.Count > 0) + { + var maxDirLength = filteredDirs.Keys.Aggregate("", (max, cur) => max.Length > cur.Length ? max : cur); + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage($"The following folders exceed the path length limit:"); + foreach (var kvp in filteredDirs) + { + result.AddMessage($"Path length: {kvp.Key.Length} characters", null, kvp.Value); + } + } + + if (filteredFiles.Count > 0) + { + var maxFileLength = filteredFiles.Keys.Aggregate("", (max, cur) => max.Length > cur.Length ? max : cur); + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage($"The following files exceed the path length limit:"); + foreach (var kvp in filteredFiles) + { + result.AddMessage($"Path length: {kvp.Key.Length} characters", null, kvp.Value); + } + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs.meta new file mode 100644 index 00000000..8d56a291 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ae379305e9165e84584373a8272c09e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPathLengths.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs new file mode 100644 index 00000000..aa018814 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs @@ -0,0 +1,71 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckPrefabTransforms : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IMeshUtilityService _meshUtility; + + public CheckPrefabTransforms(GenericTestConfig config, IAssetUtilityService assetUtility, IMeshUtilityService meshUtility) + { + _config = config; + _assetUtility = assetUtility; + _meshUtility = meshUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var prefabs = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Prefab); + var badPrefabs = new List(); + var badPrefabsLowOffset = new List(); + + foreach (var p in prefabs) + { + var hasRectTransform = p.TryGetComponent(out RectTransform _); + if (hasRectTransform || !_meshUtility.GetCustomMeshesInObject(p).Any()) + continue; + + var positionString = p.transform.position.ToString("F12"); + var rotationString = p.transform.rotation.eulerAngles.ToString("F12"); + var localScaleString = p.transform.localScale.ToString("F12"); + + var vectorZeroString = Vector3.zero.ToString("F12"); + var vectorOneString = Vector3.one.ToString("F12"); + + if (positionString != vectorZeroString || rotationString != vectorZeroString || localScaleString != vectorOneString) + { + if (p.transform.position == Vector3.zero && p.transform.rotation.eulerAngles == Vector3.zero && p.transform.localScale == Vector3.one) + badPrefabsLowOffset.Add(p); + else + badPrefabs.Add(p); + } + } + + if (badPrefabs.Count == 0 && badPrefabsLowOffset.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All found prefabs were reset!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + if (badPrefabs.Count > 0) + result.AddMessage("The following prefabs' transforms do not fit the requirements", null, badPrefabs.ToArray()); + if (badPrefabsLowOffset.Count > 0) + result.AddMessage("The following prefabs have unusually low transform values, which might not be accurately displayed " + + "in the Inspector window. Please use the 'Debug' Inspector mode to review the Transform component of these prefabs " + + "or reset the Transform components using the right-click context menu", null, badPrefabsLowOffset.ToArray()); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs.meta new file mode 100644 index 00000000..cbffe1ae --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f712c17a60bf2d049a4e61c8f79e56c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckPrefabTransforms.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs new file mode 100644 index 00000000..034f4571 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs @@ -0,0 +1,30 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; +using UnityEditor; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckScriptCompilation : ITestScript + { + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var hasCompilationErrors = EditorUtility.scriptCompilationFailed; + + if (hasCompilationErrors) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("One or more scripts in the project failed to compile.\n" + + "Please check the Console window to see the list of errors"); + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All scripts in the project compiled successfully!"); + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs.meta new file mode 100644 index 00000000..f50df8c6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 59db88f43969db8499299bce7f4fb967 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckScriptCompilation.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs new file mode 100644 index 00000000..a004febd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs @@ -0,0 +1,63 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; +using UnityEditor; +using UnityEngine; +#if !UNITY_2023_1_OR_NEWER +using UnityEngine.Experimental.Rendering; +#endif +#if UNITY_2023_1_OR_NEWER +using UnityEngine.Rendering; +#endif + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckShaderCompilation : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckShaderCompilation(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var shaders = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Shader); + var badShaders = shaders.Where(ShaderHasError).ToArray(); + + if (badShaders.Length > 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following shader files have errors", null, badShaders); + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All found Shaders have no compilation errors!"); + } + + return result; + } + + private bool ShaderHasError(Object obj) + { + switch (obj) + { + case Shader shader: + return ShaderUtil.ShaderHasError(shader); + case ComputeShader shader: + return ShaderUtil.GetComputeShaderMessageCount(shader) > 0; + case RayTracingShader shader: + return ShaderUtil.GetRayTracingShaderMessageCount(shader) > 0; + default: + return false; + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs.meta new file mode 100644 index 00000000..6bd1d2c7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7abb278a6082bde4391e0779394cb85b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckShaderCompilation.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs new file mode 100644 index 00000000..d05c1aed --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs @@ -0,0 +1,57 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckTextureDimensions : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckTextureDimensions(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var textures = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Texture); + var badTextures = new List(); + + foreach (var texture in textures) + { + if (Mathf.IsPowerOfTwo(texture.width) && Mathf.IsPowerOfTwo(texture.height)) + continue; + + var importer = _assetUtility.GetAssetImporter(_assetUtility.ObjectToAssetPath(texture)); + + if (importer == null || !(importer is TextureImporter textureImporter) + || textureImporter.textureType == TextureImporterType.Sprite + || textureImporter.textureType == TextureImporterType.GUI) + continue; + + badTextures.Add(texture); + } + + if (badTextures.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All texture dimensions are a power of 2!"); + } + else + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following texture dimensions are not a power of 2:", null, badTextures.ToArray()); + } + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs.meta new file mode 100644 index 00000000..eb27a1ce --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 073f1dacf3da34d4783140ae9d485d5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTextureDimensions.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs new file mode 100644 index 00000000..35c9d4d1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs @@ -0,0 +1,233 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckTypeNamespaces : ITestScript + { + private readonly string[] ForbiddenNamespaces = new string[] { "Unity" }; + + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private IScriptUtilityService _scriptUtility; + + private enum NamespaceEligibility + { + NoNamespace, + Ok, + Forbidden + } + + private class AnalysisResult + { + public Dictionary> TypesWithoutNamespaces; + public Dictionary> ForbiddenNamespaces; + + public bool HasIssues => TypesWithoutNamespaces.Count > 0 + || ForbiddenNamespaces.Count > 0; + } + + public CheckTypeNamespaces(GenericTestConfig config, IAssetUtilityService assetUtility, IScriptUtilityService scriptUtility) + { + _config = config; + _assetUtility = assetUtility; + _scriptUtility = scriptUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var scriptResult = CheckScripts(); + var assemblyResult = CheckAssemblies(); + + if (scriptResult.HasIssues || assemblyResult.HasIssues) + { + result.Status = TestResultStatus.Warning; + + // Error conditions for forbidden namespaces + + if (scriptResult.ForbiddenNamespaces.Count > 0) + { + result.Status = TestResultStatus.Fail; + result.AddMessage("The following scripts contain namespaces starting with a 'Unity' keyword:"); + AddJoinedMessage(result, scriptResult.ForbiddenNamespaces); + } + + if (assemblyResult.ForbiddenNamespaces.Count > 0) + { + result.Status = TestResultStatus.Fail; + result.AddMessage("The following assemblies contain namespaces starting with a 'Unity' keyword:"); + AddJoinedMessage(result, assemblyResult.ForbiddenNamespaces); + } + + // Variable severity conditions for no-namespace types + + if (scriptResult.TypesWithoutNamespaces.Count > 0) + { + if (result.Status != TestResultStatus.Fail) + result.Status = TestResultStatus.VariableSeverityIssue; + + result.AddMessage("The following scripts contain types not nested under a namespace:"); + AddJoinedMessage(result, scriptResult.TypesWithoutNamespaces); + } + + if (assemblyResult.TypesWithoutNamespaces.Count > 0) + { + if (result.Status != TestResultStatus.Fail) + result.Status = TestResultStatus.VariableSeverityIssue; + + result.AddMessage("The following assemblies contain types not nested under a namespace:"); + AddJoinedMessage(result, assemblyResult.TypesWithoutNamespaces); + } + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("All scripts contain valid namespaces!"); + } + + return result; + } + + private AnalysisResult CheckScripts() + { + var scripts = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.MonoScript).ToArray(); + var scriptNamespaces = _scriptUtility.GetTypeNamespacesFromScriptAssets(scripts); + + var scriptsWithoutNamespaces = new Dictionary>(); + var scriptsWithForbiddenNamespaces = new Dictionary>(); + + foreach (var kvp in scriptNamespaces) + { + var scriptAsset = kvp.Key; + var typesInScriptAsset = kvp.Value; + + var typesWithoutNamespace = new List(); + var discouragedNamespaces = new List(); + var forbiddenNamespaces = new List(); + + foreach (var t in typesInScriptAsset) + { + var eligibility = CheckNamespaceEligibility(t.Namespace); + + switch (eligibility) + { + case NamespaceEligibility.NoNamespace: + typesWithoutNamespace.Add(t.Name); + break; + case NamespaceEligibility.Forbidden: + if (!forbiddenNamespaces.Contains(t.Namespace)) + forbiddenNamespaces.Add(t.Namespace); + break; + case NamespaceEligibility.Ok: + break; + } + } + + if (typesWithoutNamespace.Count > 0) + scriptsWithoutNamespaces.Add(scriptAsset, typesWithoutNamespace); + + if (forbiddenNamespaces.Count > 0) + scriptsWithForbiddenNamespaces.Add(scriptAsset, forbiddenNamespaces); + } + + return new AnalysisResult + { + TypesWithoutNamespaces = scriptsWithoutNamespaces, + ForbiddenNamespaces = scriptsWithForbiddenNamespaces + }; + } + + private AnalysisResult CheckAssemblies() + { + var assemblies = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.PrecompiledAssembly).ToList(); + var assemblyTypes = _scriptUtility.GetTypesFromAssemblies(assemblies); + + var assembliesWithoutNamespaces = new Dictionary>(); + var assembliesWithForbiddenNamespaces = new Dictionary>(); + + foreach (var kvp in assemblyTypes) + { + var assemblyAsset = kvp.Key; + var typesInAssembly = kvp.Value; + + var typesWithoutNamespace = new List(); + var discouragedNamespaces = new List(); + var forbiddenNamespaces = new List(); + + foreach (var t in typesInAssembly) + { + var eligibility = CheckNamespaceEligibility(t.Namespace); + + switch (eligibility) + { + case NamespaceEligibility.NoNamespace: + typesWithoutNamespace.Add($"{GetTypeName(t)} {t.Name}"); + break; + case NamespaceEligibility.Forbidden: + if (!forbiddenNamespaces.Contains(t.Namespace)) + forbiddenNamespaces.Add(t.Namespace); + break; + case NamespaceEligibility.Ok: + break; + } + } + + if (typesWithoutNamespace.Count > 0) + assembliesWithoutNamespaces.Add(assemblyAsset, typesWithoutNamespace); + + if (forbiddenNamespaces.Count > 0) + assembliesWithForbiddenNamespaces.Add(assemblyAsset, forbiddenNamespaces); + } + + return new AnalysisResult + { + TypesWithoutNamespaces = assembliesWithoutNamespaces, + ForbiddenNamespaces = assembliesWithForbiddenNamespaces + }; + } + + private NamespaceEligibility CheckNamespaceEligibility(string fullNamespace) + { + if (string.IsNullOrEmpty(fullNamespace)) + return NamespaceEligibility.NoNamespace; + + var split = fullNamespace.Split('.'); + var topLevelNamespace = split[0]; + if (ForbiddenNamespaces.Any(x => topLevelNamespace.StartsWith(x, StringComparison.OrdinalIgnoreCase))) + return NamespaceEligibility.Forbidden; + + return NamespaceEligibility.Ok; + } + + private string GetTypeName(Type type) + { + if (type.IsClass) + return "class"; + if (type.IsInterface) + return "interface"; + if (type.IsEnum) + return "enum"; + if (type.IsValueType) + return "struct"; + + throw new ArgumentException($"Received an unrecognizable type {type}. Type must be either a class, interface, struct or enum"); + } + + private void AddJoinedMessage(TestResult result, Dictionary> assetsWithMessages) + { + foreach (var kvp in assetsWithMessages) + { + var message = string.Join("\n", kvp.Value); + result.AddMessage(message, null, kvp.Key); + } + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs.meta new file mode 100644 index 00000000..b8a80ea5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 279249fa7ef8c2446b3a9f013eeedbf0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/CheckTypeNamespaces.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs new file mode 100644 index 00000000..71f31bca --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveExecutableFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveExecutableFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var executables = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Executable).ToArray(); + + if (executables.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No executable files were found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following executable files were found", null, executables); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs.meta new file mode 100644 index 00000000..b45d0eec --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8e4450592cc60e54286ad089b66db94d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveExecutableFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs new file mode 100644 index 00000000..3a5a4c7c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveJPGFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveJPGFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var jpgs = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.JPG).ToArray(); + + if (jpgs.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No JPG/JPEG textures were found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following textures are compressed as JPG/JPEG", null, jpgs); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs.meta new file mode 100644 index 00000000..4df41e64 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5634a12b3a8544c4585bbc280ae59ce2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJPGFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs new file mode 100644 index 00000000..69a7681e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveJavaScriptFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveJavaScriptFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var javascriptObjects = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.JavaScript).ToArray(); + + if (javascriptObjects.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No UnityScript / JS files were found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following assets are UnityScript / JS files", null, javascriptObjects); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs.meta new file mode 100644 index 00000000..6153ea48 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: ab1676bde9afba442b35fd3319c18063 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveJavaScriptFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs new file mode 100644 index 00000000..6cdc77ab --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs @@ -0,0 +1,83 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveLossyAudioFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveLossyAudioFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + string SanitizeForComparison(UnityObject o) + { + Regex alphanumericRegex = new Regex("[^a-zA-Z0-9]"); + string path = _assetUtility.ObjectToAssetPath(o); + path = path.ToLower(); + + int extensionIndex = path.LastIndexOf('.'); + string extension = path.Substring(extensionIndex + 1); + string sanitized = path.Substring(0, extensionIndex); + + int separatorIndex = sanitized.LastIndexOf('/'); + sanitized = sanitized.Substring(separatorIndex); + sanitized = alphanumericRegex.Replace(sanitized, String.Empty); + sanitized = sanitized.Replace(extension, String.Empty); + sanitized = sanitized.Trim(); + + return sanitized; + } + + var lossyAudioObjects = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.LossyAudio).ToArray(); + if (lossyAudioObjects.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No lossy audio files were found!"); + return result; + } + + // Try to find and match variants + var nonLossyAudioObjects = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.NonLossyAudio); + HashSet nonLossyPathSet = new HashSet(); + foreach (var asset in nonLossyAudioObjects) + { + var path = SanitizeForComparison(asset); + nonLossyPathSet.Add(path); + } + + var unmatchedAssets = new List(); + foreach (var asset in lossyAudioObjects) + { + var path = SanitizeForComparison(asset); + if (!nonLossyPathSet.Contains(path)) + unmatchedAssets.Add(asset); + } + + if (unmatchedAssets.Count == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No lossy audio files were found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following lossy audio files were found without identically named non-lossy variants:", null, unmatchedAssets.ToArray()); + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs.meta new file mode 100644 index 00000000..55d0d0bc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: b7205a85061273a4eb50586f13f35d35 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveLossyAudioFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs new file mode 100644 index 00000000..17a1cb26 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveMixamoFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveMixamoFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var mixamoFiles = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Mixamo).ToArray(); + + if (mixamoFiles.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No Mixamo files were found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following Mixamo files were found", null, mixamoFiles); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs.meta new file mode 100644 index 00000000..603034c7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 9df432e52aa958b44bb5e20c13d16552 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveMixamoFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs new file mode 100644 index 00000000..feef2306 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveSpeedTreeFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveSpeedTreeFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var speedtreeObjects = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.SpeedTree).ToArray(); + + if (speedtreeObjects.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No SpeedTree assets have been found!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following SpeedTree assets have been found", null, speedtreeObjects); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs.meta new file mode 100644 index 00000000..25f2a23e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: e06bb7e0aa4f9944abc18281c002dff4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveSpeedTreeFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs new file mode 100644 index 00000000..ae0e5ff6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs @@ -0,0 +1,38 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class RemoveVideoFiles : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public RemoveVideoFiles(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var videos = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.Video).ToArray(); + + if (videos.Length == 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No video files were found, looking good!"); + return result; + } + + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("The following video files were found", null, videos); + + return result; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs.meta new file mode 100644 index 00000000..80ca9b89 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f99724c71b0de66419b5d6e8e9bfcc2d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/Generic/RemoveVideoFiles.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage.meta new file mode 100644 index 00000000..b8fde811 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 016d62b2cd8346a49815615efd1d6e39 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs new file mode 100644 index 00000000..6c635c2c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs @@ -0,0 +1,172 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; +using UnityObject = UnityEngine.Object; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckDemoScenes : ITestScript + { + private class DemoSceneScanResult + { + public List ValidAdbScenes; + public List HybridScenePaths; + public List NestedUnityPackages; + } + + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + private ISceneUtilityService _sceneUtility; + + public CheckDemoScenes(GenericTestConfig config, IAssetUtilityService assetUtility, ISceneUtilityService sceneUtility) + { + _config = config; + _assetUtility = assetUtility; + _sceneUtility = sceneUtility; + } + + public TestResult Run() + { + var result = new TestResult(); + var demoSceneScanResult = CheckForDemoScenes(_config); + + // Valid demo scenes were found in ADB + if (demoSceneScanResult.ValidAdbScenes.Count > 0) + { + result.Status = TestResultStatus.Pass; + result.AddMessage("Demo scenes found", null, demoSceneScanResult.ValidAdbScenes.ToArray()); + return result; + } + + // Valid demo scenes found in UPM package.json + if (demoSceneScanResult.HybridScenePaths.Count > 0) + { + result.Status = TestResultStatus.Pass; + + var upmSampleSceneList = string.Join("\n-", demoSceneScanResult.HybridScenePaths); + upmSampleSceneList = upmSampleSceneList.Insert(0, "-"); + + result.AddMessage($"Demo scenes found:\n{upmSampleSceneList}"); + return result; + } + + // No valid scenes found, but package contains nested .unitypackages + if (demoSceneScanResult.NestedUnityPackages.Count > 0) + { + result.Status = TestResultStatus.Warning; + result.AddMessage("Could not find any valid Demo scenes in the selected validation paths."); + result.AddMessage("The following nested .unitypackage files were found. " + + "If they contain any demo scenes, you can ignore this warning.", null, demoSceneScanResult.NestedUnityPackages.ToArray()); + return result; + } + + // No valid scenes were found and there is nothing pointing to their inclusion in the package + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("Could not find any valid Demo Scenes in the selected validation paths."); + return result; + } + + private DemoSceneScanResult CheckForDemoScenes(GenericTestConfig config) + { + var scanResult = new DemoSceneScanResult(); + scanResult.ValidAdbScenes = CheckForDemoScenesInAssetDatabase(config); + scanResult.HybridScenePaths = CheckForDemoScenesInUpmSamples(config); + scanResult.NestedUnityPackages = CheckForNestedUnityPackages(config); + + return scanResult; + } + + private List CheckForDemoScenesInAssetDatabase(GenericTestConfig config) + { + var scenePaths = _assetUtility.GetAssetPathsFromAssets(config.ValidationPaths, AssetType.Scene).ToArray(); + if (scenePaths.Length == 0) + return new List(); + + var originalScenePath = _sceneUtility.CurrentScenePath; + var validScenePaths = scenePaths.Where(CanBeDemoScene).ToArray(); + _sceneUtility.OpenScene(originalScenePath); + + if (validScenePaths.Length == 0) + return new List(); + + return validScenePaths.Select(x => AssetDatabase.LoadAssetAtPath(x)).ToList(); + } + + private bool CanBeDemoScene(string scenePath) + { + // Check skybox + var sceneSkyboxPath = _assetUtility.ObjectToAssetPath(RenderSettings.skybox).Replace("\\", "").Replace("/", ""); + var defaultSkyboxPath = "Resources/unity_builtin_extra".Replace("\\", "").Replace("/", ""); + + if (!sceneSkyboxPath.Equals(defaultSkyboxPath, StringComparison.OrdinalIgnoreCase)) + return true; + + // Check GameObjects + _sceneUtility.OpenScene(scenePath); + var rootObjects = _sceneUtility.GetRootGameObjects(); + var count = rootObjects.Length; + + if (count == 0) + return false; + + if (count != 2) + return true; + + var cameraGOUnchanged = rootObjects.Any(o => o.TryGetComponent(out _) && o.GetComponents(typeof(Component)).Length == 3); + var lightGOUnchanged = rootObjects.Any(o => o.TryGetComponent(out _) && o.GetComponents(typeof(Component)).Length == 2); + + return !cameraGOUnchanged || !lightGOUnchanged; + } + + private List CheckForDemoScenesInUpmSamples(GenericTestConfig config) + { + var scenePaths = new List(); + + foreach (var path in config.ValidationPaths) + { + if (!File.Exists($"{path}/package.json")) + continue; + + var packageJsonText = File.ReadAllText($"{path}/package.json"); + var json = JObject.Parse(packageJsonText); + + if (!json.ContainsKey("samples") || json["samples"].Type != JTokenType.Array || json["samples"].ToList().Count == 0) + continue; + + foreach (var sample in json["samples"].ToList()) + { + var samplePath = sample["path"].ToString(); + samplePath = $"{path}/{samplePath}"; + if (!Directory.Exists(samplePath)) + continue; + + var sampleScenePaths = Directory.GetFiles(samplePath, "*.unity", SearchOption.AllDirectories); + foreach (var scenePath in sampleScenePaths) + { + // If meta file is not found, the sample will not be included with the exported .unitypackage + if (!File.Exists($"{scenePath}.meta")) + continue; + + if (!scenePaths.Contains(scenePath.Replace("\\", "/"))) + scenePaths.Add(scenePath.Replace("\\", "/")); + } + } + } + + return scenePaths; + } + + private List CheckForNestedUnityPackages(GenericTestConfig config) + { + var unityPackages = _assetUtility.GetObjectsFromAssets(config.ValidationPaths, AssetType.UnityPackage).ToArray(); + return unityPackages.ToList(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs.meta new file mode 100644 index 00000000..a3689d41 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f844c2dfa4669ff4eacf5591b544edaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDemoScenes.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs new file mode 100644 index 00000000..1799c1d0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs @@ -0,0 +1,73 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System; +using System.IO; +using System.Linq; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckDocumentation : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + public CheckDocumentation(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var textFilePaths = _assetUtility.GetAssetPathsFromAssets(_config.ValidationPaths, AssetType.Documentation).ToArray(); + var documentationFilePaths = textFilePaths.Where(CouldBeDocumentation).ToArray(); + + if (textFilePaths.Length == 0) + { + result.Status = TestResultStatus.VariableSeverityIssue; + result.AddMessage("No potential documentation files ('.txt', '.pdf', " + + "'.html', '.rtf', '.md') found within the given path."); + } + else if (documentationFilePaths.Length == 0) + { + result.Status = TestResultStatus.Warning; + var textFileObjects = textFilePaths.Select(_assetUtility.AssetPathToObject).ToArray(); + result.AddMessage("The following files have been found to match the documentation file format," + + " but may not be documentation in content", + null, textFileObjects); + } + else + { + result.Status = TestResultStatus.Pass; + var documentationFileObjects = documentationFilePaths.Select(_assetUtility.AssetPathToObject).ToArray(); + result.AddMessage("Found documentation files", null, documentationFileObjects); + } + + return result; + } + + private bool CouldBeDocumentation(string filePath) + { + if (filePath.EndsWith(".pdf")) + return true; + + using (var fs = File.Open(filePath, FileMode.Open)) + using (var bs = new BufferedStream(fs)) + using (var sr = new StreamReader(bs)) + { + string line; + while ((line = sr.ReadLine()) != null) + { + var mentionsDocumentation = line.IndexOf("documentation", StringComparison.OrdinalIgnoreCase) >= 0; + if (mentionsDocumentation) + return true; + } + } + + return false; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs.meta new file mode 100644 index 00000000..91155950 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3c8425198983eda4c9b35aa0d59ea33c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckDocumentation.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs new file mode 100644 index 00000000..caa8ac60 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs @@ -0,0 +1,69 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; +using System.IO; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckPackageSize : ITestScript + { + private GenericTestConfig _config; + + public CheckPackageSize(GenericTestConfig config) + { + _config = config; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var packageSize = CalculatePackageSize(_config.ValidationPaths); + float packageSizeInGB = packageSize / (1024f * 1024f * 1024f); + float maxPackageSizeInGB = Constants.Uploader.MaxPackageSizeBytes / (1024f * 1024f * 1024f); + + if (packageSizeInGB - maxPackageSizeInGB >= 0.1f) + { + result.Status = TestResultStatus.Warning; + + result.AddMessage($"The uncompressed size of your package ({packageSizeInGB:0.#} GB) exceeds the maximum allowed package size of {maxPackageSizeInGB:0.#} GB. " + + $"Please make sure that the compressed .unitypackage size does not exceed the size limit."); + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("Your package does not exceed the maximum allowed package size!"); + } + + return result; + } + + private long CalculatePackageSize(string[] assetPaths) + { + long totalSize = 0; + + foreach (var path in assetPaths) + { + totalSize += CalculatePathSize(path); + } + + return totalSize; + } + + private long CalculatePathSize(string path) + { + long size = 0; + + var dirInfo = new DirectoryInfo(path); + if (!dirInfo.Exists) + return size; + + foreach (var file in dirInfo.EnumerateFiles()) + size += file.Length; + + foreach (var nestedDir in dirInfo.EnumerateDirectories()) + size += CalculatePathSize(nestedDir.FullName); + + return size; + } + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs.meta new file mode 100644 index 00000000..36ea8801 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a8601b99f4afa5049954f3a2dd5996d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckPackageSize.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs new file mode 100644 index 00000000..eab7aee5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs @@ -0,0 +1,217 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services.Validation; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator.TestMethods +{ + internal class CheckProjectTemplateAssets : ITestScript + { + private GenericTestConfig _config; + private IAssetUtilityService _assetUtility; + + // Constructor also accepts dependency injection of registered IValidatorService types + public CheckProjectTemplateAssets(GenericTestConfig config, IAssetUtilityService assetUtility) + { + _config = config; + _assetUtility = assetUtility; + } + + public TestResult Run() + { + var result = new TestResult() { Status = TestResultStatus.Undefined }; + + var assets = _assetUtility.GetObjectsFromAssets(_config.ValidationPaths, AssetType.All); + var invalidAssetsByGuid = CheckGuids(assets); + var invalidAssetsByPath = CheckPaths(assets); + + var hasIssues = invalidAssetsByGuid.Length > 0 + || invalidAssetsByPath.Length > 0; + + if (hasIssues) + { + result.Status = TestResultStatus.VariableSeverityIssue; + + if (invalidAssetsByPath.Length > 0) + { + result.AddMessage("The following assets were found to have an asset path which is common to project template asset paths. They should be renamed or moved:", null, invalidAssetsByPath); + } + + if (invalidAssetsByGuid.Length > 0) + { + result.AddMessage("The following assets were found to be using a GUID which is common to project template asset GUIDs. They should be assigned a new GUID:", null, invalidAssetsByGuid); + } + } + else + { + result.Status = TestResultStatus.Pass; + result.AddMessage("No common assets that might cause asset clashing were found!"); + } + + return result; + } + + private Object[] CheckGuids(IEnumerable assets) + { + var clashingAssets = new List(); + foreach (var asset in assets) + { + if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(asset, out var guid, out long _)) + continue; + + if (CommonTemplateAssets.Any(x => x.Key.Equals(guid, System.StringComparison.OrdinalIgnoreCase))) + clashingAssets.Add(asset); + } + + return clashingAssets.ToArray(); + } + + private Object[] CheckPaths(IEnumerable assets) + { + var clashingAssets = new List(); + foreach (var asset in assets) + { + var assetPath = AssetDatabase.GetAssetPath(asset); + if (CommonTemplateAssets.Any(x => x.Value.Equals(assetPath, System.StringComparison.OrdinalIgnoreCase))) + clashingAssets.Add(asset); + } + + return clashingAssets.ToArray(); + } + + private Dictionary CommonTemplateAssets = new Dictionary() + { + {"3f9215ea0144899419cfbc0957140d3f", "Assets/DefaultVolumeProfile.asset"}, + {"3d4c13846a3e9bd4c8ccfbd0657ed847", "Assets/DefaultVolumeProfile.asset"}, + {"4cee8bca36f2ab74b8feb832747fa6f4", "Assets/Editor/com.unity.mobile.notifications/NotificationSettings.asset"}, + {"45a04f37e0f48c744acc0874c4a8918a", "Assets/Editor/com.unity.mobile.notifications/NotificationSettings.asset"}, + {"54a3a0570aebe8949bec4966f1376581", "Assets/HDRPDefaultResources/DefaultHDRISky.exr"}, + {"e93c35b24eb03c74284e7dc0b755bfcc", "Assets/HDRPDefaultResources/DefaultHDRPAsset.asset"}, + {"254320a857a30444da2c99496a186368", "Assets/HDRPDefaultResources/DefaultLookDevProfile.asset"}, + {"2bfa7b9d63fa79e4abdc033f54a868d2", "Assets/HDRPDefaultResources/DefaultSceneRoot.prefab"}, + {"f9e3ff5a1b8f49c4fa8686e68d2dadae", "Assets/HDRPDefaultResources/DefaultSceneRoot.prefab"}, + {"d87f7d7815073e840834a16a518c1237", "Assets/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset"}, + {"145290c901d58b343bdeb3b4362c9ff2", "Assets/HDRPDefaultResources/DefaultVFXResources.asset"}, + {"acc11144f57719542b5fa25f02e74afb", "Assets/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset"}, + {"582adbd84082fdb4faf7cd4beb1ccd14", "Assets/HDRPDefaultResources/HDRPDefaultSettings.asset"}, + {"2801c2ff7303a7543a8727f862f6c236", "Assets/HDRPDefaultResources/Sky and Fog Settings Profile.asset"}, + {"ea5c25297f0c0a04da0eabb1c26a7509", "Assets/HDRPDefaultResources/SkyFogSettingsProfile.asset"}, + {"3590b91b4603b465dbb4216d601bff33", "Assets/InputSystem_Actions.inputactions"}, + {"289c1b55c9541489481df5cc06664110", "Assets/InputSystem_Actions.inputactions"}, + {"dc70d2c4f369241dd99afd7c451b813e", "Assets/InputSystem_Actions.inputactions"}, + {"2bcd2660ca9b64942af0de543d8d7100", "Assets/InputSystem_Actions.inputactions"}, + {"052faaac586de48259a63d0c4782560b", "Assets/InputSystem_Actions.inputactions"}, + {"35845fe01580c41289b024647b1d1c53", "Assets/InputSystem_Actions.inputactions"}, + {"8124e5870f4fd4c779e7a5f994e84ad1", "Assets/OutdoorsScene.unity"}, + {"2dd802e4d37c65149922028d3e973832", "Assets/Presets/AudioCompressedInMemory.preset"}, + {"e18fd6ecd9cdb524ca99844f39b9d9ac", "Assets/Presets/AudioCompressedInMemory.preset"}, + {"86bcce7f5575b54408aa0f3a7d321039", "Assets/Presets/AudioStreaming.preset"}, + {"460e573eb8466884baaa0b8475505f83", "Assets/Presets/AudioStreaming.preset"}, + {"e8537455c6c08bd4e8bf0be3707da685", "Assets/Presets/Defaults/AlbedoTexture_Default.preset"}, + {"7a99f8aa944efe94cb9bd74562b7d5f9", "Assets/Presets/Defaults/AlbedoTexture_Default.preset"}, + {"0cd792cc87e492d43b4e95b205fc5cc6", "Assets/Presets/Defaults/AudioDecompressOnLoad_Default.preset"}, + {"e7689051185d12f4298e1ebb2693a29f", "Assets/Presets/Defaults/AudioDecompressOnLoad.preset"}, + {"463065d4f17d1d94d848aa127b94dd43", "Assets/Presets/Defaults/DirectionalLight_Default.preset"}, + {"c1cf8506f04ef2c4a88b64b6c4202eea", "Assets/Presets/Defaults/DirectionalLight_Default.preset"}, + {"8fa3055e2a1363246838debd20206d37", "Assets/Presets/Defaults/SSSSettings_Default.preset"}, + {"78830bb1431cab940b74be615e2a739f", "Assets/Presets/HDRTexture.preset"}, + {"14a57cf3b9fa1c74b884aa7e0dcf1faa", "Assets/Presets/NormalTexture.preset"}, + {"1d826a4c23450f946b19c20560595a1f", "Assets/Presets/NormalTexture.preset"}, + {"45f7b2e3c78185248b3adbb14429c2ab", "Assets/Presets/UtilityTexture.preset"}, + {"78fae3569c6c66c46afc3d9d4fb0b8d4", "Assets/Presets/UtilityTexture.preset"}, + {"9303d565bd8aa6948ba775e843320e4d", "Assets/Presets/UtilityTexture.preset"}, + {"34f54ff1ff9415249a847506b6f2fec5", "Assets/Scenes/PrefabEditingScene.unity"}, + {"cbfe36cfddfde964d9dfce63a355d5dd", "Assets/Scenes/samplescene.unity"}, + {"2cda990e2423bbf4892e6590ba056729", "Assets/Scenes/SampleScene.unity"}, + {"9fc0d4010bbf28b4594072e72b8655ab", "Assets/Scenes/SampleScene.unity"}, + {"3db1837cc97a95e4c98610966fac2b0b", "Assets/Scenes/SampleScene.unity"}, + {"3fc8acdd13e6c734bafef6554d6fdbcd", "Assets/Scenes/SampleScene.unity"}, + {"8c9cfa26abfee488c85f1582747f6a02", "Assets/Scenes/SampleScene.unity"}, + {"c850ee8c3b14cc8459e7e186857cf567", "Assets/Scenes/SampleScene.unity"}, + {"99c9720ab356a0642a771bea13969a05", "Assets/Scenes/SampleScene.unity"}, + {"d1c3109bdb54ad54c8a2b2838528e640", "Assets/Scenes/SampleScene.unity"}, + {"477cc4148fad3449482a3bc3178594e2", "Assets/Scenes/SampleSceneLightingSettings.lighting"}, + {"4eb578550bc4f824e97f0a72eac1f3a5", "Assets/Scripts/LookWithMouse.cs"}, + {"87f6dfceb3e39a947a312f7eeaa2a113", "Assets/Scripts/PlayerMovement.cs"}, + {"be76e5f14cfee674cb30b491fb72b09b", "Assets/Scripts/SimpleCameraController.cs"}, + {"6547d18b2bc62c94aa5ec1e87434da4e", "Assets/Scripts/SimpleCameraController.cs"}, + {"e8a636f62116c0a40bbfefdf876d4608", "Assets/Scripts/SimpleCameraController.cs"}, + {"14e519c409be4a1428028347410f5677", "Assets/Scripts/SimpleCameraController.cs"}, + {"a04c28107d77d5e42b7155783b8475b6", "Assets/Settings/Cockpit_Renderer.asset"}, + {"ab09877e2e707104187f6f83e2f62510", "Assets/Settings/DefaultVolumeProfile.asset"}, + {"238cd62f6b58cb04e9c94749c4a015a7", "Assets/Settings/DefaultVolumeProfile.asset"}, + {"5a9a2dc462c7bde4f86d0615a19c2c72", "Assets/Settings/DiffusionProfiles/BambooLeaves.asset"}, + {"78322c7f82657514ebe48203160e3f39", "Assets/Settings/Foliage.asset"}, + {"3e2e6bfc59709614ab90c0cd7d755e48", "Assets/Settings/HDRP Balanced.asset"}, + {"36dd385e759c96147b6463dcd1149c11", "Assets/Settings/HDRP High Fidelity.asset"}, + {"168a2336534e4e043b2a210b6f8d379a", "Assets/Settings/HDRP Performant.asset"}, + {"4594f4a3fb14247e192bcca6dc23c8ed", "Assets/Settings/HDRPDefaultResources/DefaultLookDevProfile.asset"}, + {"14b392ee213d25a48b1feddbd9f5a9be", "Assets/Settings/HDRPDefaultResources/DefaultSettingsVolumeProfile.asset"}, + {"879ffae44eefa4412bb327928f1a96dd", "Assets/Settings/HDRPDefaultResources/FoliageDiffusionProfile.asset"}, + {"b9f3086da92434da0bc1518f19f0ce86", "Assets/Settings/HDRPDefaultResources/HDRenderPipelineAsset.asset"}, + {"ac0316ca287ba459492b669ff1317a6f", "Assets/Settings/HDRPDefaultResources/HDRenderPipelineGlobalSettings.asset"}, + {"48e911a1e337b44e2b85dbc65b47a594", "Assets/Settings/HDRPDefaultResources/SkinDiffusionProfile.asset"}, + {"d03ed43fc9d8a4f2e9fa70c1c7916eb9", "Assets/Settings/Lit2DSceneTemplate.scenetemplate"}, + {"65bc7dbf4170f435aa868c779acfb082", "Assets/Settings/Mobile_Renderer.asset"}, + {"5e6cbd92db86f4b18aec3ed561671858", "Assets/Settings/Mobile_RPAsset.asset"}, + {"23cccccf13c3d4170a9b21e52a9bc86b", "Assets/Settings/Mobile/Mobile_High_ScreenRenderer.asset"}, + {"6e8f76111115f44e0a76c2bff3cec258", "Assets/Settings/Mobile/Mobile_Low_Renderer.asset"}, + {"aed30aee6a3ceae4090dadd1934d2ad0", "Assets/Settings/Mobile/Mobile_Low_ScreenRenderer.asset"}, + {"d7686b11d09df481bac3c76ecc5ea626", "Assets/Settings/Mobile/Mobile_Low.asset"}, + {"f288ae1f4751b564a96ac7587541f7a2", "Assets/Settings/PC_Renderer.asset"}, + {"4b83569d67af61e458304325a23e5dfd", "Assets/Settings/PC_RPAsset.asset"}, + {"42b230d443c6d6c4b89c47f97db59121", "Assets/Settings/PC/PC_High_ScreenRenderer.asset"}, + {"13ba41cd2fa191f43890b271bd110ed9", "Assets/Settings/PC/PC_Low_Renderer.asset"}, + {"a73f6fa069dd14a42b40cbb01bae63b4", "Assets/Settings/PC/PC_Low_ScreenRenderer.asset"}, + {"4eb9ff6b5314098428cfa0be7e36ccda", "Assets/Settings/PC/PC_Low.asset"}, + {"573ac53c334415945bf239de2c2f0511", "Assets/Settings/PlayerControllerFPS.prefab"}, + {"7ba2b06fb32e5274aad88925a5b8d3f5", "Assets/Settings/PostProcessVolumeProfile.asset"}, + {"424799608f7334c24bf367e4bbfa7f9a", "Assets/Settings/Renderer2D.asset"}, + {"183cbd347d25080429f42b520742bbd8", "Assets/Settings/SampleScenePostProcessingSettings.asset"}, + {"10fc4df2da32a41aaa32d77bc913491c", "Assets/Settings/SampleSceneProfile.asset"}, + {"a6560a915ef98420e9faacc1c7438823", "Assets/Settings/SampleSceneProfile.asset"}, + {"a123fc0ac58cb774e8592c925f167e7c", "Assets/Settings/SampleSceneSkyandFogSettings.asset"}, + {"26bdddf49760c61438938733f07fa2a2", "Assets/Settings/Skin.asset"}, + {"8ba92e2dd7f884a0f88b98fa2d235fe7", "Assets/Settings/SkyandFogSettingsProfile.asset"}, + {"4a8e21d5c33334b11b34a596161b9360", "Assets/Settings/UniversalRenderer.asset"}, + {"18dc0cd2c080841dea60987a38ce93fa", "Assets/Settings/UniversalRenderPipelineGlobalSettings.asset"}, + {"bdede76083021864d8ff8bf23b2f37f1", "Assets/Settings/UniversalRenderPipelineGlobalSettings.asset"}, + {"19ba41d7c0026c3459d37c2fe90c55a0", "Assets/Settings/UniversalRP-HighQuality.asset"}, + {"a31e9f9f9c9d4b9429ed0d1234e22103", "Assets/Settings/UniversalRP-LowQuality.asset"}, + {"d847b876476d3d6468f5dfcd34266f96", "Assets/Settings/UniversalRP-MediumQuality.asset"}, + {"681886c5eb7344803b6206f758bf0b1c", "Assets/Settings/UniversalRP.asset"}, + {"e634585d5c4544dd297acaee93dc2beb", "Assets/Settings/URP-Balanced-Renderer.asset"}, + {"e1260c1148f6143b28bae5ace5e9c5d1", "Assets/Settings/URP-Balanced.asset"}, + {"c40be3174f62c4acf8c1216858c64956", "Assets/Settings/URP-HighFidelity-Renderer.asset"}, + {"7b7fd9122c28c4d15b667c7040e3b3fd", "Assets/Settings/URP-HighFidelity.asset"}, + {"707360a9c581a4bd7aa53bfeb1429f71", "Assets/Settings/URP-Performant-Renderer.asset"}, + {"d0e2fc18fe036412f8223b3b3d9ad574", "Assets/Settings/URP-Performant.asset"}, + {"b62413aeefabaaa41a4b5a71dd7ae1ac", "Assets/Settings/VolumeProfiles/CinematicProfile.asset"}, + {"ac0c2cad5778d4544b6a690963e02fe3", "Assets/Settings/VolumeProfiles/DefaultVolumeProfile.asset"}, + {"f2d4d916a6612574cad220d125febbf2", "Assets/Settings/VolumeProfiles/LowQualityVolumeProfile.asset"}, + {"cef078630d63d0442a070f84d4f13735", "Assets/Settings/VolumeProfiles/MarketProfile.asset"}, + {"7ede9c9f109e5c442b7d29e54b4996fc", "Assets/Settings/VolumeProfiles/MediaOverrides.asset"}, + {"3532e98caae428047bcefe69a344f72c", "Assets/Settings/VolumeProfiles/OutlineEnabled.asset"}, + {"bfc08ba7e35de1a44bb84a32f1a693e1", "Assets/Settings/VolumeProfiles/ZenGardenProfile.asset"}, + {"59a34a3881431c246b3564a0f0ca5bb0", "Assets/Settings/Volumes/CinematicPhysicalCamera.asset"}, + {"03bc34b71695890468eb021c73b228db", "Assets/Settings/Volumes/ScreenshotsTimelineProfile.asset"}, + {"7f342610b85f4164f808a1f380dcc668", "Assets/Settings/Volumes/VolumeGlobal.asset"}, + {"bd6d234073408c44ca3828113aac655e", "Assets/Settings/Volumes/VolumeRoom1.asset"}, + {"d78a1b031ab26034eb6ec3cbc9fbcec3", "Assets/Settings/Volumes/VolumeRoom2.asset"}, + {"5727d3e07f75c3744b6cc8a1e55850a9", "Assets/Settings/Volumes/VolumeRoom2Skylight.asset"}, + {"06114ad16a0bc0a41957375ac3bf472e", "Assets/Settings/Volumes/VolumeRoom3.asset"}, + {"1584bf21cf81d5147aa00e8a2deaf2fb", "Assets/Settings/Volumes/VolumeRoom3Corridor.asset"}, + {"7bca3a07cdd522c4c8020832c20b3eae", "Assets/Settings/Volumes/VolumeRoom3Sitting.asset"}, + {"2872d90954412244a8b4a477b939c3ca", "Assets/Settings/XR/Loaders/Mock_HMD_Loader.asset"}, + {"f25758a0f79593d4a9b3ee30a17b4c2e", "Assets/Settings/XR/Loaders/Oculus_Loader.asset"}, + {"9e9f2958d1b4b4642ace1d0c7770650b", "Assets/Settings/XR/Settings/Mock_HMD_Build_Settings.asset"}, + {"290a6e6411d135049940bec2237b8938", "Assets/Settings/XR/Settings/Oculus_Settings.asset"}, + {"4c1640683c539c14080cfd43fbeffbda", "Assets/Settings/XR/XRGeneralSettings.asset"}, + {"93b439a37f63240aca3dd4e01d978a9f", "Assets/UniversalRenderPipelineGlobalSettings.asset"}, + {"38b35347542e5af4c9b140950c5b18db", "Assets/UniversalRenderPipelineGlobalSettings.asset"} + }; + } +} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs.meta new file mode 100644 index 00000000..59b111e5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: f02d52a702c712e4e8089f7c2e65bae7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Test Methods/UnityPackage/CheckProjectTemplateAssets.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI.meta new file mode 100644 index 00000000..f401e9e8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0eed33a351c3c544ba6bf3cd29d24c26 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data.meta new file mode 100644 index 00000000..c3a170c9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 461bfd99d0923cd4a8dae2f440af1064 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions.meta new file mode 100644 index 00000000..93d41554 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d7d9c6cc805e072429392e7a378d2c9c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs new file mode 100644 index 00000000..676b70cf --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs @@ -0,0 +1,15 @@ +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal interface IValidatorResults + { + event Action OnResultsChanged; + event Action OnRequireSerialize; + + void LoadResult(ValidationResult result); + IEnumerable GetSortedTestGroups(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs.meta new file mode 100644 index 00000000..88224cb5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 91c62333b36d5ef47989289e8f90c056 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorResults.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs new file mode 100644 index 00000000..d439b0dd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs @@ -0,0 +1,31 @@ +using AssetStoreTools.Validator.Data; +using System; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal interface IValidatorSettings + { + event Action OnCategoryChanged; + event Action OnValidationTypeChanged; + event Action OnValidationPathsChanged; + event Action OnRequireSerialize; + + void LoadSettings(ValidationSettings settings); + + string GetActiveCategory(); + void SetActiveCategory(string category); + List GetAvailableCategories(); + + ValidationType GetValidationType(); + void SetValidationType(ValidationType validationType); + + List GetValidationPaths(); + void AddValidationPath(string path); + void RemoveValidationPath(string path); + void ClearValidationPaths(); + bool IsValidationPathValid(string path, out string error); + + IValidator CreateValidator(); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs.meta new file mode 100644 index 00000000..d8ed8d4d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: cc6516196465ac6469258ef8950da607 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs new file mode 100644 index 00000000..1dcafcec --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs @@ -0,0 +1,15 @@ +using AssetStoreTools.Validator.Data; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal interface IValidatorTest + { + int Id { get; } + string Name { get; } + string Description { get; } + ValidationType ValidationType { get; } + TestResult Result { get; } + + void SetResult(TestResult result); + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs.meta new file mode 100644 index 00000000..dd9750e0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d1e4d9ba8de8cfc4aa42786fbbc5037a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTest.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs new file mode 100644 index 00000000..81b8d8f1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs @@ -0,0 +1,12 @@ +using AssetStoreTools.Validator.Data; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal interface IValidatorTestGroup + { + string Name { get; } + TestResultStatus Status { get; } + IEnumerable Tests { get; } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs.meta new file mode 100644 index 00000000..ee7a6574 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: fa8735b7eb65d3147ab8bdbf922f36cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Abstractions/IValidatorTestGroup.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization.meta new file mode 100644 index 00000000..4122afef --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ec536685238584f41bd268edaaf0ad7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs new file mode 100644 index 00000000..4e75ed61 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs @@ -0,0 +1,28 @@ +using Newtonsoft.Json; + +namespace AssetStoreTools.Validator.UI.Data.Serialization +{ + internal class ValidatorStateData + { + [JsonProperty("validation_settings")] + private ValidatorStateSettings _settings; + [JsonProperty("validation_results")] + private ValidatorStateResults _results; + + public ValidatorStateData() + { + _settings = new ValidatorStateSettings(); + _results = new ValidatorStateResults(); + } + + public ValidatorStateSettings GetSettings() + { + return _settings; + } + + public ValidatorStateResults GetResults() + { + return _results; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs.meta new file mode 100644 index 00000000..e8029528 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: da7a885e302cb6b43855b68f44f2c0fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateData.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs new file mode 100644 index 00000000..a72360ab --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json.Serialization; + +namespace AssetStoreTools.Validator.UI.Data.Serialization +{ + internal class ValidatorStateDataContractResolver : DefaultContractResolver + { + private static ValidatorStateDataContractResolver _instance; + public static ValidatorStateDataContractResolver Instance => _instance ?? (_instance = new ValidatorStateDataContractResolver()); + + private NamingStrategy _namingStrategy; + + private ValidatorStateDataContractResolver() + { + _namingStrategy = new SnakeCaseNamingStrategy(); + } + + protected override string ResolvePropertyName(string propertyName) + { + var resolvedName = _namingStrategy.GetPropertyName(propertyName, false); + if (resolvedName.StartsWith("_")) + return resolvedName.Substring(1); + + return resolvedName; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs.meta new file mode 100644 index 00000000..79f10135 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 60f0e8d9b2ab86547a288c337fb2be0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateDataContractResolver.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs new file mode 100644 index 00000000..3558822c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs @@ -0,0 +1,83 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.UI.Data.Serialization +{ + internal class ValidatorStateResults + { + // Primary data + [JsonProperty("validation_status")] + private ValidationStatus _status; + [JsonProperty("test_results")] + private SortedDictionary _results; + + // Secondary data + [JsonProperty("project_path")] + private string _projectPath; + [JsonProperty("had_compilation_errors")] + private bool _hadCompilationErrors; + + public ValidatorStateResults() + { + _projectPath = string.Empty; + _status = ValidationStatus.NotRun; + _hadCompilationErrors = false; + _results = new SortedDictionary(); + } + + public ValidationStatus GetStatus() + { + return _status; + } + + public void SetStatus(ValidationStatus status) + { + if (_status == status) + return; + + _status = status; + } + + public SortedDictionary GetResults() + { + return _results; + } + + public void SetResults(IEnumerable tests) + { + _results.Clear(); + foreach (var test in tests) + { + _results.Add(test.Id, test.Result); + } + } + + public string GetProjectPath() + { + return _projectPath; + } + + public void SetProjectPath(string projectPath) + { + if (_projectPath == projectPath) + return; + + _projectPath = projectPath; + } + + public bool GetHadCompilationErrors() + { + return _hadCompilationErrors; + } + + public void SetHadCompilationErrors(bool hadCompilationErrors) + { + if (_hadCompilationErrors == hadCompilationErrors) + return; + + _hadCompilationErrors = hadCompilationErrors; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs.meta new file mode 100644 index 00000000..d75bc1c1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a90c3acfa50e8da4aa3da2b9c669502d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateResults.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs new file mode 100644 index 00000000..27cee0e7 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs @@ -0,0 +1,63 @@ +using AssetStoreTools.Validator.Data; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Linq; + +namespace AssetStoreTools.Validator.UI.Data.Serialization +{ + internal class ValidatorStateSettings + { + [JsonProperty("category")] + private string _category; + [JsonProperty("validation_type")] + private ValidationType _validationType; + [JsonProperty("validation_paths")] + private List _validationPaths; + + public ValidatorStateSettings() + { + _category = string.Empty; + _validationType = ValidationType.UnityPackage; + _validationPaths = new List(); + } + + public string GetCategory() + { + return _category; + } + + public void SetCategory(string category) + { + if (_category == category) + return; + + _category = category; + } + + public ValidationType GetValidationType() + { + return _validationType; + } + + public void SetValidationType(ValidationType validationType) + { + if (validationType == _validationType) + return; + + _validationType = validationType; + } + + public List GetValidationPaths() + { + return _validationPaths; + } + + public void SetValidationPaths(List validationPaths) + { + if (_validationPaths.SequenceEqual(validationPaths)) + return; + + _validationPaths = validationPaths; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs.meta new file mode 100644 index 00000000..a11280ae --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d39d56313ade8a8409aafe95dc84f79a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/Serialization/ValidatorStateSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs new file mode 100644 index 00000000..38244c8f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs @@ -0,0 +1,137 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; +using AssetStoreTools.Validator.UI.Data.Serialization; +using AssetStoreTools.Validator.Utility; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal class ValidatorResults : IValidatorResults + { + private ValidatorStateResults _stateData; + + private IValidatorSettings _settings; + private IEnumerable _tests; + + private readonly TestResultStatus[] _priorityGroups = new TestResultStatus[] + { + TestResultStatus.Undefined, + TestResultStatus.Fail, + TestResultStatus.Warning + }; + + public event Action OnResultsChanged; + public event Action OnRequireSerialize; + + public ValidatorResults(IValidatorSettings settings, ValidatorStateResults stateData) + { + _settings = settings; + _stateData = stateData; + + _tests = GetAllTests(); + + Deserialize(); + } + + private IEnumerable GetAllTests() + { + var tests = new List(); + var testObjects = ValidatorUtility.GetAutomatedTestCases(ValidatorUtility.SortType.Alphabetical); + + foreach (var testObject in testObjects) + { + var testSource = new AutomatedTest(testObject); + var test = new ValidatorTest(testSource); + tests.Add(test); + } + + return tests; + } + + public void LoadResult(ValidationResult result) + { + if (result == null) + return; + + foreach (var test in _tests) + { + if (!result.Tests.Any(x => x.Id == test.Id)) + continue; + + var matchingResult = result.Tests.First(x => x.Id == test.Id); + test.SetResult(matchingResult.Result); + } + + OnResultsChanged?.Invoke(); + + Serialize(result); + } + + public IEnumerable GetSortedTestGroups() + { + var groups = new List(); + var testsByStatus = _tests + .Where(x => x.ValidationType == ValidationType.Generic || x.ValidationType == _settings.GetValidationType()) + .GroupBy(x => x.Result.Status).ToDictionary(x => x.Key, x => x.ToList()); + + foreach (var kvp in testsByStatus) + { + var group = new ValidatorTestGroup(kvp.Key, kvp.Value); + groups.Add(group); + } + + return SortGroups(groups); + } + + private IEnumerable SortGroups(IEnumerable unsortedGroups) + { + var sortedGroups = new List(); + var groups = unsortedGroups.OrderBy(x => x.Status).ToList(); + + // Select priority groups first + foreach (var priority in _priorityGroups) + { + var priorityGroup = groups.FirstOrDefault(x => x.Status == priority); + if (priorityGroup == null) + continue; + + sortedGroups.Add(priorityGroup); + groups.Remove(priorityGroup); + } + + // Add the rest + sortedGroups.AddRange(groups); + + return sortedGroups; + } + + private void Serialize(ValidationResult result) + { + _stateData.SetStatus(result.Status); + _stateData.SetResults(result.Tests); + _stateData.SetProjectPath(result.ProjectPath); + _stateData.SetHadCompilationErrors(result.HadCompilationErrors); + OnRequireSerialize?.Invoke(); + } + + private void Deserialize() + { + if (_stateData == null) + return; + + var serializedResults = _stateData.GetResults(); + foreach (var test in _tests) + { + if (!serializedResults.Any(x => x.Key == test.Id)) + continue; + + var matchingResult = serializedResults.First(x => x.Key == test.Id); + test.SetResult(matchingResult.Value); + } + + OnResultsChanged?.Invoke(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs.meta new file mode 100644 index 00000000..166ec320 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: bf2839f8b2340294aae39c2965039d2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorResults.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs new file mode 100644 index 00000000..d65ab0c1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs @@ -0,0 +1,236 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.UI.Data.Serialization; +using AssetStoreTools.Validator.Utility; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal class ValidatorSettings : IValidatorSettings + { + private ValidatorStateSettings _stateData; + + private string _category; + private ValidationType _validationType; + private List _validationPaths; + + public event Action OnCategoryChanged; + public event Action OnValidationTypeChanged; + public event Action OnValidationPathsChanged; + public event Action OnRequireSerialize; + + public ValidatorSettings(ValidatorStateSettings stateData) + { + _stateData = stateData; + + _category = string.Empty; + _validationType = ValidationType.UnityPackage; + _validationPaths = new List(); + + Deserialize(); + } + + public void LoadSettings(ValidationSettings settings) + { + if (settings == null) + return; + + var currentProjectValidationSettings = settings as CurrentProjectValidationSettings; + if (currentProjectValidationSettings == null) + throw new ArgumentException($"Only {nameof(CurrentProjectValidationSettings)} can be loaded"); + + _category = currentProjectValidationSettings.Category; + OnCategoryChanged?.Invoke(); + + _validationType = currentProjectValidationSettings.ValidationType; + OnValidationTypeChanged?.Invoke(); + + _validationPaths = currentProjectValidationSettings.ValidationPaths.ToList(); + OnValidationPathsChanged?.Invoke(); + + Serialize(); + } + + public string GetActiveCategory() + { + return _category; + } + + public void SetActiveCategory(string category) + { + if (category == _category) + return; + + _category = category; + Serialize(); + OnCategoryChanged?.Invoke(); + } + + public List GetAvailableCategories() + { + var categories = new HashSet(); + + var testData = ValidatorUtility.GetAutomatedTestCases(); + foreach (var test in testData) + { + if (test.CategoryInfo == null) + continue; + + foreach (var filter in test.CategoryInfo.Filter) + categories.Add(ConvertSlashToUnicodeSlash(filter)); + } + + return categories.OrderBy(x => x).ToList(); + } + + private string ConvertSlashToUnicodeSlash(string text) + { + return text.Replace('/', '\u2215'); + } + + public ValidationType GetValidationType() + { + return _validationType; + } + + public void SetValidationType(ValidationType validationType) + { + if (validationType == _validationType) + return; + + _validationType = validationType; + + Serialize(); + OnValidationTypeChanged?.Invoke(); + } + + public List GetValidationPaths() + { + return _validationPaths; + } + + public void AddValidationPath(string path) + { + if (string.IsNullOrEmpty(path)) + return; + + if (_validationPaths.Contains(path)) + return; + + // Prevent redundancy for new paths + var existingPath = _validationPaths.FirstOrDefault(x => path.StartsWith(x + "/")); + if (existingPath != null) + { + Debug.LogWarning($"Path '{path}' is already included with existing path: '{existingPath}'"); + return; + } + + // Prevent redundancy for already added paths + var redundantPaths = _validationPaths.Where(x => x.StartsWith(path + "/")).ToArray(); + foreach (var redundantPath in redundantPaths) + { + Debug.LogWarning($"Existing validation path '{redundantPath}' has been made redundant by the inclusion of new validation path: '{path}'"); + _validationPaths.Remove(redundantPath); + } + + _validationPaths.Add(path); + + Serialize(); + OnValidationPathsChanged?.Invoke(); + } + + public void RemoveValidationPath(string path) + { + if (!_validationPaths.Contains(path)) + return; + + _validationPaths.Remove(path); + + Serialize(); + OnValidationPathsChanged?.Invoke(); + } + + public void ClearValidationPaths() + { + if (_validationPaths.Count == 0) + return; + + _validationPaths.Clear(); + + Serialize(); + OnValidationPathsChanged?.Invoke(); + } + + public bool IsValidationPathValid(string path, out string error) + { + error = string.Empty; + + if (string.IsNullOrEmpty(path)) + { + error = "Path cannot be empty"; + return false; + } + + var isAssetsPath = path.StartsWith("Assets/") + || path.Equals("Assets"); + var isPackagePath = PackageUtility.GetPackageByManifestPath($"{path}/package.json", out _); + + if (!isAssetsPath && !isPackagePath) + { + error = "Selected path must be within the Assets folder or point to a root path of a package"; + return false; + } + + if (!Directory.Exists(path)) + { + error = "Path does not exist"; + return false; + } + + if (path.Split('/').Any(x => x.StartsWith(".") || x.EndsWith("~"))) + { + error = $"Path '{path}' cannot be validated as it is a hidden folder and not part of the Asset Database"; + return false; + } + + return true; + } + + public IValidator CreateValidator() + { + var settings = new CurrentProjectValidationSettings() + { + Category = _category, + ValidationType = _validationType, + ValidationPaths = _validationPaths + }; + + var validator = new CurrentProjectValidator(settings); + return validator; + } + + private void Serialize() + { + _stateData.SetCategory(_category); + _stateData.SetValidationType(_validationType); + _stateData.SetValidationPaths(_validationPaths); + + OnRequireSerialize?.Invoke(); + } + + private void Deserialize() + { + if (_stateData == null) + return; + + _category = _stateData.GetCategory(); + _validationType = _stateData.GetValidationType(); + foreach (var path in _stateData.GetValidationPaths()) + _validationPaths.Add(path); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs.meta new file mode 100644 index 00000000..f2f3aecb --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 89504c2259614a743a164c5c162a197a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorSettings.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs new file mode 100644 index 00000000..126cb4f1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs @@ -0,0 +1,28 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.TestDefinitions; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal class ValidatorTest : IValidatorTest + { + public int Id { get; private set; } + public string Name { get; private set; } + public string Description { get; private set; } + public ValidationType ValidationType { get; private set; } + public TestResult Result { get; private set; } + + public ValidatorTest(AutomatedTest source) + { + Id = source.Id; + Name = source.Title; + Description = source.Description; + ValidationType = source.ValidationType; + Result = source.Result; + } + + public void SetResult(TestResult result) + { + Result = result; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs.meta new file mode 100644 index 00000000..f209046b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 838e8d45ce997d8489185bc194dfcf25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTest.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs new file mode 100644 index 00000000..b3620d86 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs @@ -0,0 +1,18 @@ +using AssetStoreTools.Validator.Data; +using System.Collections.Generic; + +namespace AssetStoreTools.Validator.UI.Data +{ + internal class ValidatorTestGroup : IValidatorTestGroup + { + public string Name => Status.ToString(); + public TestResultStatus Status { get; private set; } + public IEnumerable Tests { get; private set; } + + public ValidatorTestGroup(TestResultStatus status, IEnumerable tests) + { + Status = status; + Tests = tests; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs.meta new file mode 100644 index 00000000..c648a669 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 8f5d1fc9ff785904fb2e663e9232a7a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Data/ValidatorTestGroup.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements.meta new file mode 100644 index 00000000..9a9f507c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7ee7e5be29b8b184ba2abcd3ed38454e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs new file mode 100644 index 00000000..93f8f891 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs @@ -0,0 +1,50 @@ +using AssetStoreTools.Validator.UI.Data; +using System; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorButtonElement : VisualElement + { + // Data + private IValidatorSettings _settings; + + // UI + private Button _validateButton; + + public event Action OnValidate; + + public ValidatorButtonElement(IValidatorSettings settings) + { + _settings = settings; + _settings.OnValidationPathsChanged += ValidationPathsChanged; + + Create(); + Deserialize(); + } + + private void Create() + { + _validateButton = new Button(Validate) { text = "Validate" }; + _validateButton.AddToClassList("validator-validate-button"); + + Add(_validateButton); + } + + private void Validate() + { + OnValidate?.Invoke(); + } + + private void ValidationPathsChanged() + { + var validationPathsPresent = _settings.GetValidationPaths().Count > 0; + _validateButton.SetEnabled(validationPathsPresent); + } + + private void Deserialize() + { + ValidationPathsChanged(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs.meta new file mode 100644 index 00000000..1e54d935 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 44fac105314df6341bf6a70fb3200baf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorButtonElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs new file mode 100644 index 00000000..73d6e70d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs @@ -0,0 +1,114 @@ +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorDescriptionElement : VisualElement + { + private const string DescriptionFoldoutText = "Validate your package to ensure your content follows the chosen submission guidelines."; + private const string DescriptionFoldoutContentText = "The validations below do not cover all of the content standards, and passing all validations does not " + + "guarantee that your package will be accepted to the Asset Store.\n\n" + + "The tests are not obligatory for submitting your assets, but they can help avoid instant rejection by the " + + "automated vetting system, or clarify reasons of rejection communicated by the vetting team.\n\n" + + "For more information about the validations, view the message by expanding the tests or contact our support team."; + + private VisualElement _descriptionSimpleContainer; + private Label _descriptionSimpleLabel; + private Button _showMoreButton; + + private VisualElement _descriptionFullContainer; + private Button _showLessButton; + + public ValidatorDescriptionElement() + { + AddToClassList("validator-description"); + Create(); + } + + private void Create() + { + CreateSimpleDescription(); + CreateFullDescription(); + } + + private void CreateSimpleDescription() + { + _descriptionSimpleContainer = new VisualElement(); + _descriptionSimpleContainer.AddToClassList("validator-description-simple-container"); + + _descriptionSimpleLabel = new Label(DescriptionFoldoutText); + _descriptionSimpleLabel.AddToClassList("validator-description-simple-label"); + + _showMoreButton = new Button(ToggleFullDescription) { text = "Show more..." }; + _showMoreButton.AddToClassList("validator-description-show-button"); + _showMoreButton.AddToClassList("validator-description-hyperlink-button"); + + _descriptionSimpleContainer.Add(_descriptionSimpleLabel); + _descriptionSimpleContainer.Add(_showMoreButton); + + Add(_descriptionSimpleContainer); + } + + private void CreateFullDescription() + { + _descriptionFullContainer = new VisualElement(); + _descriptionFullContainer.AddToClassList("validator-description-full-container"); + + var validatorDescription = new Label() + { + text = DescriptionFoldoutContentText + }; + validatorDescription.AddToClassList("validator-description-full-label"); + + var submissionGuidelinesButton = new Button(OpenSubmissionGuidelinesUrl) + { + text = "Submission Guidelines" + }; + submissionGuidelinesButton.AddToClassList("validator-description-hyperlink-button"); + + var supportTicketButton = new Button(OpenSupportTicketUrl) + { + text = "Contact our Support Team" + }; + supportTicketButton.AddToClassList("validator-description-hyperlink-button"); + + _showLessButton = new Button(ToggleFullDescription) { text = "Show less..." }; + _showLessButton.AddToClassList("validator-description-hide-button"); + _showLessButton.AddToClassList("validator-description-hyperlink-button"); + + _descriptionFullContainer.Add(validatorDescription); + _descriptionFullContainer.Add(submissionGuidelinesButton); + _descriptionFullContainer.Add(supportTicketButton); + _descriptionFullContainer.Add(_showLessButton); + + _descriptionFullContainer.style.display = DisplayStyle.None; + Add(_descriptionFullContainer); + } + + private void ToggleFullDescription() + { + var displayFullDescription = _descriptionFullContainer.style.display == DisplayStyle.None; + + if (displayFullDescription) + { + _showMoreButton.style.display = DisplayStyle.None; + _descriptionFullContainer.style.display = DisplayStyle.Flex; + } + else + { + _showMoreButton.style.display = DisplayStyle.Flex; + _descriptionFullContainer.style.display = DisplayStyle.None; + } + } + + private void OpenSubmissionGuidelinesUrl() + { + Application.OpenURL(Constants.Validator.SubmissionGuidelinesUrl); + } + + private void OpenSupportTicketUrl() + { + Application.OpenURL(Constants.Validator.SupportTicketUrl); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs.meta new file mode 100644 index 00000000..14c5f70f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9866d77420d947ba852055eed2bac895 +timeCreated: 1653383883 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorDescriptionElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs new file mode 100644 index 00000000..6e4fe6dc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs @@ -0,0 +1,128 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.UI.Data; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorPathsElement : VisualElement + { + // Data + private IValidatorSettings _settings; + + // UI + private ScrollView _pathBoxScrollView; + + public ValidatorPathsElement(IValidatorSettings settings) + { + AddToClassList("validator-paths"); + + _settings = settings; + _settings.OnValidationPathsChanged += ValidationPathsChanged; + + Create(); + Deserialize(); + } + + private void Create() + { + var pathSelectionRow = new VisualElement(); + pathSelectionRow.AddToClassList("validator-settings-selection-row"); + + VisualElement labelHelpRow = new VisualElement(); + labelHelpRow.AddToClassList("validator-settings-selection-label-help-row"); + labelHelpRow.style.alignSelf = Align.FlexStart; + + Label pathLabel = new Label { text = "Validation paths" }; + Image pathLabelTooltip = new Image + { + tooltip = "Select the folder (or multiple folders) that your package consists of." + + "\n\nAll files and folders of your package should be contained within " + + "a single root folder that is named after your package " + + "(e.g. 'Assets/[MyPackageName]' or 'Packages/[MyPackageName]')" + + "\n\nIf your package includes special folders that cannot be nested within " + + "the root package folder (e.g. 'WebGLTemplates'), they should be added to this list " + + "together with the root package folder" + }; + + labelHelpRow.Add(pathLabel); + labelHelpRow.Add(pathLabelTooltip); + + var fullPathBox = new VisualElement() { name = "ValidationPaths" }; + fullPathBox.AddToClassList("validator-paths-box"); + + _pathBoxScrollView = new ScrollView { name = "ValidationPathsScrollView" }; + _pathBoxScrollView.AddToClassList("validator-paths-scroll-view"); + + VisualElement scrollViewBottomRow = new VisualElement(); + scrollViewBottomRow.AddToClassList("validator-paths-scroll-view-bottom-row"); + + var addExtraPathsButton = new Button(BrowsePath) { text = "Add a path" }; + addExtraPathsButton.AddToClassList("validator-paths-add-button"); + scrollViewBottomRow.Add(addExtraPathsButton); + + fullPathBox.Add(_pathBoxScrollView); + fullPathBox.Add(scrollViewBottomRow); + + pathSelectionRow.Add(labelHelpRow); + pathSelectionRow.Add(fullPathBox); + + Add(pathSelectionRow); + } + + private VisualElement CreateSinglePathElement(string path) + { + var validationPath = new VisualElement(); + validationPath.AddToClassList("validator-paths-path-row"); + + var folderPathLabel = new Label(path); + folderPathLabel.AddToClassList("validator-paths-path-row-input-field"); + + var removeButton = new Button(() => + { + _settings.RemoveValidationPath(path); + }); + removeButton.text = "X"; + removeButton.AddToClassList("validator-paths-path-row-remove-button"); + + validationPath.Add(folderPathLabel); + validationPath.Add(removeButton); + + return validationPath; + } + + private void BrowsePath() + { + string absolutePath = EditorUtility.OpenFolderPanel("Select a directory", "Assets", ""); + + if (string.IsNullOrEmpty(absolutePath)) + return; + + var relativePath = FileUtility.AbsolutePathToRelativePath(absolutePath, ASToolsPreferences.Instance.EnableSymlinkSupport); + + if (!_settings.IsValidationPathValid(relativePath, out var error)) + { + EditorUtility.DisplayDialog("Invalid path", error, "OK"); + return; + } + + _settings.AddValidationPath(relativePath); + } + + private void ValidationPathsChanged() + { + var validationPaths = _settings.GetValidationPaths(); + + _pathBoxScrollView.Clear(); + foreach (var path in validationPaths) + { + _pathBoxScrollView.Add(CreateSinglePathElement(path)); + } + } + + private void Deserialize() + { + ValidationPathsChanged(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs.meta new file mode 100644 index 00000000..a0c57ef5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 370dcd3bc87ace647940b4b07147bf93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorPathsElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs new file mode 100644 index 00000000..f8e5113f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs @@ -0,0 +1,47 @@ +using AssetStoreTools.Validator.UI.Data; +using System.Linq; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorResultsElement : ScrollView + { + private IValidatorResults _results; + + public ValidatorResultsElement(IValidatorResults results) + { + AddToClassList("validator-test-list"); + + _results = results; + _results.OnResultsChanged += ResultsChanged; + + Create(); + } + + private void Create() + { + var groups = _results.GetSortedTestGroups().ToList(); + for (int i = 0; i < groups.Count; i++) + { + var groupElement = new ValidatorTestGroupElement(groups[i]); + Add(groupElement); + if (i != groups.Count - 1) + Add(CreateSeparator()); + } + } + + private void ResultsChanged() + { + Clear(); + Create(); + } + + private VisualElement CreateSeparator() + { + var groupSeparator = new VisualElement { name = "GroupSeparator" }; + groupSeparator.AddToClassList("validator-test-list-group-separator"); + + return groupSeparator; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs.meta new file mode 100644 index 00000000..9c934329 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 12f80f9088944a149a34b3f078ca859a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorResultsElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs new file mode 100644 index 00000000..b3f69d75 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs @@ -0,0 +1,96 @@ +using AssetStoreTools.Validator.UI.Data; +using UnityEditor.UIElements; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorSettingsElement : VisualElement + { + // Data + private IValidatorSettings _settings; + + // UI + private ToolbarMenu _categoryMenu; + private ValidatorPathsElement _validationPathsElement; + + public ValidatorSettingsElement(IValidatorSettings settings) + { + AddToClassList("validator-settings"); + + _settings = settings; + _settings.OnCategoryChanged += CategoryChanged; + + Create(); + Deserialize(); + } + + public void Create() + { + CreateCategorySelection(); + CreateValidationPathSelection(); + } + + private void CreateCategorySelection() + { + var categorySelectionBox = new VisualElement(); + categorySelectionBox.AddToClassList("validator-settings-selection-row"); + + VisualElement labelHelpRow = new VisualElement(); + labelHelpRow.AddToClassList("validator-settings-selection-label-help-row"); + + Label categoryLabel = new Label { text = "Category" }; + Image categoryLabelTooltip = new Image + { + tooltip = "Choose a base category of your package" + + "\n\nThis can be found in the Publishing Portal when creating the package listing or just " + + "selecting a planned one." + + "\n\nNote: Different categories could have different severities of several test cases." + }; + + labelHelpRow.Add(categoryLabel); + labelHelpRow.Add(categoryLabelTooltip); + + _categoryMenu = new ToolbarMenu { name = "CategoryMenu" }; + _categoryMenu.AddToClassList("validator-settings-selection-dropdown"); + + categorySelectionBox.Add(labelHelpRow); + categorySelectionBox.Add(_categoryMenu); + + // Append available categories + var categories = _settings.GetAvailableCategories(); + foreach (var category in categories) + { + _categoryMenu.menu.AppendAction(category, _ => _settings.SetActiveCategory(category)); + } + + // Append misc category + _categoryMenu.menu.AppendAction("Other", _ => _settings.SetActiveCategory(string.Empty)); + + Add(categorySelectionBox); + } + + private void CreateValidationPathSelection() + { + _validationPathsElement = new ValidatorPathsElement(_settings); + Add(_validationPathsElement); + } + + private void CategoryChanged() + { + var category = _settings.GetActiveCategory(); + if (!string.IsNullOrEmpty(category)) + _categoryMenu.text = category; + else + _categoryMenu.text = "Other"; + } + + private void Deserialize() + { + if (_settings == null) + return; + + // Set initial category + CategoryChanged(); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs.meta new file mode 100644 index 00000000..3ffe0c88 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 760d25556d755d544bece3a605adea09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorSettingsElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs new file mode 100644 index 00000000..c477c72b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs @@ -0,0 +1,239 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.UI.Data; +using AssetStoreTools.Validator.Utility; +using System.Linq; +using UnityEditor.SceneManagement; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.SceneManagement; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorTestElement : VisualElement + { + // Data + private IValidatorTest _test; + private bool _isExpanded; + + // UI + private Button _testFoldoutButton; + private Label _testFoldoutExpandStateLabel; + private Label _testFoldoutLabel; + private Image _testStatusImage; + + private VisualElement _testContent; + private VisualElement _resultMessagesBox; + + public ValidatorTestElement(IValidatorTest test) + { + AddToClassList("validator-test"); + + _test = test; + + Create(); + Unexpand(); + + SubscribeToSceneChanges(); + } + + private void Create() + { + CreateFoldoutButton(); + CreateTestContent(); + CreateTestDescription(); + CreateTestMessages(); + } + + private void CreateFoldoutButton() + { + _testFoldoutButton = new Button(ToggleExpand) { name = _test.Name }; + _testFoldoutButton.AddToClassList("validator-test-foldout"); + + // Expander and Asset Label + VisualElement labelExpanderRow = new VisualElement { name = "labelExpanderRow" }; + labelExpanderRow.AddToClassList("validator-test-expander"); + + _testFoldoutExpandStateLabel = new Label { name = "ExpanderLabel", text = "►" }; + _testFoldoutExpandStateLabel.AddToClassList("validator-test-expander-arrow"); + + _testFoldoutLabel = new Label { name = "TestLabel", text = _test.Name }; + _testFoldoutLabel.AddToClassList("validator-text-expander-label"); + + labelExpanderRow.Add(_testFoldoutExpandStateLabel); + labelExpanderRow.Add(_testFoldoutLabel); + + _testStatusImage = new Image + { + name = "TestImage", + image = ValidatorUtility.GetStatusTexture(_test.Result.Status) + }; + + _testStatusImage.AddToClassList("validator-test-expander-image"); + + _testFoldoutButton.Add(labelExpanderRow); + _testFoldoutButton.Add(_testStatusImage); + + Add(_testFoldoutButton); + } + + private void CreateTestContent() + { + _testContent = new VisualElement(); + _testContent.AddToClassList("validator-test-content"); + Add(_testContent); + } + + private void CreateTestDescription() + { + var testCaseDescription = new TextField + { + name = "Description", + value = _test.Description, + isReadOnly = true, + multiline = true, + focusable = false, + doubleClickSelectsWord = false, + tripleClickSelectsLine = false + }; + testCaseDescription.AddToClassList("validator-test-content-textfield"); + +#if UNITY_2022_1_OR_NEWER + testCaseDescription.focusable = true; + testCaseDescription.selectAllOnFocus = false; + testCaseDescription.selectAllOnMouseUp = false; +#endif + + _testContent.Add(testCaseDescription); + } + + private void CreateTestMessages() + { + if (_test.Result.MessageCount == 0) + return; + + _resultMessagesBox = new VisualElement(); + _resultMessagesBox.AddToClassList("validator-test-content-result-messages"); + + switch (_test.Result.Status) + { + case TestResultStatus.Pass: + _resultMessagesBox.AddToClassList("validator-test-content-result-messages-pass"); + break; + case TestResultStatus.Warning: + _resultMessagesBox.AddToClassList("validator-test-content-result-messages-warning"); + break; + case TestResultStatus.Fail: + _resultMessagesBox.AddToClassList("validator-test-content-result-messages-fail"); + break; + } + + for (int i = 0; i < _test.Result.MessageCount; i++) + { + _resultMessagesBox.Add(CreateMessage(_test.Result.GetMessage(i))); + + if (i == _test.Result.MessageCount - 1) + continue; + + var separator = new VisualElement() { name = "Separator" }; + separator.AddToClassList("message-separator"); + _resultMessagesBox.Add(separator); + } + + _testContent.Add(_resultMessagesBox); + } + + private VisualElement CreateMessage(TestResultMessage message) + { + var resultText = message.GetText(); + var clickAction = message.GetClickAction(); + + var resultMessage = new VisualElement { name = "ResultMessageElement" }; + resultMessage.AddToClassList("validator-test-content-result-messages-content"); + + var informationButton = new Button(); + informationButton.AddToClassList("validator-test-content-result-messages-content-button"); + + if (clickAction != null) + { + informationButton.tooltip = clickAction.Tooltip; + informationButton.clicked += clickAction.Execute; + informationButton.SetEnabled(true); + } + + var informationDescription = new Label { name = "InfoDesc", text = resultText }; + informationDescription.AddToClassList("validator-test-content-result-messages-content-label"); + + informationButton.Add(informationDescription); + resultMessage.Add(informationButton); + + for (int i = 0; i < message.MessageObjectCount; i++) + { + var obj = message.GetMessageObject(i); + if (obj == null) + continue; + + if (obj.GetObject() == null) + continue; + + var objectField = new ObjectField() { objectType = obj.GetType(), value = obj.GetObject() }; + objectField.RegisterCallback>((evt) => + objectField.SetValueWithoutNotify(evt.previousValue)); + resultMessage.Add(objectField); + } + + return resultMessage; + } + + private void ToggleExpand() + { + if (!_isExpanded) + Expand(); + else + Unexpand(); + } + + private void Expand() + { + _testFoldoutExpandStateLabel.text = "▼"; + _testFoldoutButton.AddToClassList("validator-test-foldout-expanded"); + _testContent.style.display = DisplayStyle.Flex; + _isExpanded = true; + } + + private void Unexpand() + { + _testFoldoutExpandStateLabel.text = "►"; + _testFoldoutButton.RemoveFromClassList("validator-test-foldout-expanded"); + _testContent.style.display = DisplayStyle.None; + _isExpanded = false; + } + + private void SubscribeToSceneChanges() + { + // Some result message objects only exist in specific scenes, + // therefore the UI must be refreshed on scene change + var windowToSubscribeTo = Resources.FindObjectsOfTypeAll().FirstOrDefault(); + UnityAction sceneChanged = null; + sceneChanged = new UnityAction((_, __) => RefreshObjects(windowToSubscribeTo)); + EditorSceneManager.activeSceneChangedInEditMode += sceneChanged; + + void RefreshObjects(ValidatorWindow subscribedWindow) + { + // Remove callback if validator window instance changed + var activeWindow = Resources.FindObjectsOfTypeAll().FirstOrDefault(); + if (subscribedWindow == null || subscribedWindow != activeWindow) + { + EditorSceneManager.activeSceneChangedInEditMode -= sceneChanged; + return; + } + + if (_resultMessagesBox != null) + _testContent.Remove(_resultMessagesBox); + + CreateTestMessages(); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs.meta new file mode 100644 index 00000000..dc3393cf --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 56c93e6f23ba5724da8cc38f832be4e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs new file mode 100644 index 00000000..7906a0dd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs @@ -0,0 +1,102 @@ +using AssetStoreTools.Validator.UI.Data; +using AssetStoreTools.Validator.Utility; +using System.Collections.Generic; +using System.Linq; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Elements +{ + internal class ValidatorTestGroupElement : VisualElement + { + // Data + private IValidatorTestGroup _group; + private bool _isExpanded; + + // UI + private Button _groupFoldoutButton; + private Label _groupExpandStateLabel; + private Label _groupFoldoutLabel; + private Image _groupStatusImage; + + private VisualElement _groupContent; + private List _testElements; + + public ValidatorTestGroupElement(IValidatorTestGroup group) + { + AddToClassList("validator-test-list-group"); + + _group = group; + + Create(); + } + + private void Create() + { + CreateGroupFoldout(); + CreateGroupContent(); + } + + private void CreateGroupFoldout() + { + _groupFoldoutButton = new Button(ToggleExpand); + _groupFoldoutButton.AddToClassList("validator-test-list-group-expander"); + + _groupExpandStateLabel = new Label { name = "ExpanderLabel", text = "►" }; + _groupExpandStateLabel.AddToClassList("validator-test-list-group-expander-arrow"); + + _groupStatusImage = new Image + { + name = "TestImage", + image = ValidatorUtility.GetStatusTexture(_group.Status) + }; + _groupStatusImage.AddToClassList("validator-test-list-group-expander-image"); + + _groupFoldoutLabel = new Label() { text = $"{_group.Name} ({_group.Tests.Count()})" }; + _groupFoldoutLabel.AddToClassList("validator-test-list-group-expander-label"); + + _groupFoldoutButton.Add(_groupExpandStateLabel); + _groupFoldoutButton.Add(_groupStatusImage); + _groupFoldoutButton.Add(_groupFoldoutLabel); + + Add(_groupFoldoutButton); + } + + private void CreateGroupContent() + { + _groupContent = new VisualElement(); + _groupContent.AddToClassList("validator-test-list-group-content"); + + Add(_groupContent); + + _testElements = new List(); + foreach (var test in _group.Tests) + { + var testElement = new ValidatorTestElement(test); + _testElements.Add(testElement); + _groupContent.Add(testElement); + } + } + + private void ToggleExpand() + { + if (!_isExpanded) + Expand(); + else + Unexpand(); + } + + private void Expand() + { + _groupExpandStateLabel.text = "▼"; + _groupContent.style.display = DisplayStyle.Flex; + _isExpanded = true; + } + + private void Unexpand() + { + _groupExpandStateLabel.text = "►"; + _groupContent.style.display = DisplayStyle.None; + _isExpanded = false; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs.meta new file mode 100644 index 00000000..40067410 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d7c7a8788d0ea324e843a475244d8e18 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Elements/ValidatorTestGroupElement.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs new file mode 100644 index 00000000..cea8163d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs @@ -0,0 +1,56 @@ +using AssetStoreTools.Utility; +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services; +using AssetStoreTools.Validator.UI.Views; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI +{ + + internal class ValidatorWindow : AssetStoreToolsWindow + { + protected override string WindowTitle => "Asset Store Validator"; + + private ICachingService _cachingService; + + private ValidatorTestsView _validationTestsView; + + protected override void Init() + { + minSize = new Vector2(350, 350); + + this.SetAntiAliasing(4); + + VisualElement root = rootVisualElement; + + // Clean it out, in case the window gets initialized again + root.Clear(); + + // Getting a reference to the USS Document and adding stylesheet to the root + root.styleSheets.Add(StyleSelector.ValidatorWindow.ValidatorWindowStyle); + root.styleSheets.Add(StyleSelector.ValidatorWindow.ValidatorWindowTheme); + + GetServices(); + ConstructWindow(); + } + + private void GetServices() + { + _cachingService = ValidatorServiceProvider.Instance.GetService(); + } + + private void ConstructWindow() + { + _validationTestsView = new ValidatorTestsView(_cachingService); + rootVisualElement.Add(_validationTestsView); + } + + public void Load(ValidationSettings settings, ValidationResult result) + { + _validationTestsView.LoadSettings(settings); + _validationTestsView.LoadResult(result); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs.meta new file mode 100644 index 00000000..e7a381b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: a0dc99b826513dd4f868f1cf405c3923 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/ValidatorWindow.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views.meta new file mode 100644 index 00000000..e90db603 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8a973656ad14b8941b790ed83c874e97 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs new file mode 100644 index 00000000..b25a8b44 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs @@ -0,0 +1,103 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services; +using AssetStoreTools.Validator.UI.Data; +using AssetStoreTools.Validator.UI.Data.Serialization; +using AssetStoreTools.Validator.UI.Elements; +using UnityEditor; +using UnityEngine.UIElements; + +namespace AssetStoreTools.Validator.UI.Views +{ + internal class ValidatorTestsView : VisualElement + { + // Data + private ValidatorStateData _stateData; + private IValidatorSettings _settings; + private IValidatorResults _results; + + private ICachingService _cachingService; + + // UI + private ValidatorSettingsElement _validatorSettingsElement; + private ValidatorButtonElement _validatorButtonElement; + private ValidatorResultsElement _validationTestListElement; + + public ValidatorTestsView(ICachingService cachingService) + { + _cachingService = cachingService; + + if (!_cachingService.GetCachedValidatorStateData(out _stateData)) + _stateData = new ValidatorStateData(); + + _settings = new ValidatorSettings(_stateData.GetSettings()); + _settings.OnRequireSerialize += Serialize; + + _results = new ValidatorResults(_settings, _stateData.GetResults()); + _results.OnRequireSerialize += Serialize; + + Create(); + } + + private void Create() + { + CreateValidatorDescription(); + CreateValidationSettings(); + CreateValidationButton(); + CreateValidatorResults(); + } + + private void CreateValidatorDescription() + { + var validationInfoElement = new ValidatorDescriptionElement(); + Add(validationInfoElement); + } + + private void CreateValidationSettings() + { + _validatorSettingsElement = new ValidatorSettingsElement(_settings); + Add(_validatorSettingsElement); + } + + private void CreateValidationButton() + { + _validatorButtonElement = new ValidatorButtonElement(_settings); + _validatorButtonElement.OnValidate += Validate; + Add(_validatorButtonElement); + } + + private void CreateValidatorResults() + { + _validationTestListElement = new ValidatorResultsElement(_results); + Add(_validationTestListElement); + } + + private void Validate() + { + var validator = _settings.CreateValidator(); + var result = validator.Validate(); + + if (result.Status == ValidationStatus.Failed) + { + EditorUtility.DisplayDialog("Validation failed", result.Exception.Message, "OK"); + return; + } + + LoadResult(result); + } + + public void LoadSettings(ValidationSettings settings) + { + _settings.LoadSettings(settings); + } + + public void LoadResult(ValidationResult result) + { + _results.LoadResult(result); + } + + private void Serialize() + { + _cachingService.CacheValidatorStateData(_stateData); + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs.meta new file mode 100644 index 00000000..cb6bfb46 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: c5e0da39c6638684c9d3faf8e62c60d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/UI/Views/ValidatorTestsView.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility.meta new file mode 100644 index 00000000..148dca9d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3bc3a78a4b494e44b75268ad1444ab81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs new file mode 100644 index 00000000..0d58db5c --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs @@ -0,0 +1,142 @@ +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services; +using AssetStoreTools.Validator.TestDefinitions; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; +using static AssetStoreTools.Constants; +using ValidatorConstants = AssetStoreTools.Constants.Validator; + +namespace AssetStoreTools.Validator.Utility +{ + internal static class ValidatorUtility + { + public enum SortType + { + Id, + Alphabetical + } + + public static ValidationTestScriptableObject[] GetAutomatedTestCases() => GetAutomatedTestCases(SortType.Id); + + public static ValidationTestScriptableObject[] GetAutomatedTestCases(SortType sortType) + { + string[] guids = AssetDatabase.FindAssets("t:AutomatedTestScriptableObject", new[] { ValidatorConstants.Tests.TestDefinitionsPath }); + ValidationTestScriptableObject[] tests = new ValidationTestScriptableObject[guids.Length]; + for (int i = 0; i < tests.Length; i++) + { + string testPath = AssetDatabase.GUIDToAssetPath(guids[i]); + AutomatedTestScriptableObject test = AssetDatabase.LoadAssetAtPath(testPath); + + tests[i] = test; + } + + switch (sortType) + { + default: + case SortType.Id: + tests = tests.Where(x => x != null).OrderBy(x => x.Id).ToArray(); + break; + case SortType.Alphabetical: + tests = tests.Where(x => x != null).OrderBy(x => x.Title).ToArray(); + break; + } + + return tests; + } + + public static MonoScript GenerateTestScript(string testName, ValidationType validationType) + { + var derivedType = nameof(ITestScript); + var configType = string.Empty; + var scriptPath = string.Empty; + switch (validationType) + { + case ValidationType.Generic: + configType = nameof(GenericTestConfig); + scriptPath = ValidatorConstants.Tests.GenericTestMethodsPath; + break; + case ValidationType.UnityPackage: + configType = nameof(GenericTestConfig); + scriptPath = ValidatorConstants.Tests.UnityPackageTestMethodsPath; + break; + default: + throw new System.Exception("Undefined validation type"); + } + + var newScriptPath = $"{scriptPath}/{testName}"; + if (!newScriptPath.EndsWith(".cs")) + newScriptPath += ".cs"; + + var existingScript = AssetDatabase.LoadAssetAtPath(newScriptPath); + if (existingScript != null) + return existingScript; + + var scriptContent = + $"using AssetStoreTools.Validator.Data;\n" + + $"using AssetStoreTools.Validator.TestDefinitions;\n\n" + + $"namespace AssetStoreTools.Validator.TestMethods\n" + + $"{{\n" + + $" internal class {testName} : {derivedType}\n" + + $" {{\n" + + $" private {configType} _config;\n\n" + + $" // Constructor also accepts dependency injection of registered {nameof(IValidatorService)} types\n" + + $" public {testName}({configType} config)\n" + + $" {{\n" + + $" _config = config;\n" + + $" }}\n\n" + + $" public {nameof(TestResult)} {nameof(ITestScript.Run)}()\n" + + $" {{\n" + + $" var result = new {nameof(TestResult)}() {{ {nameof(TestResult.Status)} = {nameof(TestResultStatus)}.{nameof(TestResultStatus.Undefined)} }};\n" + + $" return result;\n" + + $" }}\n" + + $" }}\n" + + $"}}\n"; + + File.WriteAllText(newScriptPath, scriptContent); + AssetDatabase.Refresh(); + return AssetDatabase.LoadAssetAtPath(newScriptPath); + } + + public static string GetLongestProjectPath() + { + var longPaths = GetProjectPaths(new string[] { "Assets", "Packages" }); + return longPaths.Aggregate("", (max, cur) => max.Length > cur.Length ? max : cur); + } + + public static IEnumerable GetProjectPaths(string[] rootPaths) + { + var longPaths = new List(); + var guids = AssetDatabase.FindAssets("*", rootPaths); + + foreach (var guid in guids) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + longPaths.Add(path); + } + + return longPaths; + } + + public static Texture GetStatusTexture(TestResultStatus status) + { + var iconTheme = ""; + if (!EditorGUIUtility.isProSkin) + iconTheme = "_d"; + + switch (status) + { + case TestResultStatus.Pass: + return (Texture)EditorGUIUtility.Load($"{WindowStyles.ValidatorIconsPath}/success{iconTheme}.png"); + case TestResultStatus.Warning: + return (Texture)EditorGUIUtility.Load($"{WindowStyles.ValidatorIconsPath}/warning{iconTheme}.png"); + case TestResultStatus.Fail: + return (Texture)EditorGUIUtility.Load($"{WindowStyles.ValidatorIconsPath}/error{iconTheme}.png"); + default: + return (Texture)EditorGUIUtility.Load($"{WindowStyles.ValidatorIconsPath}/undefined{iconTheme}.png"); + } + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs.meta new file mode 100644 index 00000000..0c75432e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 24792af98b4d87746a4b945e2a45dc2d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/Utility/ValidatorUtility.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs new file mode 100644 index 00000000..e65f137f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs @@ -0,0 +1,108 @@ +using AssetStoreTools.Validator.Categories; +using AssetStoreTools.Validator.Data; +using AssetStoreTools.Validator.Services; +using AssetStoreTools.Validator.TestDefinitions; +using AssetStoreTools.Validator.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AssetStoreTools.Validator +{ + internal abstract class ValidatorBase : IValidator + { + public ValidationSettings Settings { get; private set; } + + private CategoryEvaluator _categoryEvaluator; + private List _automatedTests; + + protected ICachingService CachingService; + + public ValidatorBase(ValidationSettings settings) + { + Settings = settings; + _categoryEvaluator = new CategoryEvaluator(settings?.Category); + + CachingService = ValidatorServiceProvider.Instance.GetService(); + + CreateAutomatedTestCases(); + } + + private void CreateAutomatedTestCases() + { + var testData = ValidatorUtility.GetAutomatedTestCases(ValidatorUtility.SortType.Alphabetical); + _automatedTests = new List(); + + foreach (var t in testData) + { + var test = new AutomatedTest(t); + _automatedTests.Add(test); + } + } + + protected abstract void ValidateSettings(); + protected abstract ValidationResult GenerateValidationResult(); + + public ValidationResult Validate() + { + try + { + ValidateSettings(); + } + catch (Exception e) + { + return new ValidationResult() { Status = ValidationStatus.Failed, Exception = e }; + } + + var result = GenerateValidationResult(); + return result; + } + + protected List GetApplicableTests(params ValidationType[] validationTypes) + { + return _automatedTests.Where(x => validationTypes.Any(y => y == x.ValidationType)).ToList(); + } + + protected ValidationResult RunTests(List tests, ITestConfig config) + { + var completedTests = new List(); + + for (int i = 0; i < tests.Count; i++) + { + var test = tests[i]; + + EditorUtility.DisplayProgressBar("Validating", $"Running validation: {i + 1} - {test.Title}", (float)i / _automatedTests.Count); + + test.Run(config); + + // Adjust result based on categories + var updatedStatus = _categoryEvaluator.Evaluate(test); + test.Result.Status = updatedStatus; + + // Add the result + completedTests.Add(test); + +#if AB_BUILDER + EditorUtility.UnloadUnusedAssetsImmediate(); +#endif + } + + EditorUtility.UnloadUnusedAssetsImmediate(); + EditorUtility.ClearProgressBar(); + + var projectPath = Application.dataPath.Substring(0, Application.dataPath.Length - "/Assets".Length); + var hasCompilationErrors = EditorUtility.scriptCompilationFailed; + var result = new ValidationResult() + { + Status = ValidationStatus.RanToCompletion, + Tests = completedTests, + ProjectPath = projectPath, + HadCompilationErrors = hasCompilationErrors + }; + + return result; + } + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs.meta new file mode 100644 index 00000000..a1f39f01 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2360246050affaa458413c6569c1f925 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Scripts/ValidatorBase.cs + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles.meta new file mode 100644 index 00000000..a5cbef6e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 21f473cb130d5f0458b2823b3a67f789 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss new file mode 100644 index 00000000..4a79ecdd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss @@ -0,0 +1,337 @@ +/* Validator Description */ + +.validator-description { + flex-direction: column; + flex-shrink: 0; + + margin: 10px 5px 2px 5px; + padding: 2px 4px; +} + +.validator-description-simple-container { + flex-direction: column; + flex-wrap: wrap; +} + +.validator-description-simple-label { + white-space: normal; +} + +.validator-description-full-container { + margin-top: 12px; +} + +.validator-description-full-label { + white-space: normal; + margin-bottom: 10px; +} + +.validator-description-hyperlink-button { + margin: 0; + padding: 0; + + align-self: flex-start; + cursor: link; +} + +.validator-description-show-button { + margin-top: 12px; +} + +.validator-description-hide-button { + margin-top: 12px; +} + +/* Validator Settings */ + +.validator-settings { + flex-direction: column; + flex-shrink: 0; + + margin: 0px 5px 2px 5px; + padding: 2px 4px; +} + +.validator-settings-selection-row { + flex-direction: row; + flex-grow: 1; + + margin-top: 10px; + padding: 0 3px 0 2px; +} + +.validator-settings-selection-label-help-row { + flex-direction: row; + flex-shrink: 1; + flex-grow: 0; + + align-self: center; + align-items: center; + justify-content: flex-start; + + width: 120px; +} + +.validator-settings-selection-label-help-row > Label { + -unity-font-style: bold; +} + +.validator-settings-selection-label-help-row > Image { + height: 16px; + width: 16px; +} + +.validator-settings-selection-dropdown { + flex-grow: 1; + flex-shrink: 1; + + align-self: stretch; + + margin-right: 0; + margin-left: 3px; + padding: 1px 4px; +} + +/* Validate Button */ + +.validator-validate-button { + align-self: stretch; + + height: 25px; + margin-left: 2px; +} + +/* Validation Paths */ + +.validator-paths { + flex-direction: column; + flex-grow: 1; + flex-shrink: 0; + + margin-bottom: 10px; + padding: 0; +} + +.validator-paths-box { + flex-grow: 1; + flex-direction: column; +} + +.validator-paths-scroll-view { + flex-grow: 1; + height: 100px; + margin-left: 3px; +} + +.validator-paths-scroll-view > .unity-scroll-view__content-viewport +{ + margin-left: 1px; +} + +.validator-paths-scroll-view > * > .unity-scroll-view__content-container +{ + padding: 0 0 0 0; +} + +.validator-paths-scroll-view > * > .unity-scroll-view__vertical-scroller +{ + margin: -1px 0; +} + +.validator-paths-scroll-view-bottom-row { + flex-direction: row-reverse; + margin: -1px 0 0 3px; +} + +.validator-paths-add-button { + margin: 3px 0 0 0; + align-self: center; +} + +.validator-paths-path-row { + flex-direction: row; + flex-grow: 1; + + margin-top: 2px; + padding: 0 5px 0 2px; +} + +.validator-paths-path-row-input-field { + flex-grow: 1; + flex-shrink: 1; + + padding-left: 5px; + + white-space: normal; + -unity-text-align: middle-left; +} + +.validator-paths-path-row-remove-button { + width: 20px; + height: 20px; + margin-left: 2px; + margin-right: 1px; + padding: 1px 0 0 0; +} + +/* Tests List & Groups */ + +.validator-test-list { + flex-grow: 1; + flex-shrink: 1; +} + +.validator-test-list-group-separator { + height: 2px; + margin: 5px 15px; +} + +.validator-test-list-group { + overflow: hidden; +} + +.validator-test-list-group-expander { + flex-direction: row; + flex-grow: 0; + flex-shrink: 0; + + align-items: center; + + min-width: 200px; + min-height: 30px; + + margin: 10px -1px 2px -1px; +} + +.validator-test-list-group-expander-arrow { + align-self: center; + + width: 30px; + height: 30px; + + margin: 0; + padding: 0; +} + +.validator-test-list-group-expander-image { + flex-shrink: 0; + flex-grow: 0; + + width: 17px; + height: 17px; + + margin: 0 7px 0 2px; +} + +.validator-test-list-group-expander-label { + font-size: 14px; +} + +.validator-test-list-group-content { + margin: -2px -2px -2px -2px; +} + +/* Validation Test */ + +.validator-test { + flex-direction: column; + flex-shrink: 0; + flex-grow: 0; + + padding: 2px 0; +} + +.validator-test-foldout { + flex-direction: row; + flex-grow: 1; + flex-shrink: 1; + + align-items: center; + justify-content: space-between; + + min-width: 200px; + min-height: 35px; + + margin: 0; + padding: 5px 10px; +} + +.validator-test-expander { + flex-direction: row; + flex-grow: 1; +} + +.validator-test-expander-arrow { + font-size: 11px; + align-self: center; + + width: 30px; + height: 30px; + + margin: 0; + padding: 0; +} + +.validator-text-expander-label { + flex-grow: 1; + flex-shrink: 1; + + -unity-text-align: middle-left; + -unity-font-style: bold; + white-space: normal; +} + +.validator-test-expander-image { + flex-shrink: 0; + + width: 14px; + height: 14px; + + margin: 0 10px; +} + +.validator-test-content { + flex-grow: 1; + flex-shrink: 0; + + margin: 0; + padding: 5px 30px; +} + +.validator-test-content-textfield { + white-space: normal; +} + +.validator-test-content-result-messages { + flex-direction: column; + flex-shrink: 0; + flex-grow: 0; + + margin: 10px 0 5px 0; + padding: 0 3px 3px 3px; +} + +.validator-test-content-result-messages-content { + flex-basis: auto; + flex-direction: column; + + margin-top: 3px; +} + +.validator-test-content-result-messages-content-button { + align-self: stretch; + + -unity-font-style: normal; + -unity-text-align: middle-left; + + margin: 0; +} + +.validator-test-content-result-messages-content-label { + white-space: normal; +} + +.validator-test-content-result-messages-separator { + height: 3px; + margin: 5px -3px 0 -3px; +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss.meta new file mode 100644 index 00000000..344d5f67 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 2c67a10c292c653428af654599fc15aa +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Styles/Style.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss new file mode 100644 index 00000000..47c13ea1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss @@ -0,0 +1,166 @@ +.primary-colors +{ + /* Light - lighter */ + background-color: rgb(220, 220, 220); + /* Light - middle */ + background-color: rgb(200, 200, 200); + /* Light - darker */ + background-color: rgb(180, 180, 180); + + /* Dark - lighter */ + background-color: rgb(78, 78, 78); + /* Dark - middle */ + background-color: rgb(68, 68, 68); + /* Dark - darker */ + background-color: rgb(58, 58, 58); + + /* Border color - light */ + border-color: rgb(200, 200, 200); + /* Border color - dark */ + border-color: rgb(33, 33, 33); +} + +/* Validator Description */ + +.validator-description-hyperlink-button { + color: rgb(68, 113, 229); + border-width: 0; + background-color: rgba(0, 0, 0, 0); +} + +.validator-description-hyperlink-button:hover { + color: rgb(68, 133, 229); +} + +.validator-description-hyperlink-button:active { + color: rgb(68, 93, 229); +} + +/* Validator Settings */ + +.validator-settings-selection-label-help-row > Image { + --unity-image: resource("d__Help@2x"); +} + +.validator-settings-selection-dropdown { + color: rgb(238, 238, 238); + background-color: rgb(88, 88, 88); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(36, 36, 36); +} + +/* Validation Paths */ + +.validator-paths-scroll-view { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(58, 58, 58); +} + +.validator-paths-scroll-view > * > .unity-scroll-view__vertical-scroller { + border-right-width: 0; +} + +.validator-paths-path-row-input-field:hover { + background-color: rgb(78, 78, 78); +} + +/* Tests List & Groups */ + +.validator-test-list { + flex-grow: 1; + flex-shrink: 1; +} + +.validator-test-list-group-separator { + background-color: rgb(104, 104, 104); +} + +.validator-test-list-group-expander { + border-width: 0; + border-color: rgba(0, 0, 0, 0); + + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-list-group-expander-arrow { + color: rgb(104, 104, 104); +} + +.validator-test-list-group-expander-label { + color: rgb(255, 255, 255); + -unity-font-style: bold; +} + +/* Validation Test */ + +.validator-test-foldout { + border-width: 0; + border-radius: 0; + background-color: rgb(56, 56, 56); +} + +.validator-test-foldout:hover { + background-color: rgb(68, 68, 68); +} + +.validator-test-foldout:active { + background-color: rgb(48, 48, 48); +} + +.validator-test-foldout-expanded { + background-color: rgb(68, 68, 68); +} + +.validator-test-expander-arrow { + color: rgb(104, 104, 104); +} + +.validator-test-content { + background-color: rgb(68, 68, 68); +} + +.validator-test-content-textfield > .unity-base-field__input { + border-width: 0; + border-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-content-result-messages { + border-left-width: 2px; + border-color: rgb(33, 33, 33); + background-color: rgb(58, 58, 58); +} + +.validator-test-content-result-messages-pass { + border-color: rgb(40, 200, 40); +} + +.validator-test-content-result-messages-warning { + border-color: rgb(200, 140, 40); +} + +.validator-test-content-result-messages-fail { + border-color: rgb(200, 40, 40); +} + +.validator-test-content-result-messages-content-button { + border-width: 0; + border-radius: 0; + + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-content-result-messages-content-button:hover { + background-color: rgb(78, 78, 78); +} + +.validator-test-content-result-messages-content-button:active { + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-content-result-messages-separator { + background-color: rgb(68, 68, 68); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss.meta new file mode 100644 index 00000000..5c5344d2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: d09164f0be2befd40aac764571737ff7 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeDark.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss new file mode 100644 index 00000000..2c29c721 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss @@ -0,0 +1,166 @@ +.primary-colors +{ + /* Light - lighter */ + background-color: rgb(220, 220, 220); + /* Light - middle */ + background-color: rgb(200, 200, 200); + /* Light - darker */ + background-color: rgb(180, 180, 180); + + /* Dark - lighter */ + background-color: rgb(50, 50, 50); + /* Dark - middle */ + background-color: rgb(28, 28, 28); + /* Dark - darker */ + background-color: rgb(0, 0, 0); + + /* Border color - light */ + border-color: rgb(200, 200, 200); + /* Border color - dark */ + border-color: rgb(33, 33, 33); +} + +/* Validator Description */ + +.validator-description-hyperlink-button { + color: rgb(68, 113, 229); + border-width: 0; + background-color: rgba(0, 0, 0, 0); +} + +.validator-description-hyperlink-button:hover { + color: rgb(68, 133, 229); +} + +.validator-description-hyperlink-button:active { + color: rgb(68, 93, 229); +} + +/* Validator Settings */ + +.validator-settings-selection-label-help-row > Image { + --unity-image: resource("_Help@2x"); +} + +.validator-settings-selection-dropdown { + color: rgb(9, 9, 9); + background-color: rgb(228, 228, 228); + + border-width: 1px; + border-radius: 3px; + border-color: rgb(178, 178, 178); +} + +/* Validation Paths */ + +.validator-paths-scroll-view { + border-width: 1px; + border-color: rgb(33, 33, 33); + background-color: rgb(180, 180, 180); +} + +.validator-paths-scroll-view > * > .unity-scroll-view__vertical-scroller { + border-right-width: 0; +} + +.validator-paths-path-row-input-field:hover { + background-color: rgb(200, 200, 200); +} + +/* Tests List & Groups */ + +.validator-test-list { + flex-grow: 1; + flex-shrink: 1; +} + +.validator-test-list-group-separator { + background-color: rgb(77, 77, 77); +} + +.validator-test-list-group-expander { + border-width: 0; + border-color: rgba(0, 0, 0, 0); + + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-list-group-expander-arrow { + color: rgb(77, 77, 77); +} + +.validator-test-list-group-expander-label { + color: rgb(48, 48, 48); + -unity-font-style: bold; +} + +/* Validation Test */ + +.validator-test-foldout { + border-width: 0; + border-radius: 0; + background-color: rgb(198, 198, 198); +} + +.validator-test-foldout:hover { + background-color: rgb(212, 212, 212); +} + +.validator-test-foldout:active { + background-color: rgb(180, 180, 180); +} + +.validator-test-foldout-expanded { + background-color: rgb(212, 212, 212); +} + +.validator-test-expander-arrow { + color: rgb(77, 77, 77); +} + +.validator-test-content { + background-color: rgb(212, 212, 212); +} + +.validator-test-content-textfield > .unity-base-field__input { + border-width: 0; + border-color: rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-content-result-messages { + border-left-width: 2px; + border-color: rgb(33, 33, 33); + background-color: rgb(198, 198, 198); +} + +.validator-test-content-result-messages-pass { + border-color: rgb(40, 200, 40); +} + +.validator-test-content-result-messages-warning { + border-color: rgb(200, 140, 40); +} + +.validator-test-content-result-messages-fail { + border-color: rgb(200, 40, 40); +} + +.validator-test-content-result-messages-content-button { + border-width: 0; + border-radius: 0; + + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-content-result-messages-content-button:hover { + background-color: rgb(212, 212, 212); +} + +.validator-test-content-result-messages-content-button:active { + background-color: rgba(0, 0, 0, 0); +} + +.validator-test-content-result-messages-separator { + background-color: rgb(212, 212, 212); +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss.meta new file mode 100644 index 00000000..e2acc316 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 7404a65e6f9592846a20fd5190b12b1a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Styles/ThemeLight.uss + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests.meta new file mode 100644 index 00000000..45154436 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82d68ee644bbbb44183019f731e9f205 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic.meta new file mode 100644 index 00000000..e10e15e0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38036e7f211469848b7cf706e3a1febf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Animation Clips.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Animation Clips.asset new file mode 100644 index 00000000..c9b418f8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Animation Clips.asset @@ -0,0 +1,27 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Animation Clips + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 31 + Title: Check Animation Clips + Description: Animation Clips should not have the default name 'Take 001'. This + could lead to confusion when filtering assets by animation clips. + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 0 + AppliesToSubCategories: 1 + Filter: + - Animation + ValidationType: 0 + TestScript: {fileID: 11500000, guid: 7a28985886f182c4bacc89a44777c742, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Animation Clips.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Animation Clips.asset.meta new file mode 100644 index 00000000..23653ab3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Animation Clips.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: e0426dd01b5136a4ca1d42d312e12fad +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Animation Clips.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Audio Clipping.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Audio Clipping.asset new file mode 100644 index 00000000..356c3aed --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Audio Clipping.asset @@ -0,0 +1,32 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Audio Clipping + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 27 + Title: Check Audio Clipping + Description: 'Audio files should not peak above the defined dB threshold of -0.3db + + + Please + note that lossless audio files that are imported into Unity with their Compression + Format set to anything other than PCM can still fail the Validator. If such cases + arise, please export your audio files with extra headroom, or set the Compression + Format to PCM if applicable.' + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - Audio + TestScript: {fileID: 11500000, guid: f604db0353da0cb46bb048f5cd37186f, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Audio Clipping.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Audio Clipping.asset.meta new file mode 100644 index 00000000..d60afa99 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Audio Clipping.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 03c6cd398931b3e41b0784e8589e153f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Audio Clipping.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Colliders.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Colliders.asset new file mode 100644 index 00000000..079d75b0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Colliders.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Colliders + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 4 + Title: Check Colliders + Description: Prefabs with meshes inside them have to have colliders applied to + them, if the Prefabs are marked as Static. Please make sure you have appropriately + sized colliders applied to your prefabs. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 308b3d7b7a883b949a14f47cfd5c7ebe, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Colliders.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Colliders.asset.meta new file mode 100644 index 00000000..01c62f2a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Colliders.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 28ab5af444cf3c849800ed0d8f4a3102 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Colliders.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Compressed Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Compressed Files.asset new file mode 100644 index 00000000..f8aa71f2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Compressed Files.asset @@ -0,0 +1,31 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Compressed Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 22 + Title: Check Compressed Files + Description: "Package should not contain nested .unitypackage or archive files + that obscure most of, or the entirety of the content.\n\n.unitypackage files + are acceptable for including setup preferences, settings, supplemental files + for other Asset Store products, or alternative render pipeline content\n\n.zip + files are acceptable if they are compressing files that do not natively function + in the Unity Editor. (For example, Blender, HTML Documentation, or Visual Studio + Projects). Such files should include 'source' in the file name (e.g. \"Blender_source.zip\" + or \"PSDSource.zip\")." + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 84b23febe0d923842aef73b95da5f25b, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Compressed Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Compressed Files.asset.meta new file mode 100644 index 00000000..47a8d65f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Compressed Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 53189e6e51235b14192c4d5b3145dd27 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Compressed Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Empty Prefabs.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Empty Prefabs.asset new file mode 100644 index 00000000..6154efa6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Empty Prefabs.asset @@ -0,0 +1,31 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Empty Prefabs + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 5 + Title: Check Empty Prefabs + Description: Prefabs cannot be empty, please make sure that you set up your prefabs. + correctly. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - 2D + - 3D + - Animation + - Essentials + - Templates + - VFX + TestScript: {fileID: 11500000, guid: 8055bed9373283e4793463b90b42f08f, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Empty Prefabs.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Empty Prefabs.asset.meta new file mode 100644 index 00000000..6add0735 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Empty Prefabs.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 08790ea0ed0fd274fb1df75ccc32d415 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Empty Prefabs.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check File Menu Names.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check File Menu Names.asset new file mode 100644 index 00000000..ff0f7a46 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check File Menu Names.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check File Menu Names + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 21 + Title: Check File Menu Names + Description: File menus should be placed under an existing menu, such as "Window/". + If no existing menus are a good fit, they should be placed under a custom menu + called "Tools". + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: d8e3b12ecc1fcd74d9a9f8d2b549fc63, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check File Menu Names.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check File Menu Names.asset.meta new file mode 100644 index 00000000..d3c997fe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check File Menu Names.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: eaf232919893db04b8e05e91f6815424 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + File Menu Names.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check LODs.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check LODs.asset new file mode 100644 index 00000000..2b332d74 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check LODs.asset @@ -0,0 +1,33 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check LODs + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 17 + Title: Check LODs + Description: 'Prefabs containing meshes with ''LOD'' in their name must meet the + following requirements: + + - LOD Mesh must be referenced by an LOD Group Component + + - + LOD Mesh GameObject must be a child of an LOD Group Component.' + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - 3D + - Essentials + - Templates + TestScript: {fileID: 11500000, guid: 43b2158602f87704fa7b91561cfc8678, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check LODs.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check LODs.asset.meta new file mode 100644 index 00000000..56caee22 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check LODs.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: ad52ffa05767e9d4bb4d92093ad68b03 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + LODs.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Line Endings.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Line Endings.asset new file mode 100644 index 00000000..08e94263 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Line Endings.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Line Endings + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 20 + Title: Check Line Endings + Description: Inconsistent line endings in scripts might lead to incorrect line + numbers in stacktraces and compiler errors. Many text editors can fix this using + Convert Line Endings menu commands. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 85885005d1c594f42826de3555e98365, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Line Endings.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Line Endings.asset.meta new file mode 100644 index 00000000..268b8094 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Line Endings.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 1e7b5480c1d8bda43ab4fa945939e243 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Line Endings.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Mesh Prefabs.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Mesh Prefabs.asset new file mode 100644 index 00000000..3d8a99ab --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Mesh Prefabs.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Mesh Prefabs + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 2 + Title: Check Mesh Prefabs + Description: Each mesh should have a corresponding prefab set up with all variations + of the texture/mesh/material that you are providing. Please create prefabs for + all of your imported objects. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 3c3d0d642ac6a6a48aa124a93dae3734, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Mesh Prefabs.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Mesh Prefabs.asset.meta new file mode 100644 index 00000000..266cf689 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Mesh Prefabs.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 03b362b67028eb443b7ba8b84aedd5f2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Mesh Prefabs.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Assets.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Assets.asset new file mode 100644 index 00000000..0a69e354 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Assets.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Missing Components in Assets + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 9 + Title: Check Missing Components in Assets + Description: We do not allow missing or broken material/texture/prefab/script connections + in your package. Please make sure none of your assets have missing components. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 22d8f814e2363e34ea220736a4042728, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Assets.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Assets.asset.meta new file mode 100644 index 00000000..ac6dbc21 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Assets.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 1a3d0b3827fc16347867bee335e8f4ea +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Missing Components in Assets.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Scenes.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Scenes.asset new file mode 100644 index 00000000..f5ecb1ad --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Scenes.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Missing Components in Scenes + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 10 + Title: Check Missing Components in Scenes + Description: We do not allow missing or broken material/texture/prefab/script connections + in your package. Please make sure none of your scene objects have missing components. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 511e76d0ebcb23d40a7b49dda0e2980f, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Scenes.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Scenes.asset.meta new file mode 100644 index 00000000..31f0f0a8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Missing Components in Scenes.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: bc2cb4e6635aa334ea4a52e2e3ce57c8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Missing Components in Scenes.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Import Logs.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Import Logs.asset new file mode 100644 index 00000000..f5d9b0f6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Import Logs.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Model Import Logs + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 32 + Title: Check Model Import Logs + Description: Model assets should work without issues. Please make sure that there + are no errors or warnings when these models are imported. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + ValidationType: 0 + TestScript: {fileID: 11500000, guid: 98f3ec209166855408eaf4abe5bff591, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Import Logs.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Import Logs.asset.meta new file mode 100644 index 00000000..9e8b2e6a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Import Logs.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: c889cdd91c2f41941a14363dad7a1a38 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Model Import Logs.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Orientation.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Orientation.asset new file mode 100644 index 00000000..dfd8345e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Orientation.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Model Orientation + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 7 + Title: Check Model Orientation + Description: 'Meshes should be facing the correct way. The proper facing is: Z + vector is forward, Y vector is up, X vector is right.' + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 56cdcdc41a80fbc46b5b2b83ec8d66d7, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Orientation.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Orientation.asset.meta new file mode 100644 index 00000000..2a8546fc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Orientation.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 45b2b11da67e8864aacc62d928524b4c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Model Orientation.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Types.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Types.asset new file mode 100644 index 00000000..e9c9aacd --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Types.asset @@ -0,0 +1,24 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Model Types + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 23 + Title: Check Model Types + Description: Mesh assets must be either .fbx, .dae, .abc, or .obj file types. + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 428b1fb838e6f5a469bbfd26ca3fbfd2, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Types.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Types.asset.meta new file mode 100644 index 00000000..07da7947 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Model Types.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: ffef800a102b0e04cae1a3b98549ef1b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Model Types.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Normal Map Textures.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Normal Map Textures.asset new file mode 100644 index 00000000..2f65269e --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Normal Map Textures.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Normal Map Textures + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 26 + Title: Check Normal Map Textures + Description: Textures that are assigned to Materials as Normal Maps should have + their import Texture Type set to 'Normal Map' + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: d55cea510248f814eb2194c2b53f88d2, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Normal Map Textures.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Normal Map Textures.asset.meta new file mode 100644 index 00000000..bd5f0812 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Normal Map Textures.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 241ad0174fcadb64da867011d196acbb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Normal Map Textures.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Package Naming.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Package Naming.asset new file mode 100644 index 00000000..5c34623f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Package Naming.asset @@ -0,0 +1,30 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Package Naming + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 33 + Title: Check Package Naming + Description: Your package and its contents should be named appropriately and not + artificially force themselves up the hierarchy within commonly used project folders. + This can happen when a file or a folder name starts with a special character + (such as an underscore). + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 0 + AppliesToSubCategories: 1 + Filter: + - Essentials + - Templates + ValidationType: 0 + TestScript: {fileID: 11500000, guid: afe9e04825c7d904981a54404b222290, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Package Naming.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Package Naming.asset.meta new file mode 100644 index 00000000..4cfa90e4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Package Naming.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 04098aa074d151b4a908dfa79dfddec3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Package Naming.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Particle Systems.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Particle Systems.asset new file mode 100644 index 00000000..62d55cde --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Particle Systems.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Particle Systems + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 25 + Title: Check Particle Systems + Description: All Particle Systems should be saved as Prefabs + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - VFX + TestScript: {fileID: 11500000, guid: 6a623f7988c75884bb17b169ccd3e993, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Particle Systems.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Particle Systems.asset.meta new file mode 100644 index 00000000..7120a201 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Particle Systems.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 87da7eaed3cee0d4b8ada0b500e3a958 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Particle Systems.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Path Lengths.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Path Lengths.asset new file mode 100644 index 00000000..676ae48f --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Path Lengths.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Path Lengths + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 28 + Title: Check Path Lengths + Description: Package content file paths should not be excessively lengthened. File + paths for assets must be under 140 characters + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: ae379305e9165e84584373a8272c09e7, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Path Lengths.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Path Lengths.asset.meta new file mode 100644 index 00000000..3a1b4cb3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Path Lengths.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 21f8ec0602ffac045b1f4a93f8a9b555 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Path Lengths.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Prefab Transforms.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Prefab Transforms.asset new file mode 100644 index 00000000..2cf336b9 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Prefab Transforms.asset @@ -0,0 +1,28 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Prefab Transforms + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 3 + Title: Check Prefab Transforms + Description: Prefabs must have their position/rotation set to 0, and their scale + set to 1. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - 3D + - Essentials + - Templates + TestScript: {fileID: 11500000, guid: f712c17a60bf2d049a4e61c8f79e56c2, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Prefab Transforms.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Prefab Transforms.asset.meta new file mode 100644 index 00000000..0c1957d2 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Prefab Transforms.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 700026f446833f649a3c63b33a90a295 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Prefab Transforms.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Script Compilation.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Script Compilation.asset new file mode 100644 index 00000000..fae309f1 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Script Compilation.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Script Compilation + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 29 + Title: Check Script Compilation + Description: Scripts in the package must compile successfully and not result in + compilation errors + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 59db88f43969db8499299bce7f4fb967, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Script Compilation.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Script Compilation.asset.meta new file mode 100644 index 00000000..b45fff62 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Script Compilation.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 339e21c955642a04289482aa923e10b6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Script Compilation.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Shader Compilation.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Shader Compilation.asset new file mode 100644 index 00000000..dcbd6093 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Shader Compilation.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Shader Compilation + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 18 + Title: Check Shader Compilation + Description: Please make sure the shaders inside your package do not have errors + and compile successfully. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 7abb278a6082bde4391e0779394cb85b, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Shader Compilation.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Shader Compilation.asset.meta new file mode 100644 index 00000000..0d4b2202 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Shader Compilation.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 1450037453608204a989ff95dca62fae +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Shader Compilation.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Texture Dimensions.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Texture Dimensions.asset new file mode 100644 index 00000000..d676f146 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Texture Dimensions.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Texture Dimensions + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 24 + Title: Check Texture Dimensions + Description: Dimensions of textures, where appropriate, should have pixel counts + that are a power of 2 + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 073f1dacf3da34d4783140ae9d485d5f, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Texture Dimensions.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Texture Dimensions.asset.meta new file mode 100644 index 00000000..e07ac720 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Texture Dimensions.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: c23253393b8e28846b8e02aeaee7e152 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Texture Dimensions.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Type Namespaces.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Type Namespaces.asset new file mode 100644 index 00000000..8331d606 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Type Namespaces.asset @@ -0,0 +1,31 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Type Namespaces + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 19 + Title: Check Type Namespaces + Description: 'Types in your scripts (classes, interfaces, structs, enums) should + be nested under a namespace block to prevent them from being mistaken for other + potential types and for better organization as a whole. + + + It is not allowed + to nest your code under a Unity namespace.' + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + ValidationType: 0 + TestScript: {fileID: 11500000, guid: 279249fa7ef8c2446b3a9f013eeedbf0, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Type Namespaces.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Type Namespaces.asset.meta new file mode 100644 index 00000000..83ea2e70 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check Type Namespaces.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: dd110ee16e8de4d48a602349ed7a0b25 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Check + Type Namespaces.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Executable Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Executable Files.asset new file mode 100644 index 00000000..1a00c2fa --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Executable Files.asset @@ -0,0 +1,27 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove Executable Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 14 + Title: Remove Executable Files + Description: Your package must not contain an .exe, installer programs or applications. + If your plugin requires an external program to run, please remove the installer + program from your package and write the instructions on how to download and install + the installer program in your documentation. + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 8e4450592cc60e54286ad089b66db94d, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Executable Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Executable Files.asset.meta new file mode 100644 index 00000000..35699560 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Executable Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: e996c53186de96e49a742d414648a809 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + Executable Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JPG Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JPG Files.asset new file mode 100644 index 00000000..cd2900fc --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JPG Files.asset @@ -0,0 +1,30 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove JPG Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 8 + Title: Remove JPG Files + Description: We do not allow texture images that are saved in lossy formats. Please + save all of your images as lossless format file types, such as PNG, TGA, or PSD. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - 2D + - 3D + - Animation + - Essentials + - VFX/Shaders + TestScript: {fileID: 11500000, guid: 5634a12b3a8544c4585bbc280ae59ce2, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JPG Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JPG Files.asset.meta new file mode 100644 index 00000000..d0a2eb2d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JPG Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 781021ae3aa6570468e08d78e3195127 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + JPG Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JavaScript Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JavaScript Files.asset new file mode 100644 index 00000000..bc5102e0 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JavaScript Files.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove JavaScript Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 11 + Title: Remove JavaScript Files + Description: JavaScript / UnityScript files are not allowed, as they are no longer + supported. + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: ab1676bde9afba442b35fd3319c18063, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JavaScript Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JavaScript Files.asset.meta new file mode 100644 index 00000000..11b0f886 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove JavaScript Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: bf01c18b66907f54c99517f6a877e3e0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + JavaScript Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Lossy Audio Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Lossy Audio Files.asset new file mode 100644 index 00000000..954f6fd6 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Lossy Audio Files.asset @@ -0,0 +1,32 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove Lossy Audio Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 12 + Title: Remove Lossy Audio Files + Description: 'We do not recommend audio files that are saved as .mp3 or .ogg. Please + save all of your audio as lossless format file types, such as .wav. If you have + non-lossy alternative files to your lossy audio files, please make sure to name + them identically to avoid rejection. For example: ''shout.mp3'', ''shout.wav''. + Listing of the format in the file name is also allowed and accounted for by the + validator. For example: ''taunt MP3.mp3'', ''taunt WAV.wav''.' + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - Audio + - Essentials + - Templates + TestScript: {fileID: 11500000, guid: b7205a85061273a4eb50586f13f35d35, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Lossy Audio Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Lossy Audio Files.asset.meta new file mode 100644 index 00000000..10847924 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Lossy Audio Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: a48657926de5cfb47ac559a7108d03ee +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + Lossy Audio Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Mixamo Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Mixamo Files.asset new file mode 100644 index 00000000..8d3cc14a --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Mixamo Files.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove Mixamo Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 15 + Title: Remove Mixamo Files + Description: We do not allow or accept packages files that were made with third-party + software, such as Mixamo, Fuse, etc. because these files are under licensing + that does not agree with the Asset Store End User License Agreement (EULA). + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: 9df432e52aa958b44bb5e20c13d16552, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Mixamo Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Mixamo Files.asset.meta new file mode 100644 index 00000000..8d2699e4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Mixamo Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: a0a44055f786ec64f86a07a214d5f831 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + Mixamo Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove SpeedTree Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove SpeedTree Files.asset new file mode 100644 index 00000000..14ff13fe --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove SpeedTree Files.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove SpeedTree Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 16 + Title: Remove SpeedTree Files + Description: You cannot redistribute SpeedTree files on other marketplaces. Please + remove all SpeedTree files that are in this package. + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: e06bb7e0aa4f9944abc18281c002dff4, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove SpeedTree Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove SpeedTree Files.asset.meta new file mode 100644 index 00000000..cc98ca36 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove SpeedTree Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 305bbe67f7c644d18bc8a5b2273aa6a4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + SpeedTree Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Video Files.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Video Files.asset new file mode 100644 index 00000000..1df19b9d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Video Files.asset @@ -0,0 +1,26 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Remove Video Files + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 13 + Title: Remove Video Files + Description: You cannot include a video file in your package. Please upload your + video file to an online video hosting website (Youtube, Vimeo, etc.) and include + the link to the video in your written documentation. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + TestScript: {fileID: 11500000, guid: f99724c71b0de66419b5d6e8e9bfcc2d, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Video Files.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Video Files.asset.meta new file mode 100644 index 00000000..7f4074e5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove Video Files.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 893a0df188c2026438be48eed39b301f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/Generic/Remove + Video Files.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage.meta new file mode 100644 index 00000000..0a50cef4 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e978e836f2fb224fa11de94e913da49 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Demo Scenes.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Demo Scenes.asset new file mode 100644 index 00000000..af6ecc2b --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Demo Scenes.asset @@ -0,0 +1,34 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Demo Scenes + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 1 + Title: Check Demo Scenes + Description: If your product has content to show off, it should be displayed in + a demo scene. Please provide a practical demo with all of your assets set up. + If your asset is based on scripting or Editor extensions, please consider adding + a demo scene showcasing the asset or showing setup steps in the scene. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - 3D + - 2D + - Animation + - Essentials + - Templates + - VFX + ValidationType: 1 + TestScript: {fileID: 11500000, guid: f844c2dfa4669ff4eacf5591b544edaf, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Demo Scenes.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Demo Scenes.asset.meta new file mode 100644 index 00000000..d2a69967 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Demo Scenes.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: f108107be07f69045813d69eff580078 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check + Demo Scenes.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Documentation.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Documentation.asset new file mode 100644 index 00000000..6ce011e3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Documentation.asset @@ -0,0 +1,32 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Documentation + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 6 + Title: Check Documentation + Description: If your asset contains any code (scripts, shaders) - we ask that you + include offline documentation in the format of pdf or rtf with your submission, + as it is mandatory for all packages that include scripts or other components + that require set up. Your documentation must be organized with a table of contents + and numbered, written in English and have no grammar mistakes. Create a setup + guide with a step-by-step tutorial (pdf or video), as well as a script reference + if users will need to do any coding. If your asset contains art (3D models, sprites) + and you used code to set up a demo scene, you may skip this step. + CategoryInfo: + IsFailFilter: 1 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: [] + ValidationType: 1 + TestScript: {fileID: 11500000, guid: 3c8425198983eda4c9b35aa0d59ea33c, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Documentation.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Documentation.asset.meta new file mode 100644 index 00000000..b6978e28 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Documentation.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: b03433f7977b29e4ca7e8d76393a6c26 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check + Documentation.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Package Size.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Package Size.asset new file mode 100644 index 00000000..e80b2c45 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Package Size.asset @@ -0,0 +1,25 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Package Size + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 30 + Title: Check Package Size + Description: Package submissions should not be more than 6 GB in size + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 0 + AppliesToSubCategories: 1 + Filter: [] + ValidationType: 1 + TestScript: {fileID: 11500000, guid: a8601b99f4afa5049954f3a2dd5996d6, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Package Size.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Package Size.asset.meta new file mode 100644 index 00000000..eaf18964 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Package Size.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 25721b2d7384e5b4f936cf3b33b80a02 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check + Package Size.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Project Template Assets.asset b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Project Template Assets.asset new file mode 100644 index 00000000..645117c3 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Project Template Assets.asset @@ -0,0 +1,36 @@ +%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: d813ff809ae82f643bf975031305d541, type: 3} + m_Name: Check Project Template Assets + m_EditorClassIdentifier: + HasBeenInitialized: 1 + Id: 34 + Title: Check Project Template Assets + Description: 'Assets in your package derived from project template assets should + be assigned a new GUID and be located under a different path. + + + This is to + minimize the risk of users accidentally overwriting their own assets when importing + your package. + + + Example commonly used asset: ''Assets/Scenes/SampleScene.unity''' + CategoryInfo: + IsFailFilter: 0 + IsInclusiveFilter: 1 + AppliesToSubCategories: 1 + Filter: + - Essentials + - Templates + ValidationType: 1 + TestScript: {fileID: 11500000, guid: f02d52a702c712e4e8089f7c2e65bae7, type: 3} diff --git a/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Project Template Assets.asset.meta b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Project Template Assets.asset.meta new file mode 100644 index 00000000..e8d4e6c5 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check Project Template Assets.asset.meta @@ -0,0 +1,16 @@ +fileFormatVersion: 2 +guid: 5392e9de0549574419ff76897d1e0fa1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/Editor/Validator/Tests/UnityPackage/Check + Project Template Assets.asset + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/LICENSE.md b/Packages/com.unity.asset-store-tools/LICENSE.md new file mode 100644 index 00000000..b20d72b8 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/LICENSE.md @@ -0,0 +1,5 @@ +Asset Store Tools v2 copyright © 2025 Unity Technologies + +Source code of the package is licensed under the Unity Companion License (see https://unity.com/legal/licenses/unity-companion-license); otherwise licensed under the Unity Package Distribution License (see https://unity.com/legal/licenses/unity-package-distribution-license ) + +Unless expressly provided otherwise, the software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. Please review the license for details on these and other terms and conditions. \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/LICENSE.md.meta b/Packages/com.unity.asset-store-tools/LICENSE.md.meta new file mode 100644 index 00000000..b20ebc6d --- /dev/null +++ b/Packages/com.unity.asset-store-tools/LICENSE.md.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: baeaa62ad0dc664428d6069db8fd986d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/LICENSE.md + uploadId: 724584 diff --git a/Packages/com.unity.asset-store-tools/package.json b/Packages/com.unity.asset-store-tools/package.json new file mode 100644 index 00000000..8a64e184 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/package.json @@ -0,0 +1,11 @@ +{ + "name": "com.unity.asset-store-tools", + "displayName": "Asset Store Tools", + "version": "12.0.1", + "unity": "2019.4", + "description": "Whether you're a programmer, game designer, texture artist or 3D modeler, you're welcome to share your creations with everybody in the Unity developer community!", + "type": "tool", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "3.2.1" + } +} \ No newline at end of file diff --git a/Packages/com.unity.asset-store-tools/package.json.meta b/Packages/com.unity.asset-store-tools/package.json.meta new file mode 100644 index 00000000..c2682472 --- /dev/null +++ b/Packages/com.unity.asset-store-tools/package.json.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: fca7c22c787fbfd4cb0d7f186668631a +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 115 + packageName: Asset Store Publishing Tools + packageVersion: 12.0.1 + assetPath: Packages/com.unity.asset-store-tools/package.json + uploadId: 724584 diff --git a/Packages/manifest.json b/Packages/manifest.json index 1deefd27..993b6ed0 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,13 +1,13 @@ { "dependencies": { - "com.cysharp.unitask": "2.5.0", - "com.mygamedevtools.script-template": "3.4.0", - "com.unity.addressables": "2.1.0", + "com.unity.addressables": "1.19.19", "com.unity.feature.development": "1.0.2", "com.unity.ide.visualstudio": "2.0.22", - "com.unity.timeline": "1.8.6", + "com.unity.render-pipelines.core": "17.0.4", + "com.unity.render-pipelines.high-definition": "17.0.4", + "com.unity.render-pipelines.universal": "17.0.4", + "com.unity.timeline": "1.8.7", "com.unity.ugui": "2.0.0", - "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -45,8 +45,6 @@ "name": "Open UPM", "url": "https://package.openupm.com", "scopes": [ - "com.cysharp.unitask", - "com.openupm", "com.mygamedevtools" ] } diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 6c509788..12e1de3e 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,37 +1,46 @@ { "dependencies": { - "com.cysharp.unitask": { - "version": "2.5.0", - "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://package.openupm.com" - }, "com.mygamedevtools.scene-loader": { "version": "file:com.mygamedevtools.scene-loader", "depth": 0, "source": "embedded", "dependencies": {} }, - "com.mygamedevtools.script-template": { - "version": "3.4.0", + "com.needle.upm-in-unitypackage": { + "version": "file:com.needle.upm-in-unitypackage", "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://package.openupm.com" + "source": "embedded", + "dependencies": {} }, "com.unity.addressables": { - "version": "2.1.0", + "version": "1.19.19", "depth": 0, "source": "registry", "dependencies": { - "com.unity.scriptablebuildpipeline": "2.1.3", "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0", - "com.unity.profiling.core": "1.0.2" + "com.unity.scriptablebuildpipeline": "1.19.6", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.asset-store-tools": { + "version": "file:com.unity.asset-store-tools", + "depth": 0, + "source": "embedded", + "dependencies": { + "com.unity.nuget.newtonsoft-json": "3.2.1" + } + }, + "com.unity.burst": { + "version": "1.8.18", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.2.1", + "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, @@ -43,7 +52,7 @@ "url": "https://packages.unity.com" }, "com.unity.ext.nunit": { - "version": "2.0.5", + "version": "1.0.6", "depth": 2, "source": "registry", "dependencies": {}, @@ -55,15 +64,16 @@ "source": "builtin", "dependencies": { "com.unity.ide.visualstudio": "2.0.22", - "com.unity.ide.rider": "3.0.28", + "com.unity.ide.rider": "3.0.31", + "com.unity.ide.vscode": "1.2.5", "com.unity.editorcoroutines": "1.0.0", "com.unity.performance.profile-analyzer": "1.2.2", - "com.unity.test-framework": "1.4.4", - "com.unity.testtools.codecoverage": "1.2.5" + "com.unity.test-framework": "1.1.33", + "com.unity.testtools.codecoverage": "1.2.6" } }, "com.unity.ide.rider": { - "version": "3.0.28", + "version": "3.0.31", "depth": 1, "source": "registry", "dependencies": { @@ -80,47 +90,123 @@ }, "url": "https://packages.unity.com" }, - "com.unity.performance.profile-analyzer": { - "version": "1.2.2", + "com.unity.ide.vscode": { + "version": "1.2.5", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, - "com.unity.profiling.core": { - "version": "1.0.2", + "com.unity.mathematics": { + "version": "1.2.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.nuget.newtonsoft-json": { + "version": "3.2.1", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.performance.profile-analyzer": { + "version": "1.2.2", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.render-pipelines.core": { + "version": "17.0.4", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.render-pipelines.high-definition": { + "version": "17.0.4", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.mathematics": "1.2.4", + "com.unity.burst": "1.8.9", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.render-pipelines.core": "12.1.15", + "com.unity.shadergraph": "12.1.15", + "com.unity.visualeffectgraph": "12.1.15", + "com.unity.render-pipelines.high-definition-config": "12.1.15" + } + }, + "com.unity.render-pipelines.high-definition-config": { + "version": "12.1.15", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.render-pipelines.core": "12.1.15" + } + }, + "com.unity.render-pipelines.universal": { + "version": "17.0.4", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.mathematics": "1.2.1", + "com.unity.burst": "1.8.9", + "com.unity.render-pipelines.core": "12.1.15", + "com.unity.shadergraph": "12.1.15" + } + }, "com.unity.scriptablebuildpipeline": { - "version": "2.1.3", + "version": "1.20.1", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.searcher": { + "version": "4.9.1", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, "com.unity.settings-manager": { - "version": "2.0.1", + "version": "1.0.3", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.shadergraph": { + "version": "12.1.15", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.render-pipelines.core": "12.1.15", + "com.unity.searcher": "4.9.1" + } + }, "com.unity.test-framework": { - "version": "1.4.4", + "version": "1.1.33", "depth": 1, "source": "registry", "dependencies": { - "com.unity.ext.nunit": "2.0.3", + "com.unity.ext.nunit": "1.0.6", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.testtools.codecoverage": { - "version": "1.2.5", + "version": "1.2.6", "depth": 1, "source": "registry", "dependencies": { @@ -130,13 +216,13 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.8.6", + "version": "1.8.7", "depth": 0, "source": "registry", "dependencies": { + "com.unity.modules.audio": "1.0.0", "com.unity.modules.director": "1.0.0", "com.unity.modules.animation": "1.0.0", - "com.unity.modules.audio": "1.0.0", "com.unity.modules.particlesystem": "1.0.0" }, "url": "https://packages.unity.com" @@ -150,11 +236,14 @@ "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.accessibility": { - "version": "1.0.0", - "depth": 0, + "com.unity.visualeffectgraph": { + "version": "12.1.15", + "depth": 1, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.shadergraph": "12.1.15", + "com.unity.render-pipelines.core": "12.1.15" + } }, "com.unity.modules.ai": { "version": "1.0.0", @@ -203,12 +292,6 @@ "com.unity.modules.animation": "1.0.0" } }, - "com.unity.modules.hierarchycore": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", - "dependencies": {} - }, "com.unity.modules.imageconversion": { "version": "1.0.0", "depth": 0, @@ -298,7 +381,17 @@ "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.hierarchycore": "1.0.0" + "com.unity.modules.uielementsnative": "1.0.0" + } + }, + "com.unity.modules.uielementsnative": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" } }, "com.unity.modules.umbra": { diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset index 1e44a0a1..13bda89f 100644 --- a/ProjectSettings/EditorSettings.asset +++ b/ProjectSettings/EditorSettings.asset @@ -3,28 +3,46 @@ --- !u!159 &1 EditorSettings: m_ObjectHideFlags: 0 - serializedVersion: 11 - m_ExternalVersionControlSupport: Visible Meta Files + serializedVersion: 13 m_SerializationMode: 2 m_LineEndingsForNewScripts: 0 m_DefaultBehaviorMode: 0 m_PrefabRegularEnvironment: {fileID: 0} m_PrefabUIEnvironment: {fileID: 0} m_SpritePackerMode: 0 + m_SpritePackerCacheSize: 10 m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 m_EtcTextureCompressorBehavior: 1 m_EtcTextureFastCompressor: 1 m_EtcTextureNormalCompressor: 2 m_EtcTextureBestCompressor: 4 m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref m_ProjectGenerationRootNamespace: - m_CollabEditorSettings: - inProgressEnabled: 1 m_EnableTextureStreamingInEditMode: 1 m_EnableTextureStreamingInPlayMode: 1 + m_EnableEditorAsyncCPUTextureLoading: 0 m_AsyncShaderCompilation: 1 - m_EnterPlayModeOptionsEnabled: 0 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 1 m_EnterPlayModeOptions: 3 - m_ShowLightmapResolutionOverlay: 1 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_InspectorUseIMGUIDefaultInspector: 0 m_UseLegacyProbeSampleCount: 0 m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 + m_CacheServerValidationMode: 2 + m_CacheServerDownloadBatchSize: 128 + m_EnableEnlightenBakedGI: 0 + m_ReferencedClipsExactNaming: 0 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index 43369e3c..db5a809f 100644 --- a/ProjectSettings/GraphicsSettings.asset +++ b/ProjectSettings/GraphicsSettings.asset @@ -3,7 +3,7 @@ --- !u!30 &1 GraphicsSettings: m_ObjectHideFlags: 0 - serializedVersion: 13 + serializedVersion: 14 m_Deferred: m_Mode: 1 m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} @@ -28,6 +28,7 @@ GraphicsSettings: m_LensFlare: m_Mode: 1 m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 m_AlwaysIncludedShaders: - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} @@ -36,8 +37,8 @@ GraphicsSettings: - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} m_PreloadedShaders: [] - m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, - type: 0} + m_PreloadShadersBatchTimeLimit: -1 + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} m_CustomRenderPipeline: {fileID: 0} m_TransparencySortMode: 0 m_TransparencySortAxis: {x: 0, y: 0, z: 1} @@ -57,7 +58,12 @@ GraphicsSettings: m_FogKeepExp: 1 m_FogKeepExp2: 1 m_AlbedoSwatchInfos: [] - m_LightsUseLinearIntensity: 0 - m_LightsUseColorTemperature: 0 + m_LightsUseLinearIntensity: 1 + m_LightsUseColorTemperature: 1 + m_DefaultRenderingLayerMask: 1 m_LogWhenShaderIsCompiled: 0 - m_AllowEnlightenSupportForUpgradedProject: 0 + m_SRPDefaultSettings: + UnityEngine.Rendering.HighDefinition.HDRenderPipeline: {fileID: 11400000, guid: 6c116788356e21a4888de895681c22f7, type: 2} + UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: ec72006901959cd4791a67f23cef8143, type: 2} + m_CameraRelativeLightCulling: 0 + m_CameraRelativeShadowCulling: 0 diff --git a/ProjectSettings/HDRPProjectSettings.asset b/ProjectSettings/HDRPProjectSettings.asset new file mode 100644 index 00000000..8c122969 --- /dev/null +++ b/ProjectSettings/HDRPProjectSettings.asset @@ -0,0 +1,28 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + 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: 63a2978a97e4fc04cb9d905947216f3d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ProjectSettingFolderPath: HDRPDefaultResources + m_LastMaterialVersion: 13 + m_HDShaderGraphLastSeenVersion: 0 + m_PluginMaterialVersions: + m_Keys: [] + m_Values: + m_PluginSubTargetVersions: + m_Keys: [] + m_Values: + m_Version: 2 + m_ObsoleteWizardPopupAlreadyShownOnce: 0 + m_ObsoleteWizardActiveTab: 0 + m_ObsoleteWizardNeedRestartAfterChangingToDX12: 0 + m_ObsoleteWizardNeedToRunFixAllAgainAfterDomainReload: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset index 17c8f538..6a65192d 100644 --- a/ProjectSettings/InputManager.asset +++ b/ProjectSettings/InputManager.asset @@ -293,3 +293,196 @@ InputManager: type: 0 axis: 0 joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 + m_UsePhysicalKeys: 1 diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset index c0898fc1..bc7d6779 100644 --- a/ProjectSettings/PackageManagerSettings.asset +++ b/ProjectSettings/PackageManagerSettings.asset @@ -31,8 +31,6 @@ MonoBehaviour: m_Name: Open UPM m_Url: https://package.openupm.com m_Scopes: - - com.cysharp.unitask - - com.openupm - com.mygamedevtools m_IsDefault: 0 m_Capabilities: 0 diff --git a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json index e6b3e1a9..c29a5e6f 100644 --- a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json +++ b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json @@ -1,4 +1,6 @@ { + "m_Name": "Settings", + "m_Path": "ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json", "m_Dictionary": { "m_DictionaryValues": [ { @@ -25,6 +27,16 @@ "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "key": "AutoGenerateReport", "value": "{\"m_Value\":false}" + }, + { + "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "key": "GenerateAdditionalMetrics", + "value": "{\"m_Value\":true}" + }, + { + "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "key": "GenerateTestReferences", + "value": "{\"m_Value\":false}" } ] } diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 20a6825c..12fdbe71 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -47,8 +47,9 @@ PlayerSettings: defaultScreenWidthWeb: 960 defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 - m_ActiveColorSpace: 0 + m_ActiveColorSpace: 1 unsupportedMSAAFallback: 0 + m_SpriteBatchMaxVertexCount: 65535 m_SpriteBatchVertexThreshold: 300 m_MTRendering: 1 mipStripping: 0 @@ -77,12 +78,11 @@ PlayerSettings: androidMinimumWindowHeight: 300 androidFullscreenMode: 1 androidAutoRotationBehavior: 1 - androidApplicationEntry: 1 androidPredictiveBackSupport: 0 + androidApplicationEntry: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 1 - captureSingleScreen: 0 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 Force IOS Speakers When Recording: 0 @@ -392,6 +392,7 @@ PlayerSettings: playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 + editorGfxJobOverride: 1 enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 @@ -653,7 +654,8 @@ PlayerSettings: webGLWebAssemblyBigInt: 0 webGLCloseOnQuit: 0 webWasm2023: 0 - scriptingDefineSymbols: {} + scriptingDefineSymbols: + Standalone: UNITY_ASTOOLS_EXPERIMENTAL additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} @@ -763,3 +765,5 @@ PlayerSettings: platformRequiresReadableAssets: 0 virtualTexturingSupportEnabled: 0 insecureHttpOption: 0 + androidVulkanDenyFilterList: [] + androidVulkanAllowFilterList: [] diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 250548d6..8386a052 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 6000.0.4f1 -m_EditorVersionWithRevision: 6000.0.4f1 (b5d5d06b038a) +m_EditorVersion: 2021.3.45f1 +m_EditorVersionWithRevision: 2021.3.45f1 (0da89fac8e79) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset index 7b7658d6..c1d21eff 100644 --- a/ProjectSettings/QualitySettings.asset +++ b/ProjectSettings/QualitySettings.asset @@ -4,185 +4,10 @@ QualitySettings: m_ObjectHideFlags: 0 serializedVersion: 5 - m_CurrentQuality: 5 + m_CurrentQuality: 0 m_QualitySettings: - - serializedVersion: 2 - name: Very Low - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 15 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 1 - textureQuality: 1 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: 0.3 - maximumLODLevel: 0 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 4 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Low - pixelLightCount: 0 - shadows: 0 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 0 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 0 - lodBias: 0.4 - maximumLODLevel: 0 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 16 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Medium - pixelLightCount: 1 - shadows: 1 - shadowResolution: 0 - shadowProjection: 1 - shadowCascades: 1 - shadowDistance: 20 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 0 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 0 - realtimeReflectionProbes: 0 - billboardsFaceCameraPosition: 0 - vSyncCount: 1 - lodBias: 0.7 - maximumLODLevel: 0 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 64 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: High - pixelLightCount: 2 - shadows: 2 - shadowResolution: 1 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 40 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 2 - textureQuality: 0 - anisotropicTextures: 1 - antiAliasing: 0 - softParticles: 0 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1 - maximumLODLevel: 0 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 256 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Very High - pixelLightCount: 3 - shadows: 2 - shadowResolution: 2 - shadowProjection: 1 - shadowCascades: 2 - shadowDistance: 70 - shadowNearPlaneOffset: 3 - shadowCascade2Split: 0.33333334 - shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} - shadowmaskMode: 1 - blendWeights: 4 - textureQuality: 0 - anisotropicTextures: 2 - antiAliasing: 2 - softParticles: 1 - softVegetation: 1 - realtimeReflectionProbes: 1 - billboardsFaceCameraPosition: 1 - vSyncCount: 1 - lodBias: 1.5 - maximumLODLevel: 0 - streamingMipmapsActive: 0 - streamingMipmapsAddAllCameras: 1 - streamingMipmapsMemoryBudget: 512 - streamingMipmapsRenderersPerFrame: 512 - streamingMipmapsMaxLevelReduction: 2 - streamingMipmapsMaxFileIORequests: 1024 - particleRaycastBudget: 1024 - asyncUploadTimeSlice: 2 - asyncUploadBufferSize: 16 - asyncUploadPersistentBuffer: 1 - resolutionScalingFixedDPIFactor: 1 - excludedTargetPlatforms: [] - - serializedVersion: 2 - name: Ultra + - serializedVersion: 4 + name: Default pixelLightCount: 4 shadows: 2 shadowResolution: 2 @@ -193,17 +18,24 @@ QualitySettings: shadowCascade2Split: 0.33333334 shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 1 - blendWeights: 4 - textureQuality: 0 + skinWeights: 4 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] anisotropicTextures: 2 - antiAliasing: 2 + antiAliasing: 0 softParticles: 1 softVegetation: 1 realtimeReflectionProbes: 1 billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 1 - lodBias: 2 + realtimeGICPUUsage: 100 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 + lodBias: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -215,18 +47,29 @@ QualitySettings: asyncUploadBufferSize: 16 asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] + m_TextureMipmapLimitGroupNames: [] m_PerPlatformDefaultQuality: - Android: 2 - Lumin: 5 - Nintendo 3DS: 5 - Nintendo Switch: 5 - PS4: 5 - PSP2: 2 - Stadia: 5 - Standalone: 5 - WebGL: 3 - Windows Store Apps: 5 - XboxOne: 5 - iPhone: 2 - tvOS: 2 + Android: 0 + Lumin: 0 + Nintendo 3DS: 0 + Nintendo Switch: 0 + PS4: 0 + PSP2: 0 + Stadia: 0 + Standalone: 0 + WebGL: 0 + Windows Store Apps: 0 + XboxOne: 0 + iPhone: 0 + tvOS: 0 diff --git a/ProjectSettings/ShaderGraphSettings.asset b/ProjectSettings/ShaderGraphSettings.asset new file mode 100644 index 00000000..df2f009a --- /dev/null +++ b/ProjectSettings/ShaderGraphSettings.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + 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: de02f9e1d18f588468e474319d09a723, type: 3} + m_Name: + m_EditorClassIdentifier: + shaderVariantLimit: 2048 + customInterpolatorErrorThreshold: 32 + customInterpolatorWarningThreshold: 16 + customHeatmapValues: {fileID: 0} diff --git a/ProjectSettings/URPProjectSettings.asset b/ProjectSettings/URPProjectSettings.asset new file mode 100644 index 00000000..c1f118ad --- /dev/null +++ b/ProjectSettings/URPProjectSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + 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: 247994e1f5a72c2419c26a37e9334c01, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LastMaterialVersion: 5 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset index 3a95c98b..a4f68812 100644 --- a/ProjectSettings/VFXManager.asset +++ b/ProjectSettings/VFXManager.asset @@ -3,10 +3,14 @@ --- !u!937362698 &1 VFXManager: m_ObjectHideFlags: 0 - m_IndirectShader: {fileID: 0} - m_CopyBufferShader: {fileID: 0} - m_SortShader: {fileID: 0} - m_StripUpdateShader: {fileID: 0} + m_IndirectShader: {fileID: 7200000, guid: 84a17cfa13e40ae4082ef42714f0a81c, type: 3} + m_CopyBufferShader: {fileID: 7200000, guid: 23c51f21a3503f6428b527b01f8a2f4e, type: 3} + m_SortShader: {fileID: 7200000, guid: ea257ca3cfb12a642a5025e612af6b2a, type: 3} + m_StripUpdateShader: {fileID: 7200000, guid: 8fa6c4009fe2a4d4486c62736fc30ad8, type: 3} + m_EmptyShader: {fileID: 4800000, guid: 43905ce367a8805429f76287d9f95e29, type: 3} m_RenderPipeSettingsPath: m_FixedTimeStep: 0.016666668 m_MaxDeltaTime: 0.05 + m_CompiledVersion: 5 + m_RuntimeVersion: 23 + m_RuntimeResources: {fileID: 11400000, guid: bc10b42afe3813544bffd38ae2cd893d, type: 2} diff --git a/README.md b/README.md index 11437755..5f85b1cd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -

-Advanced Scene Manager -

+

+ My Scene Manager +

@@ -17,79 +17,53 @@ Advanced Scene Manager

-

-Enhance your scene loading experience -

+## ⚡ Overview + +**My Scene Manager** is a Unity package to **simplify** scene operations: **load**, **unload** and **transition**. In a quick example: -## Overview +```cs +MySceneManager.TransitionAsync("my-target-scene", "my-loading-scene"); +``` -This is a Unity package to **simplify** scene operations: **load**, **unload** and **transition**. In a quick example: +Instead of: ```cs -// Unity Manager scene transition yield return SceneManager.LoadSceneAsync("my-loading-scene", LoadSceneMode.Additive); yield return SceneManager.LoadSceneAsync("my-target-scene", LoadSceneMode.Additive); SceneManager.SetActiveScene(SceneManager.GetSceneByName("my-target-scene")); SceneManager.UnloadSceneAsync("my-loading-scene"); SceneManager.UnloadSceneAsync("my-previous-scene"); - -// Advanced Scene Management scene transition -sceneLoader.TransitionToScene(new LoadSceneInfoName("my-target-scene"), new LoadSceneInfoName("my-loading-scene")); ``` -You can also take advantage of these features: - -- **Unified** API for **addressable** and **non-addressable** scenes. -- **Awaitable** scene operations. -- **Modular** implementation with interfaces. -- Load, unload or transition to **multiple scenes**. +## 🚀 Features -## Migrating to `3.x` +- **Seamless Scene Transitions**: Transition between scenes with ease, with optional loading scenes for a smooth user experience. +- **Addressable and Non-Addressable Scene Support**: Manage both addressable and non-addressable scenes through a unified API. +- **Async/Await Support**: Fully compatible with _async/await_ for smooth, non-blocking scene operations. +- **Loading Screens**: Easily build loading screens with built-in components. +- **Modular Design** — Use only the components you need, fully customizable. -Refer to the [Migration Guide](https://github.com/mygamedevtools/scene-loader/wiki/Migration-Guide-3.x) at the wiki for instructions. +## 📦 Installation -## Summary +You can install the package via **[OpenUPM](https://openupm.com/packages/com.mygamedevtools.scene-loader)**, **Git**, **Tarball** and the **[Unity Asset Store](https://assetstore.unity.com/packages/slug/313159)**. +Check the full installation guide in the [documentation](https://scene-loader.mygamedevtools.com/docs/next/getting-started/installation). -* [Installation](#installation) - * [OpenUPM](#openupm) - * [Installing from Git](#installing-from-git) - * [Installing from tarball](#installing-from-tarball) -* [Dependencies](#dependencies) -* [Description](#description) -* [Usage](#usage) - * [The Scene Manager](#the-scene-manager) - * [Load Scene Info](#load-scene-info) - * [The Scene Loaders](#the-scene-loaders) - * [Scene Transitions](#scene-transitions) - * [Disposable and CancellationTokens](#disposable-and-cancellationtokens) -* [Practical examples](#practical-examples) - * [Creating your scene loader](#creating-your-scene-loader) - * [Loading scenes with load scene info](#loading-scenes-with-load-scene-info) -* [Creating Loading Screens](#creating-loading-screens) - * [The Loading Behavior](#the-loading-behavior) - * [The Loading States](#the-loading-states) - * [The Loading Feedback](#the-loading-feedback) - * [Loading Screen Example](#loading-screen-example) -* [Why so many interfaces?](#why-so-many-interfaces) -* [Tests](#tests) -* [Troubleshooting](#troubleshooting) - * [Error when creating an AdvancedSceneManager](#error-when-creating-an-advancedscenemanager) - * [Cannot unload a scene with a different ILoadSceneInfo](#cannot-unload-a-scene-with-a-different-iloadsceneinfo) +#### OpenUPM -## Installation +* Open `Edit/Project Settings/Package Manager`. +* Add a new **Scoped Registry** (or edit the existing _OpenUPM_ entry): + ``` + Name: Open UPM + URL: https://package.openupm.com + Scope(s): com.mygamedevtools + ``` +* Click `Apply`. +* Open `Window/Package Manager`. +* In the left column, select `Open UPM` inside `My Registries`. +* Select `Advanced Scene Manager` under `My GameDev Tools`. +* Click `Install`. -### Open UPM - -This package is available on the [OpenUPM](https://openupm.com/packages/com.mygamedevtools.scene-loader) registry. Add the package via the [openupm-cli](https://github.com/openupm/openupm-cli): - -``` -openupm add com.mygamedevtools.scene-loader -``` - -### [Installing](https://docs.unity3d.com/Manual/upm-ui-giturl.html) from Git - -> [!NOTE] -> Requires [Git](https://git-scm.com/) installed and added to the PATH +#### Git 1. Open `Window/Package Manager`. 2. Click +. @@ -97,7 +71,7 @@ openupm add com.mygamedevtools.scene-loader 4. Paste `https://github.com/mygamedevtools/scene-loader.git#upm` into url. 5. Click `Add`. -### [Installing](https://docs.unity3d.com/Manual/upm-ui-tarball.html) from tarball +#### Tarball 1. Choose the [release](https://github.com/mygamedevtools/scene-loader/releases) you want to install and download the `com.mygamedevtools.scene-loader-.tgz` asset. 2. Open `Window/Package Manager`. @@ -105,615 +79,26 @@ openupm add com.mygamedevtools.scene-loader 4. Select `Install package from tarball...`. 5. Select the `com.mygamedevtools.scene-loader-.tgz` file you downloaded. -## Dependencies - -The package has **no dependencies** but supports integration with some packages. -If you wish to use it with `Addressables`, `UniTask`, or `TextMeshPro`, make sure you install the packages: - -* `com.unity.addressables` >= 1.19.0 -* `com.unity.textmeshpro` >= 2.2.0 -* `com.cysharp.unitask`* >= 2.0.0 - -_*Installed via UPM or OpenUPM. Check the [package documentation](https://github.com/Cysharp/UniTask) for more details._ - -[_[back to top]_](#advanced-scene-manager) - -## Description - -Loading scenes in Unity is very simple, mostly, but when you start to deal with other systems such as [Unity Addressables](https://docs.unity3d.com/Manual/com.unity.addressables.html), it can get messy. Also, there are some common scene load scenarios that you'd usually reimplement in every project, like scene transitions. - -In this package, you'll have the possibility to standardize the scene loading process between the standard **Unity Scene Manager** and **Addressables**, while still being able to choose how to await (if you want) the operations, be it Coroutines, standard Async (through ValueTasks) or [UniTask](https://github.com/Cysharp/UniTask). - -Aside from the ordinary **Load** and **Unload** actions, the Scene Loading tools introduce the **Transition** as a new standard to control transitions between scenes with an optional intermediate "loading scene" in between. Also, starting from version `2.2` you can **Load**, **Unload**, and **Transition** to **multiple scenes** in parallel! - -[_[back to top]_](#advanced-scene-manager) - -## Usage - -Loading scenes with this package implies that the scenes **will always be loaded as Additive**. That is simply because there is no advantage in loading scenes in the **Single** load scene mode when you expect to work with multiple scenes. - -To standardize how the scenes are loaded, you'll be using `ISceneLoader`, `ISceneManager`, and `ILoadSceneInfo` objects. - -```mermaid -flowchart BT - sm([Scene Manager]) - sl([Scene Loader]) - lsi([Load Scene Info]) - - lsi -->|Load| sl - lsi -->|Unload| sl - lsi -->|Transition| sl - sl -->|Load| sm - sl -->|Unload| sm -``` - -These structures are meant to be used together. If you do not plan to use scene transitions or to have custom _awaitable_ types, you don't need to use the `ISceneLoader`. +#### Unity Asset Store -### The Scene Manager - -The `ISceneManager` interface exposes a few methods and events to standardize the scene load operations: - -```cs -public interface ISceneManager : IDisposable -{ - event Action ActiveSceneChanged; - event Action SceneUnloaded; - event Action SceneLoaded; - - int LoadedSceneCount { get; } - int TotalSceneCount { get; } - - void SetActiveScene(Scene scene); - - ValueTask LoadScenesAsync(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default); - - ValueTask LoadSceneAsync(ILoadSceneInfo sceneInfo, bool setActive = false, IProgress progress = null, CancellationToken token = default); - - ValueTask UnloadSceneAsync(ILoadSceneInfo[] sceneInfos, CancellationToken token = default); - - ValueTask UnloadSceneAsync(ILoadSceneInfo sceneInfo, CancellationToken token = default); - - Scene GetActiveScene(); - - Scene GetLoadedSceneAt(int index); - - Scene GetLastLoadedScene(); - - Scene GetLoadedSceneByName(string name); -} -``` - -You can find many similarities between Unity's [SceneManager](https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.html) class, and that's both for maintaining an easy learning curve as well as because some of these operations will end up calling the _Unity Scene Manager_ internally (like `SetActiveScene` for instance). -The `ILoadSceneInfo` interface is also showing up there, but we will get to that in a moment. - -The package includes the `AdvancedSceneManager` that is capable of handling both **addressable** and **non-addressable** scene operations. You can use its implementation as a reference to **build your own** Scene Manager if you need. - -The `AdvancedSceneManager` is expected to be used as a wrapper for the Unity `SceneManager`. When creating an `AdvancedSceneManager` you can decide whether you want it to manage scenes that have been loaded already or not. - -```mermaid -flowchart TB - usm([Unity Scene Manager]) - - usm --> asm([Advanced Scene Manager]) - asm --> s_a["Scene [0]"] - asm --> s_b["Scene [1]"] - asm --> s_n["Scene [n]"] -``` - -The `ISceneManager` interface defines that both `LoadSceneAsync` and `UnloadSceneAsync` methods return a `ValueTask`. -This means you can _await_ those methods if they are implemented with the _async_ keyword, or you can also subscribe to the `SceneLoaded` or `SceneUnloaded` events to receive the same `Scene` you would via the _async_ methods. - -Both these methods also receive an `ILoadSceneInfo` object. -So, instead of having multiple methods for receiving the scene's build index or the scene's name, we simply have an object instead. - -Alternatively, you can also use the `LoadScenesAsync` and `UnloadScenesAsync` methods, to perform the operations on multiple scenes in parallel. These will return a `ValueTask`. - -You can create an `AdvancedSceneManager` using three constructors: - -```cs -// Creates an advanced scene manager including all currently loaded scenes. Useful for most cases. -// Should not be called on `Awake()`, since it runs before the scene is loaded. -new AdvancedSceneManager(addLoadedScenes: true); - -// Creates an empty advanced scene manager. Useful if you are doing this before any scene loads or in a bootstrap scene. -new AdvancedSceneManager(); - -// Creates an advanced scene manager including an array of scenes. Useful when you want to include only a specific set of scenes to it. -new AdvancedSceneManager(initializationScenes: new Scene[]); -``` - -[_[back to top]_](#advanced-scene-manager) - -### Load Scene Info - -As its name states, it holds a reference to a scene to be loaded (or unloaded) and validates whether they _can_ reference a loaded scene. - -The `ILoadSceneInfo` interface simply defines: - -```cs -public interface ILoadSceneInfo -{ - LoadSceneInfoType Type { get; } - - object Reference { get; } - - bool CanBeReferenceToScene(Scene scene); -} -``` - -Since the `Reference` field can hold any type of reference, the scene manager will be responsible for deciding what to do with its value. -The `LoadSceneInfoType` is a simple enum that helps converting the `Reference` value without casting the `ILoadSceneInfo` object. -The load scene info simply holds these references, and that's why the implementations included with the package are all **readonly structs**. - -You can choose to work with **five** load scene infos: - -```mermaid -flowchart - subgraph Addressable - direction TB - assetref(LoadSceneInfoAssetReference) - address(LoadSceneInfoAddress) - end - - subgraph Unload only - scene(LoadSceneInfoScene) - end - - subgraph Non-Addressable - direction TB - name(LoadSceneInfoName) - index(LoadSceneInfoIndex) - end -``` - -* The `LoadSceneInfoName`, referencing a scene's name. -* The `LoadSceneInfoIndex`, referencing a scene's build index. -* The `LoadSceneInfoScene`, referencing a loaded scene's struct (used for unloading scenes only). -* The `LoadSceneInfoAssetReference`, referencing a scene's Addressable Asset Reference. -* The `LoadSceneInfoAddress`, referencing a scene's Addressable Address. - -You can also build your own `ILoadSceneInfo` implementation if have special needs, but that will probably require you to build a scene manager to interpret its `Reference` value as well. - -When **unloading** a scene, the `AdvancedSceneManager` will look for any of its loaded scenes that (in order of priority): -1. Have the same loaded scene handle (in the case of `LoadSceneInfoScene`). -2. Have the same `ILoadSceneInfo`. - -That means that the **preferable** way to unload scenes is through `LoadSceneInfoScene`, as it holds a **direct reference** to the target scene. -Assuming you don't have multiple scenes loaded with the same reference, it's safe to assume that the scene you want to unload is the one with the same `ILoadSceneInfo` you provided. -Except from `ILoadSceneInfoScene`, you **cannot** unload a scene with a different `ILoadSceneInfo` type. +1. Obtain the package at the [Asset Store Page](https://assetstore.unity.com/packages/slug/313159). +2. With your Unity project open, click `Open in Unity`. +3. The `Package Manager` will open with the package selected. +4. Click `Download` or `Update`, depending on the local cache. +5. Click `Import`. +6. Make sure everything is selected and click `Import` again. > [!NOTE] -> If you do have multiple scenes loaded by the same reference, unloading by its `ILoadSceneInfo` will unload the last loaded scene of that reference. - -> [!IMPORTANT] -> When unloading addressable scenes, their resources will be released by calling `Addressables.UnloadSceneAsync` internally. - -[_[back to top]_](#advanced-scene-manager) - -### The Scene Loaders - -The scene loader is an interface that you will use to load scenes in your game, as it works like a wrapper layer to the scene manager, but adds the **Scene Transition** operations. -There are two base interfaces for scene loaders: one with a reference to the `ISceneManager` that will be used, and an `async` interface to be able to `await` the load operations. - -The `ISceneLoader` interface defines: - -```cs -public interface ISceneLoader : IDisposable -{ - ISceneManager Manager { get; } - - void TransitionToScenes(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneInfo = null); - - void TransitionToScene(ILoadSceneInfo targetSceneInfo, ILoadSceneInfo intermediateSceneInfo = null); - - void UnloadScenes(ILoadSceneInfo[] sceneInfos); - - void UnloadScene(ILoadSceneInfo sceneInfo); - - void LoadScenes(ILoadSceneInfo[] sceneInfos, int setIndexActive = -1); - - void LoadScene(ILoadSceneInfo sceneInfo, bool setActive = false); -} -``` - -And the `ISceneLoaderAsync`: - -```cs -public interface ISceneLoaderAsync : ISceneLoader -{ - TAsyncSceneArray TransitionToScenesAsync(ILoadSceneInfo[] targetScenes, int setIndexActive, ILoadSceneInfo intermediateSceneReference = default, CancellationToken token = default); - - TAsyncScene TransitionToSceneAsync(ILoadSceneInfo targetSceneReference, ILoadSceneInfo intermediateSceneReference = default, CancellationToken token = default); - - TAsyncSceneArray LoadScenesAsync(ILoadSceneInfo[] sceneReferences, int setIndexActive = -1, IProgress progress = null, CancellationToken token = default); - - TAsyncScene LoadSceneAsync(ILoadSceneInfo sceneReference, bool setActive = false, IProgress progress = null, CancellationToken token = default); - - TAsyncSceneArray UnloadScenesAsync(ILoadSceneInfo[] sceneReferences, CancellationToken token = default); - - TAsyncScene UnloadSceneAsync(ILoadSceneInfo sceneReference, CancellationToken token = default); -} -``` - -Note that the `ISceneLoaderAsync` interface inherits from `ISceneLoader`. -The `TAsyncScene` type should return a `Scene` instance, and can be anything you mean to `await`, for example, `Task`, `ValueTask` or `UniTask`, while the `TAsyncSceneArray` should return a `Scene[]` instance, such as `Task`, `ValueTask` or `UniTask`. - -The package comes with **one** base implementations and **two** wrappers: -* The `SceneLoaderAsync`, that just like the `ISceneManager` implementations, will return `ValueTask` values. -* The `SceneLoaderCoroutine`, that uses the `SceneLoaderAsync` but returns a `WaitTask` that can be used in coroutines. -* The `SceneLoaderUniTask`, that uses the `SceneLoaderAsync` but returns `UniTask` values. - -All of them have interfaces to simplify your code: - -```cs -public interface ISceneLoaderCoroutine : ISceneLoaderAsync, WaitTask> { } - -public interface ISceneLoaderAsync : ISceneLoaderAsync, ValueTask> { } - -public interface ISceneLoaderUniTask : ISceneLoaderAsync, UniTask> { } -``` - -The `Manager` property can be used to listen to the `SceneLoaded`, `SceneUnloaded`, and `ActiveSceneChanged` events. -Both `LoadSceneAsync` and `UnloadSceneAsync` methods will simply call the `ISceneManager` equivalents, while the `LoadScene` and `UnloadScene` will do the same but without `await`. -It's important to understand that `LoadScene`, `UnloadScene`, and `TransitionToScene` will still invoke asynchronous operations, instead of blocking the execution until they are done. -You can use the `ISceneManager` events to react to the completion of those methods. - -[_[back to top]_](#advanced-scene-manager) - -### Scene Transitions - -The **Transition** is a combination of load and unload operations to effectively perform scene transitions, with or without an intermediate scene. For example, usually, if you'd want to go from scene A to scene B you would: - -1. Load the scene B. -2. Unload the scene A. - -That's only two operations, right? -What if you wanted to have a loading screen as well? -In this case, you would: - -1. Load the loading scene. -2. Load the scene B. -4. Unload the scene A. -3. Unload the loading scene. - -That's four operations now. -The `TransitionToScene` and `TransitionToSceneAsync` methods let you only provide where you want to go from the **current active scene** and if you want an intermediary scene (loading scene for example). - -Also, aside from transitioning from the current active scene, you can also use the `TransitionToSceneFromScenes` and `TransitionToSceneFromAll` alternatives: +> When updating from the Asset Store, make sure to remove the previous version completely before adding the updated version. -- `TransitionToSceneFromScenes` - unloads a given group of scenes during transition. -- `TransitionToSceneFromAll` - unloads all loaded scenes during transition. +## 📚 Documentation -Just like the regular `Transition` methods, its variants also have single/multiple scene options as well as async options. - -[_[back to top]_](#advanced-scene-manager) - -### Disposable and CancellationTokens - -Both the `ISceneManager` and the `ISceneLoader` interfaces implement `IDisposable`, meaning that the Scene Managers and Loaders should implement the `Dispose()` method. -This is used with the `CancellationToken` parameters in `ISceneManager` methods to ensure that it will clear its internal data and stop async code execution during disposal. -Note that even when its methods get canceled by the `CancellationToken`, the Unity Scene Manager methods are not cancellable and therefore will continue to operate when called. - -The disposal of the implemented Scene Managers will clear its data and stop any running logic. -This is useful for shutting down the application, for example. -If you are going to manually dispose of your scene loaders or managers, prefer the following scenarios: -* You can ensure that there are no load/unload/transition operations in progress. -* You are quitting/shutting down the application or an application module. - -> [!WARNING] -> It's **not recommended** to manually cancel the `ISceneManager` operations via its `CancellationToken` parameters. -> It may result in unexpected issues such as unwanted scenes being loaded/unloaded after cancellation. - -[_[back to top]_](#advanced-scene-manager) - -## Practical Examples - -When creating your scene loader, you must first create your scene manager. -Ideally, you will not need to store the scene manager anywhere as it will be accessible through the `ISceneLoader` interface. -Also, you will need to build your scene info objects to hold references to scenes. - -### Creating your scene loader - -For the first example, let's build a scene manager and a Coroutine scene loader: - -```cs -// Make sure to add 'using MyGameDevTools.SceneLoading;' on the top of the script -ISceneManager sceneManager = new AdvancedSceneManager(); -ISceneLoader sceneLoader = new SceneLoaderCoroutine(sceneManager); -``` - -You can also define the scene loader types as their `ISceneLoaderAsync` implementations: - -```cs -ISceneManager sceneManager = new SceneManager(); - -ISceneLoaderCoroutine coroutineSceneLoader = new SceneLoaderCoroutine(sceneManager); -// Or -ISceneLoaderAsync asyncSceneLoader = new SceneLoaderAsync(sceneManager); -// Or -ISceneLoaderUniTask unitaskSceneLoader = new SceneLoaderUniTask(sceneManager); -``` - -> [!NOTE] -> It is recommended that you store these object references as its interfaces to reduce coupling in your code. - -### Loading scenes with load scene info - -You'll use the load scene info objects to reference scenes. You can use these objects to define both addressable and non-addressable scenes. - -Let's assume you have included the following scenes in your **Build Settings**: - -0. Main Menu -1. Loading - -And you have the following scenes in **addressable groups**: - -* Shop -* Level 1 - -You can load the scenes by using the appropriate `ILoadSceneInfo`: - -```cs -ILoadSceneInfo mainMenuSceneInfo = new LoadSceneInfoName("Main Menu"); -ILoadSceneInfo loadingSceneInfo = new LoadSceneInfoIndex(1); -ILoadSceneInfo shopSceneInfo = new LoadSceneInfoAddress("Shop"); -// You should be able to get the scene's Asset Reference from the inspector by exposing an -// AssetReference on a MonoBehaviour or ScriptableObject. -ILoadSceneInfo levelSceneInfo = new LoadSceneInfoAssetReference(levelSceneAssetReference); - -// Loading the scene calls the same method, regardless of the load scene info type -sceneLoader.LoadScene(mainMenuSceneInfo); -sceneLoader.LoadScene(loadingSceneInfo); -sceneLoader.LoadScene(shopSceneInfo); -sceneLoader.LoadScene(levelSceneInfo); - -// Or the async alternatives -await sceneLoader.LoadSceneAsync(mainMenuSceneInfo); -await sceneLoader.LoadSceneAsync(loadingSceneInfo); -await sceneLoader.LoadSceneAsync(shopSceneInfo); -await sceneLoader.LoadSceneAsync(levelSceneInfo); -``` - -The same logic applies for unloading scenes. Additionally, you can use the `LoadSceneInfoScene` to unload non-addressable scenes using the scene returned from `ISceneLoaderAsync.LoadSceneAsync`. - -```cs -ILoadSceneInfo mainMenuSceneInfo = new LoadSceneInfoName("Main Menu"); -ILoadSceneInfo loadingSceneInfo = new LoadSceneInfoIndex(1); -ILoadSceneInfo shopSceneInfo = new LoadSceneInfoAddress("Shop"); - -Scene levelScene = await sceneLoader.LoadSceneAsync(LoadSceneInfoAssetReference(levelSceneAssetReference)); -ILoadSceneInfo levelSceneInfo = new LoadSceneInfoScene(levelScene); - -sceneLoader.UnloadScene(mainMenuSceneInfo); -sceneLoader.UnloadScene(loadingSceneInfo); -sceneLoader.UnloadScene(shopSceneInfo); -sceneLoader.LoadScene(levelSceneInfo); - -// Or the async alternatives -await sceneLoader.UnloadSceneAsync(mainMenuSceneInfo); -await sceneLoader.UnloadSceneAsync(loadingSceneInfo); -await sceneLoader.UnloadSceneAsync(shopSceneInfo); -await sceneLoader.LoadSceneAsync(levelSceneInfo); -``` - -Instead of using the async method, you can also register to the `ISceneManager.SceneLoaded` event: - -```cs -sceneLoader.Manager.SceneLoaded += loadedScene => -{ - ILoadSceneInfo loadedSceneInfo = new LoadSceneInfoScene(loadedScene); - sceneLoader.UnloadScene(loadedSceneInfo); -} -``` - -For transitions, you can combine different load scene info objects on the transition method: - -```cs -ILoadSceneInfo stageSceneInfo = new LoadSceneInfoName("Stage 1"); -ILoadSceneInfo loadingSceneInfo = new LoadSceneInfoIndex(1); - -sceneLoader.TransitionToScene(stageSceneInfo, loadingSceneInfo); - -// Or the async alternative -await sceneLoader.TransitionToSceneAsync(stageSceneInfo, loadingSceneInfo); -``` - -Whenever you need to perform scene operations on multiple scenes, you can also build `ILoadSceneInfo` arrays: - -```cs -ILoadSceneInfo[] sceneInfoGroup = new ILoadSceneInfo[] -{ - new LoadSceneInfoName("Main Menu"), - new LoadSceneInfoIndex(1), - new LoadSceneInfoAddress("Shop"), - new LoadSceneInfoAssetReference(levelSceneAssetReference) -} - -// Load -sceneLoader.LoadScenes(sceneInfoGroup); -// Unload -sceneLoader.UnloadScenes(sceneInfoGroup); -// Transition -// For multiple scenes, you must provide which scene you want to be the active scene by -// providing its index in the array. -sceneLoader.TransitionToScenes(sceneInfoGroup, 0); - -// Awaitable alternatives -await sceneLoader.LoadScenesAsync(sceneInfoGroup); -await sceneLoader.UnloadScenesAsync(sceneInfoGroup); -await sceneLoader.TransitionToScenesAsync(sceneInfoGroup, 0); -``` - -[_[back to top]_](#advanced-scene-manager) - -## Creating Loading Screens - -During scene transitions, you have the option to provide an intermediate scene that can be used as loading screen. -This could be an animated splash screen or a loading progress bar, for example. -This package provides implementations to help you build your loading screens faster. - -### The Loading Behavior - -The Loading Behavior is a [MonoBehaviour] component, which you can attach to Unity [GameObjects], that receives the progress value from the scene manager. -You **need** to add a `LoadingBehavior` component to a [GameObject] in your loading scene to be able to display scene loading feedback. -It exposes its `LoadingProgress` instance, which you can use to listen to the loading events: - -```cs -public class LoadingProgress : IProgress -{ - public event LoadingStateChangeDelegate StateChanged; - public event SceneLoadProgressDelegate Progressed; - - public LoadingState State { get; } -} -``` - -The `StateChanged` event expects a `LoadingState` parameter, to report the current state of the scene loading operation, and you can query the active state at any time by retrieving the value in the `State` property. -The `Progressed` event expects a `float` parameter, ranging from 0 to 1 to report the progress of the scene loading operation. - -Back to the `LoadingBehavior`, it has a few options you can set on the Unity [Inspector](https://docs.unity3d.com/Manual/UsingTheInspector.html): - -* **Wait For Scripted Start**: enable if the loading screen will have a **transition in** effect, such as a fade in. -* **Wait For Scripted End**: enable if the loading screen will have a **transition out** effect, such as a fade out. - -### The Loading States - -The loading scene transition can be customized to delay some parts of the operation to deliver a smooth visual experience for the user. -That means we can fade in/out or use other transition effects and wait for them to complete to continue the scene loading operations. -The `LoadingState` enum reflects those states: - -```cs -public enum LoadingState -{ - WaitingToStart, - Loading, - TargetSceneLoaded, - TransitionComplete -} -``` - -These states are ordered, which means that the first state will always be `WaitingToStart` and the last will be `TransitionComplete`. -They mean: - -* `WaitingToStart`: it's waiting for a trigger to allow the scene loading to start loading. This could be if the loading scene does not instantly appear, otherwise causing weird experiences with things simply disappearing. You can transition the loading screen with a fade in or a similar effect, for example. -* `Loading`: the loading screen transition has occurred and the scene loading operation is running. During this state, the `LoadingProgress` instance will receive the progress value from the scene manager. -* `TargetSceneLoaded`: the target scene has been loaded, but the loading screen is still displaying. You can use this state to transition the loading screen out, such as a fade out or a similar effect. -* `TransitionComplete`: the target scene has been loaded and the loading screen is already out of the way. Shortly after this state, the loading scene will be unloaded. - -### The Loading Feedback - -At this point, you should already have your loading scene with a `LoadingBehavior` attached to one of your [GameObjects]. -Now you can also add some other components to display the loading progress feedback. -This package comes with **three** feedbacks: - -* `LoadingFeedbackSlider`: attach on an [UI Slider] to display the loading progress feedback as a progress bar. -* `LoadingFeedbackTextMeshPro`: attach on an [UI Text Mesh Pro] to display the loading progress feedback as text normalized from 0 to 100. -* `LoadingFeedbackText` _(also known as Legacy)_: attach on an [UI Legacy Text](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-Text.html) to display the loading progress feedback as text normalized from 0 to 100. - -You can use a combination of these feedback components in the loading scene. -Remember to assign the `LoadingBehavior` field of these components to the `LoadingBehavior` component you created before. - -Another feedback that you could make is a **fade in/out** effect. -The `LoadingFader` component does just that. -Add it to an [UI CanvasGroup] [GameObject] to control the group's alpha value during the visual transitions. -You can also set the fade time and customize the fade in/out animation curves to suit your preference. - -To use the `LoadingFader` effectively, you must **enable** both `WaitForScriptedStart` and `WaitForScriptedEnd` toggles in your `LoadingBehavior` component. - -### Loading Screen Example - -Take the following loading screen scene hierarchy as an example: - -* Canvas - ([Canvas](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/class-Canvas.html), [CanvasScaler](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-CanvasScaler.html), `LoadingBehavior`) - * Group - ([CanvasGroup], `LoadingFader`) - * Background - ([Image](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-Image.html)) - * Text_Message - ([TextMeshProUGUI]) - * Slider_Progress - ([Slider], `LoadingFeedbackSlider`) - * Text_Progress - ([TextMeshProUGUI], `LoadingFeedbackTextMeshPro`) - -By having this hierarchy in your loading scene, it would be able to fade in/out and display both the loading progress bar and loading progress text feedback. -As this scene has the `LoadingFader` component, remember to enable both `WaitForScriptedStart` and `WaitForScriptedEnd` toggles in the `LoadingBehavior` component. -Also, if you're not using an addressable scene manager, enable the `ReducedLoadRatio` toggle. - -You can test this scene by passing its `ILoadSceneInfo` reference as the `intermediateSceneInfo` in an `ISceneLoader.TransitionToScene` method. - -[_[back to top]_](#advanced-scene-manager) - -## Why so many interfaces? - -The idea behind the interfaces is first to decouple things and second to allow you to build your custom implementations if you require something very different from the included content. -Sometimes projects require very specific implementations, and instead of making the system extremely complex and detailed, I'd rather have it broken into many different pieces that you can replace to fit with whatever works best for you. - -## Tests - -This package includes tests to assert most use cases of the Scene Managers and Scene Loaders. -The tests do not have any effect on a runtime build of the game, they only mean to work in a development environment. - -[_[back to top]_](#advanced-scene-manager) - -## Troubleshooting - -### Error when creating an `AdvancedSceneManager` - -When creating an `AdvancedSceneManager` passing a `true` value to its constructor, as `new AdvancedSceneManager(true)`, it attempts to add all loaded scenes to its list of tracked scenes. -However, if you called that during `Awake()`, you might see the error: - -``` -ArgumentException: Attempted to get an {nameof(ISceneData)} through an invalid or unloaded scene. -``` - -This error is thrown because during `Awake()` the scene is not fully loaded and cannot be added to the list of tracked scenes. - - -Move your call to `Start()` instead. - -### Cannot unload a scene with a different `ILoadSceneInfo` - -In a case where you have loaded a scene via one type of `ILoadSceneInfo`, you can only unload it by using the same type or explicitly a `LoadSceneInfoScene`. For example: - -```cs -ILoadSceneInfo nameInfo = new LoadSceneInfoName("MyScene"); -ILoadSceneInfo indexInfo = new LoadSceneInfoIndex(3); - -sceneManager.LoadSceneAsync(nameInfo); - -// You **cannot** do this: -sceneManager.UnloadSceneAsync(indexInfo); - -// But you can do this: -sceneManager.UnoadSceneAsync(nameInfo); - -// Or, build a `LoadSceneInfoScene`. -// Alternatives: GetLoadedSceneByName(name), GetLoadedSceneAt(index), GetLastLoadedScene() or GetActiveScene() -ILoadSceneInfo sceneInfo = sceneManager.GetLoadedSceneByName("MyScene"); -sceneManager.UnloadSceneAsync(sceneInfo); -``` - -Sometimes this issue can also be avoided by performing a scene transition. If you're trying to unload the active scene to transition between scenes, you can execute the transition through the scene manager and let it handle the internal complexity. For example: - -```cs -// Instead of unloading the source scene directly: -sceneManager.LoadSceneAsync(targetSceneInfo) -sceneManager.UnloadSceneAsync(sourceSceneInfo); - -// Perform a scene transition: -sceneManager.TransitionToScene(targetSceneInfo); -``` +The detailed documentation including usage guides, examples, update guides, and tutorials are available in the [official documentation](https://scene-loader.mygamedevtools.com/). -[_[back to top]_](#advanced-scene-manager) +## 🤝 Contributing ---- +We welcome contributions! Please check our [contribution guidelines](./CONTRIBUTING.md). -Don't hesitate to create [issues](https://github.com/mygamedevtools/scene-loader/issues) for suggestions and bugs. Have fun! +## 📄 License -[MonoBehaviour]: https://docs.unity3d.com/Manual/class-MonoBehaviour.html -[MonoBehaviours]: https://docs.unity3d.com/Manual/class-MonoBehaviour.html -[ScriptableObject]: https://docs.unity3d.com/Manual/class-ScriptableObject.html -[GameObject]: https://docs.unity3d.com/Manual/class-GameObject.html -[GameObjects]: https://docs.unity3d.com/Manual/class-GameObject.html -[UI Text Mesh Pro]: https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.0/api/TMPro.TextMeshProUGUI.html -[TextMeshProUGUI]: https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.0/api/TMPro.TextMeshProUGUI.html -[UI Slider]: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-Slider.html -[Slider]: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-Slider.html -[UI Canvas Group]: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/class-CanvasGroup.html -[CanvasGroup]: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/class-CanvasGroup.html +This project is licensed under the [MIT License](./LICENSE). \ No newline at end of file diff --git a/docs/img/banner.jpg b/docs/img/banner.jpg new file mode 100644 index 00000000..6e32d4dd Binary files /dev/null and b/docs/img/banner.jpg differ