From 53062d1ed9ec2d1e7fd80d26577d45576651dbd4 Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Fri, 29 Sep 2023 17:38:06 +0100 Subject: [PATCH 01/11] Update project to Unity 2019.4.40f1 --- .vscode/settings.json | 55 ++++ Packages/manifest.json | 11 +- Packages/packages-lock.json | 317 +++++++++++++++++++ ProjectSettings/PackageManagerSettings.asset | 38 +++ ProjectSettings/ProjectVersion.txt | 4 +- 5 files changed, 418 insertions(+), 7 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/PackageManagerSettings.asset diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e232cd6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,55 @@ +{ + "files.exclude": + { + "**/.DS_Store":true, + "**/.git":true, + "**/.gitmodules":true, + "**/*.booproj":true, + "**/*.pidb":true, + "**/*.suo":true, + "**/*.user":true, + "**/*.userprefs":true, + "**/*.unityproj":true, + "**/*.dll":true, + "**/*.exe":true, + "**/*.pdf":true, + "**/*.mid":true, + "**/*.midi":true, + "**/*.wav":true, + "**/*.gif":true, + "**/*.ico":true, + "**/*.jpg":true, + "**/*.jpeg":true, + "**/*.png":true, + "**/*.psd":true, + "**/*.tga":true, + "**/*.tif":true, + "**/*.tiff":true, + "**/*.3ds":true, + "**/*.3DS":true, + "**/*.fbx":true, + "**/*.FBX":true, + "**/*.lxo":true, + "**/*.LXO":true, + "**/*.ma":true, + "**/*.MA":true, + "**/*.obj":true, + "**/*.OBJ":true, + "**/*.asset":true, + "**/*.cubemap":true, + "**/*.flare":true, + "**/*.mat":true, + "**/*.meta":true, + "**/*.prefab":true, + "**/*.unity":true, + "build/":true, + "Build/":true, + "Library/":true, + "library/":true, + "obj/":true, + "Obj/":true, + "ProjectSettings/":true, + "temp/":true, + "Temp/":true + } +} \ No newline at end of file diff --git a/Packages/manifest.json b/Packages/manifest.json index ae4d873..435cc6f 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,10 +1,11 @@ { "dependencies": { - "com.unity.collab-proxy": "1.2.16", - "com.unity.ide.rider": "1.1.4", - "com.unity.ide.vscode": "1.2.0", - "com.unity.test-framework": "1.1.14", - "com.unity.timeline": "1.2.14", + "com.unity.collab-proxy": "1.14.18", + "com.unity.ide.rider": "1.2.1", + "com.unity.ide.visualstudio": "2.0.15", + "com.unity.ide.vscode": "1.2.5", + "com.unity.test-framework": "1.1.31", + "com.unity.timeline": "1.2.18", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..ec47cc5 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,317 @@ +{ + "dependencies": { + "com.unity.collab-proxy": { + "version": "1.14.18", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.ide.rider": { + "version": "1.2.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.15", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.vscode": { + "version": "1.2.5", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.31", + "depth": 0, + "source": "registry", + "dependencies": { + "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.timeline": { + "version": "1.2.18", + "depth": 0, + "source": "registry", + "dependencies": { + "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" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..6920e3a --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,38 @@ +%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: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_ScopedRegistriesSettingsExpanded: 1 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 5a8320a..4c19129 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2019.3.15f1 -m_EditorVersionWithRevision: 2019.3.15f1 (59ff3e03856d) +m_EditorVersion: 2019.4.40f1 +m_EditorVersionWithRevision: 2019.4.40f1 (ffc62b691db5) From 9eca63e10680db4826a174e79be5749a54af6c2c Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Fri, 29 Sep 2023 23:30:38 +0100 Subject: [PATCH 02/11] delete vscode settings file that was generated for some reason --- .vscode/settings.json | 55 ------------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e232cd6..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "files.exclude": - { - "**/.DS_Store":true, - "**/.git":true, - "**/.gitmodules":true, - "**/*.booproj":true, - "**/*.pidb":true, - "**/*.suo":true, - "**/*.user":true, - "**/*.userprefs":true, - "**/*.unityproj":true, - "**/*.dll":true, - "**/*.exe":true, - "**/*.pdf":true, - "**/*.mid":true, - "**/*.midi":true, - "**/*.wav":true, - "**/*.gif":true, - "**/*.ico":true, - "**/*.jpg":true, - "**/*.jpeg":true, - "**/*.png":true, - "**/*.psd":true, - "**/*.tga":true, - "**/*.tif":true, - "**/*.tiff":true, - "**/*.3ds":true, - "**/*.3DS":true, - "**/*.fbx":true, - "**/*.FBX":true, - "**/*.lxo":true, - "**/*.LXO":true, - "**/*.ma":true, - "**/*.MA":true, - "**/*.obj":true, - "**/*.OBJ":true, - "**/*.asset":true, - "**/*.cubemap":true, - "**/*.flare":true, - "**/*.mat":true, - "**/*.meta":true, - "**/*.prefab":true, - "**/*.unity":true, - "build/":true, - "Build/":true, - "Library/":true, - "library/":true, - "obj/":true, - "Obj/":true, - "ProjectSettings/":true, - "temp/":true, - "Temp/":true - } -} \ No newline at end of file From 05d8146a79966bf074e163c1b00b5debbbeea89f Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Wed, 18 Oct 2023 22:23:50 +0100 Subject: [PATCH 03/11] Update TrombLoader to pre-release 2.2.0 --- Assets/Scripts/Assembly-CSharp-firstpass.dll | Bin 0 -> 37376 bytes ...eta => Assembly-CSharp-firstpass.dll.meta} | 2 +- Assets/Scripts/LeanTween.dll | Bin 91136 -> 0 bytes Assets/Scripts/TrombLoader.dll | Bin 12800 -> 18432 bytes 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 Assets/Scripts/Assembly-CSharp-firstpass.dll rename Assets/Scripts/{LeanTween.dll.meta => Assembly-CSharp-firstpass.dll.meta} (93%) delete mode 100644 Assets/Scripts/LeanTween.dll diff --git a/Assets/Scripts/Assembly-CSharp-firstpass.dll b/Assets/Scripts/Assembly-CSharp-firstpass.dll new file mode 100755 index 0000000000000000000000000000000000000000..a1151530099acafb7a537ae8a38717b8c82c6192 GIT binary patch literal 37376 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%0DtjX1UBxc0x-{cG#lBJXOvd|)eN^~j#_ugA$DqyR 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 literal 0 HcmV?d00001 diff --git a/Assets/Scripts/LeanTween.dll.meta b/Assets/Scripts/Assembly-CSharp-firstpass.dll.meta similarity index 93% rename from Assets/Scripts/LeanTween.dll.meta rename to Assets/Scripts/Assembly-CSharp-firstpass.dll.meta index 6ee0113..9bed2bb 100644 --- a/Assets/Scripts/LeanTween.dll.meta +++ b/Assets/Scripts/Assembly-CSharp-firstpass.dll.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 79e03979321ee4f4190e96026d6fc8e5 +guid: bf519a752cecb475e84a9a9c83ba0bb1 PluginImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/LeanTween.dll b/Assets/Scripts/LeanTween.dll deleted file mode 100644 index cd6234e9af5e363684c53ad397a4c3fa793456bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91136 zcmd?S31C#!^*?^!d$T8#WHQMl>;YNEuozrw0!YH5qQxCG38;vmAn0H~MMGk6L8Yju zsE8XPwrEk&qD4i;rD`j-Sg|g(ty*fewf(w&_1n7qKIfeK?t3$t09y6;{r~<0xpP0~ zoO|xM=dSO*``#SVyi7StsQ~`I`bw#d_@++-hdT~Bz%J_ZP?6dYeZKETYvS{LC(WES zuWD{f=9HEbPpdlV#M4jD%&(d@qpIc1)2n8kUN!!(qpD8JOrJ3<9*_0cst?~^sfm`O zjz09M)8!Z}9R0P*Qia)+T|y;QN=1B<(}5@W@UZza7R(1;I~n$Z$7R)ayJ8?u9o90h zCLC1N}|pBo6w<% zQ+e`#P8gSI89!&vAt%l{U7a@Xq)f|<8N;T}nWJ1yQf^xX)xy`58gi>ru2l1he4xiV zPDZRx^fDV|8IZbyzCc%sgL#0lMMN7=A*{Bm-`=m^2h+~0_pvI4^}DBT8QpJtP0gb| zRySc)e)an3exWa}*w4r6F05xW@%nyyuUC)wSUrT*>&`*-{d)E380lm66xJyx>|ft+ z&1+Sge5_u=+Oq$&`hHgo{c?nl)mvC7Z+%X==Aoa&I_AI!-FMXm&@viYI`X&xjh8a$ zc+8i#c0reUpN70s9T^ViQC-A3(3$A#OnkLd&~X-mYBj8#>Mk8tDpcLQeHzocGp$-B zYaF!)stq-qNX1eGwcP;PPk>B#W$VxJRY$EeRM8j!{R7*vlkbSr_-> zsWvLSXd#b{eg#^}q%34|x&ZlBE7d)X(FVTg?GOe2O@F{RSyQY=qFChD_UV)WaNIB z?G#9r4FxO2(oD>(g-7ZtNq#B`l7i69{8iD|!HB&@<=l^K(2lzqMQ*1&c@*FRaQ{au zp?Qjxg_n1nN;qCjy$`=63(r6vAIx4+bc?YbNMn)#p-$d1> zPG-&a%FJwVodz@tG!4>Qt+@R?0Rnxrn3R9LN054Sxm(GMb3AVAZ;8+&hmd&*`qLjH zs6E8T@)`Yu9C8NDPuivwDwU7VO~&RPYgaUKPpYT#NGIm<1k}+WpnW9l%V%AN7GuRy z9kXC#?Vg~A+9`Skk!>$}24N?ifCY;v${f@y$#NX3>K}(Q$z||ai068Au>?0i1RKUV zO-(V0G!{5^Q@Rw&3PU;)59>%W5Q%bYjU)nNY%;Vus$-$*F#14>5{A&%N))P)#|3We zXst&9b1j5cw)z}dOJa3HJZ9!J)N^K&jRtF+7+UF3Gf9{h;uhfRoU6I5^s`gxGBN<_ zk~O930(@goNw5ue2CNv3aOjO#P!>&Q08vn}ki!n4g!W!u7Rn{TkZ zl5P8e&27XOn5;>t>yZJ*gM^c+zYRLfdTP;6#3f9GpuM&8PC!K$Vo_Emf`CifKO>)AL!Mf@0FUAJ|myC?_=mH#IkQ4C;m;!%wG@Z()NW zm#o3?1$LBdjM+2>(X7|d-~_1C#nM;^#CReNa#+YrJHUXMAZ%`MM2=F#B{}z5NuCT8 z$+B+T2)Lpsn8C;qONJ2XMUgNPz>o;OI_i_r+7E#eQK0w7PEH0Ri6Hg7Sd??rAR+l{ zWHYNE6i#C`6-z|IAvQf3D~+YAKxs@y5~6+F64EX4revfj7|!&CKv6K1Mt-pjnm0fi zqeU!(T8t%0DHSSNSX!7K$dPb3QIII)EQ5s!KfD zM$Hrj6CrI_BAgin#kD8EaB)z)_CP8Gx%vGu-^4-4l@e2~ajj(n1_N!sAOuCp znj&=&ua%$dScsZQL;xd%E3fi2^o-n#R6GfQD z@TbSEh}sh=;LC*VVaGzuCk>AC~Ux`d6oM*pHJM>o;SR-P1NrK)vrxBBzwNU3?cjH3T+ z=_)&D;Y0Swkw9r)&9Do#eY5=jK9Gw}&oe&e#PR>~Feyy#BJ%5R)~zZG8cF-(Oqr zvTXB=iKr1}H||&Y+S;yl1DeOO$5d%vPR2sF%-rCW0QZ8-n0KQg zQ+f=8{Mpe0;5MZ2w^mQrO-5IjzHT=nUDwBXyCBoy$r2~28yxFIxP&U4icjtb6E9Cs1QeBt1)u`-RX5lW#w0SaApZl^` zy7Wtir*ig|=dz5A=Hi<}Mrs{9Y7?Y~27dp#HCsAyPUHOyxE4v3W*=unwv^d$x^!7|c+5dOh)+fuh zBEFx%^$wSD`*m{Kzw0^f0A0vP2k4>$>Gsgm%b3~&UBq*~L4O88X;C^!FE0tVp-Cpq zx6?-LOh1zY-B%o?_4~#YY5QwX?@rf^-Odd2=_%qhI+snlhNmOIIy&_t8rqyJ9fb

4pba7RW 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 literal 12800 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 From 08a96a9f89da79980933300d81b658209d50f3f7 Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Wed, 15 Nov 2023 15:07:06 +0000 Subject: [PATCH 04/11] add automatic macOS shader bundle building Co-authored-by: legoandmars --- .gitignore | 3 + Assets/Editor/BackgroundEditor.cs | 151 ++++++++++++++++++- Assets/Scripts/Assembly-CSharp-firstpass.dll | Bin 37376 -> 37376 bytes Assets/Scripts/TrombLoader.dll | Bin 18432 -> 18944 bytes Packages/manifest.json | 4 +- Packages/packages-lock.json | 6 +- 6 files changed, 157 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index f64e92b..bd8a73e 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,6 @@ crashlytics-build.properties # Temporary auto-generated Android Assets /[Aa]ssets/[Ss]treamingAssets/aa.meta /[Aa]ssets/[Ss]treamingAssets/aa/* + +SerializedMaterials/ +SerializedMaterials.meta \ No newline at end of file diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index 5b37a28..2d32c86 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.IO; +using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.Video; @@ -12,6 +13,79 @@ public class BackgroundEditor : Editor { Camera tromboneBackground; + // yoinked from https://github.com/tc-mods/TrombLoader/blob/9469e0593896eafb7a927847aa1bd8899ad781d5/Helpers/ShaderHelper.cs#L36 + public List BaseGameShaderNames = new List + { + "Custom/WavySpriteLit", "Custom/WavySpriteUnlit", "FX/Flare", "FX/Gem", "GUI/Text Shader", + "Hidden/BlitCopy", "Hidden/BlitCopyDepth", "Hidden/BlitCopyWithDepth", "Hidden/BlitToDepth", + "Hidden/BlitToDepth/MSAA", "Hidden/Compositing", "Hidden/ConvertTexture", "Hidden/CubeBlend", + "Hidden/CubeBlur", "Hidden/CubeCopy", "Hidden/FrameDebuggerRenderTargetDisplay", "Hidden/Internal-Colored", + "Hidden/Internal-CombineDepthNormals", "Hidden/Internal-CubemapToEquirect", + "Hidden/Internal-DeferredReflections", "Hidden/Internal-DeferredShading", + "Hidden/Internal-DepthNormalsTexture", "Hidden/Internal-Flare", "Hidden/Internal-GUIRoundedRect", + "Hidden/Internal-GUIRoundedRectWithColorPerBorder", "Hidden/Internal-GUITexture", + "Hidden/Internal-GUITextureBlit", "Hidden/Internal-GUITextureClip", "Hidden/Internal-GUITextureClipText", + "Hidden/Internal-Halo", "Hidden/Internal-MotionVectors", "Hidden/Internal-ODSWorldTexture", + "Hidden/Internal-PrePassLighting", "Hidden/Internal-ScreenSpaceShadows", "Hidden/Internal-StencilWrite", + "Hidden/Internal-UIRAtlasBlitCopy", "Hidden/Internal-UIRDefault", "Hidden/InternalClear", + "Hidden/InternalErrorShader", "Hidden/Post FX/Ambient Occlusion", "Hidden/Post FX/Blit", + "Hidden/Post FX/Bloom", "Hidden/Post FX/Builtin Debug Views", "Hidden/Post FX/Depth Of Field", + "Hidden/Post FX/Eye Adaptation", "Hidden/Post FX/Fog", "Hidden/Post FX/FXAA", + "Hidden/Post FX/Grain Generator", "Hidden/Post FX/Lut Generator", "Hidden/Post FX/Motion Blur", + "Hidden/Post FX/Screen Space Reflection", "Hidden/Post FX/Temporal Anti-aliasing", + "hidden/SuperSystems/Wireframe-Global", "hidden/SuperSystems/Wireframe-Shaded-Unlit-Global", + "hidden/SuperSystems/Wireframe-Transparent-Culled-Global", + "hidden/SuperSystems/Wireframe-Transparent-Global", "Hidden/TextCore/Distance Field SSD", + "Hidden/VideoComposite", "Hidden/VideoDecode", "Hidden/VideoDecodeOSX", + "Hidden/VR/BlitFromTex2DToTexArraySlice", "Hidden/VR/BlitTexArraySlice", "Legacy Shaders/Diffuse", + "Legacy Shaders/Particles/Additive", "Legacy Shaders/Particles/Alpha Blended Premultiply", + "Legacy Shaders/Particles/Alpha Blended", "Legacy Shaders/Transparent/VertexLit", + "Legacy Shaders/VertexLit", "Mobile/Unlit (Supports Lightmap)", "Particles/Standard Unlit", + "Skybox/Procedural", "Spaventacorvi/Glitter/Glitter F - Bumped Specular", + "Spaventacorvi/Holographic/Holo D - Specular Textured", "Sprites/Default", "Sprites/Diffuse", + "Sprites/Mask", "Standard (Specular setup)", "Standard", "SuperSystems/Wireframe-Transparent-Culled", + "TextMeshPro/Bitmap Custom Atlas", "TextMeshPro/Bitmap", "TextMeshPro/Distance Field (Surface)", + "TextMeshPro/Distance Field Overlay", "TextMeshPro/Distance Field", "TextMeshPro/Mobile/Bitmap", + "TextMeshPro/Mobile/Distance Field (Surface)", "TextMeshPro/Mobile/Distance Field - Masking", + "TextMeshPro/Mobile/Distance Field Overlay", "TextMeshPro/Mobile/Distance Field", "TextMeshPro/Sprite", + "UI/Default", "Hidden/Post FX/Uber" + }; + + // just as cursed as above, but hey it still saves on disk space + public List TrombLoaderShaderNames = new List + { + "Hidden/Internal-DeferredShading", "Hidden/Internal-DeferredReflections", "Hidden/Internal-ScreenSpaceShadows", + "Hidden/Internal-PrePassLighting", "Hidden/Internal-DepthNormalsTexture", "Hidden/Internal-MotionVectors", + "Hidden/Internal-Halo", "Hidden/Internal-Flare", "Hidden/CubeBlur", "Hidden/CubeCopy", "Hidden/CubeBlend", + "Hidden/BlitCopy", "Legacy Shaders/Self-Illumin/VertexLit", "Legacy Shaders/Self-Illumin/Diffuse", + "Legacy Shaders/Reflective/VertexLit", "Legacy Shaders/Reflective/Specular", "Legacy Shaders/Transparent/Diffuse", + "Legacy Shaders/Transparent/Bumped Diffuse", "Legacy Shaders/Transparent/Cutout/VertexLit", + "Legacy Shaders/Transparent/Cutout/Diffuse", "Legacy Shaders/Particles/~Additive-Multiply", + "Legacy Shaders/Particles/Additive (Soft)", "Particles/Standard Surface", "Hidden/Nature/Terrain/Utilities", + "Hidden/TerrainEngine/Details/Vertexlit", "Hidden/TerrainEngine/Details/WavingDoublePass", + "Hidden/TerrainEngine/Details/BillboardWavingDoublePass", "Hidden/TerrainEngine/BillboardTree", + "Hidden/TerrainEngine/Splatmap/Diffuse-Base", "Hidden/TerrainEngine/Splatmap/Diffuse-BaseGen", + "Hidden/TerrainEngine/Splatmap/Diffuse-AddPass", "Nature/Terrain/Diffuse", "Hidden/Internal-GUITextureClip", + "Hidden/Internal-GUITextureClipText", "Hidden/Internal-GUITexture", "Hidden/Internal-GUITextureBlit", + "Hidden/Internal-GUIRoundedRect", "Hidden/Internal-UIRDefault", "Hidden/Internal-UIRAtlasBlitCopy", + "Hidden/Internal-GUIRoundedRectWithColorPerBorder", "Mobile/VertexLit", "Mobile/Diffuse", "Mobile/Particles/Additive", + "Unlit/Transparent", "Unlit/Transparent Cutout", "Unlit/Texture", "Unlit/Color", "Hidden/VideoComposite", + "Hidden/VideoDecode", "Hidden/VideoDecodeOSX", "Hidden/VideoDecodeAndroid", "Hidden/VideoDecodeML", "Hidden/Compositing", + "Hidden/Shader Forge/SFN_Blend_Divide", "Hidden/Shader Forge/SFN_Time", "Hidden/Shader Forge/SFN_Blend_Subtract", + "Hidden/Shader Forge/SFN_UVTile", "Hidden/Shader Forge/SFN_Blend_PinLight", "Hidden/Shader Forge/FillColor", + "Hidden/Shader Forge/SFN_Blend_LinearDodge", "Hidden/Shader Forge/SFN_Noise", "Hidden/Shader Forge/SFN_TexCoord", + "Hidden/Shader Forge/SFN_ArcTan2_ZTO", "Hidden/Shader Forge/SFN_Blend_Multiply", "Hidden/Shader Forge/SFN_Blend_Overlay", + "Hidden/Shader Forge/SFN_Add_2", "Hidden/Shader Forge/SFN_ArcTan2_ZTOW", "Hidden/Shader Forge/SFN_Tex2d_UV", + "Hidden/Shader Forge/ExtractChannel", "Hidden/Shader Forge/SFN_Tex2d_NoInputs", "Hidden/Shader Forge/SFN_Blend_ColorDodge", + "Hidden/Shader Forge/SFN_ArcTan2_NOTO", "Hidden/Shader Forge/SFN_Distance", "Hidden/Shader Forge/SFN_Posterize", + "Hidden/Shader Forge/SFN_ComponentMask_CC2", "Hidden/Shader Forge/SFN_ComponentMask_CC3", + "Hidden/Shader Forge/SFN_ComponentMask_CC1", "Hidden/Shader Forge/SFN_Blend_ColorBurn", "Hidden/Shader Forge/SFN_ArcTan", + "Hidden/Shader Forge/SFN_Blend_Difference", "Hidden/Shader Forge/SFN_Blend_Screen", "Hidden/Shader Forge/SFN_Append", + "Hidden/Shader Forge/SFN_Blend_LinearBurn", "Hidden/Shader Forge/SFN_Blend_Darken", "Hidden/Shader Forge/SFN_Multiply_2", + "Hidden/Shader Forge/SFN_Lerp", "Hidden/Shader Forge/SFN_Abs", "Shader Forge/TransparentControl", + "Shader Forge/SpiralClock", "Shader Forge/Spiral", "Shader Forge/ClockSpiralFinal" + }; + private void OnEnable() { tromboneBackground = (Camera)target; @@ -27,8 +101,8 @@ public override void OnInspectorGUI() { string path = EditorUtility.SaveFilePanel("Save Trombone Background", string.Empty, "bg.trombackground", "trombackground"); - BuildTargetGroup selectedBuildTargetGroup = EditorUserBuildSettings.selectedBuildTargetGroup; - BuildTarget activeBuildTarget = EditorUserBuildSettings.activeBuildTarget; + BuildTargetGroup selectedBuildTargetGroup = BuildTargetGroup.Standalone; + BuildTarget activeBuildTarget = BuildTarget.StandaloneWindows64; GameObject clonedTromboneBackground = null; @@ -111,6 +185,79 @@ public override void OnInspectorGUI() AssetDatabase.Refresh(); + // macOS Shader compiling + var shaders = Resources.FindObjectsOfTypeAll(); + + var filteredShaders = new List(); + + foreach (var shader in shaders) + { + // probably don't need to check for null here but just to be safe + if (shader == null || shader.name == "Standard") continue; + + if (BaseGameShaderNames.Contains(shader.name) || TrombLoaderShaderNames.Contains(shader.name)) continue; + + if (filteredShaders.Contains(shader)) continue; + + if (shader.hideFlags.HasFlag(HideFlags.DontSave) || shader.hideFlags.HasFlag(HideFlags.HideAndDontSave)) continue; + + Debug.Log($"Found shader {shader.name} to build for macOS"); + filteredShaders.Add(shader); + } + + if (filteredShaders.Any()) + { + activeBuildTarget = BuildTarget.StandaloneOSX; + EditorUserBuildSettings.SwitchActiveBuildTarget(selectedBuildTargetGroup, activeBuildTarget); + + GameObject shaderParent = new GameObject("_Shaders"); + if (!AssetDatabase.IsValidFolder("Assets/SerializedMaterials")) + { + AssetDatabase.CreateFolder("Assets", "SerializedMaterials"); + } + for (int i = 0; i < filteredShaders.Count; i++) + { + var shader = filteredShaders[i]; + + var mat = new Material(shader); + + AssetDatabase.CreateAsset(mat, "Assets/SerializedMaterials/" + i + ".mat"); + + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + + cube.name = i.ToString(); + cube.transform.SetParent(shaderParent.transform); + cube.GetComponent().sharedMaterial = mat; + } + + string shaderFileName = Path.GetFileName("ShaderCache_OSX.DONOTDELETE"); + string shaderPath = Path.Combine(folderPath, shaderFileName); + + PrefabUtility.SaveAsPrefabAsset(shaderParent, "Assets/_Shaders.prefab"); + AssetBundleBuild shaderBundleBuild = default; + shaderBundleBuild.assetBundleName = shaderFileName; + shaderBundleBuild.assetNames = new string[] {"Assets/_Shaders.prefab"}; + + BuildPipeline.BuildAssetBundles(Application.temporaryCachePath, + new AssetBundleBuild[] {shaderBundleBuild}, BuildAssetBundleOptions.ForceRebuildAssetBundle, + activeBuildTarget); + + AssetDatabase.DeleteAsset("Assets/_Shaders.prefab"); + + if (File.Exists(shaderPath)) File.Delete(shaderPath); + + File.Move(Path.Combine(Application.temporaryCachePath, shaderFileName), shaderPath); + + DestroyImmediate(shaderParent); + + AssetDatabase.DeleteAsset("Assets/SerializedMaterials"); + + AssetDatabase.Refresh(); + + activeBuildTarget = BuildTarget.StandaloneWindows64; + EditorUserBuildSettings.SwitchActiveBuildTarget(selectedBuildTargetGroup, activeBuildTarget); + } + EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); if (clonedTromboneBackground != null) DestroyImmediate(clonedTromboneBackground); diff --git a/Assets/Scripts/Assembly-CSharp-firstpass.dll b/Assets/Scripts/Assembly-CSharp-firstpass.dll index a1151530099acafb7a537ae8a38717b8c82c6192..9606a50467eb90a04b3a472a77bf1990463a1f22 100755 GIT binary patch delta 38 ucmZoz!ql*YX+j5ccIE$#-Ct`3R6V_23#1o0PpJ?-C_Jh2=H>}?1;PMA7!aZW delta 38 ucmZoz!ql*YX+j6{>0cEayT8^7RGnc?w(>sivwGI8@@8vx+szZ|3WNb)Q4xax diff --git a/Assets/Scripts/TrombLoader.dll b/Assets/Scripts/TrombLoader.dll index bd95e385cdbdc6a3775ad323630e29ddcb7d9147..8235f19deccfb73be766b1601c87b0e09a80e417 100644 GIT binary patch delta 4599 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 L8~c&iG{E`~(wlH4 delta 4397 zcmZvg3v?9K9mc;qJ9~F`_K}%|L=qm&3z86s0TB%kO~M;RgBSwxi~$vjJVZIc7&ie- zLGToq7PPI_R8Y|qiD!Kfpq40BsjriOiWHR`717dzT2V~(*zew~L3*4$^PB(ozxRG~ z@4W8J*8NV@Z5Er?PhR!TldmJOoIqxJP!s~iOvtX}v3cC4bDhr>uyt$zrk35+fQPrV z7ewx1?Q2!ZeBgf1mW&>uIv_;-_*~$6H^Ug@&J;P;i7S~(=UVLEE3yLf87aR~_c`&a zKpi9Q0OQ>cL}qG>+CP_xTn%_(4gq!y288R3xy&syHYQJ3jUBIa%wOM7TTbD4Ys%wa z7)!jO!kyzEPww#NiDB-W{&X=ce#XBkAf9sXiuN6!Qaha0joci-!oW-;ceM`Iz^GBC zU99owP#Mq2WiRE=YW{^aE8Kra`@21RWRHH;0kZA}hDCv|xn@nf{kBC*Z(gaopW7d3 z<~FN*8jdoyRXm}5(pYX!QSW!}=#ig#5mgn}30%{-)^g3`I?HY8F*tVA5{y+3Mh1pN zB<|CU`ujzauqLAN%lw8VaeLr!P~ua+qSWzv9q-hfr86Zue!!>d91O}NiP!v!Cw#l2 z5-_XXz;4>c{pMV)p`e0*k6f# zJaiV`(MM~rw&*~9FoG>SO%~EPZiy_B9~^)O^^S{JXCRL1<1vTM>NLNoZUPAYAZ)~a zu``iL-7<^kUMYjCji&IBq;kd{)U#?W)k65;(`6fUnIB0I={CkYO`dWdTt}Bh!b;gZ z3d$u~E*pw55E;Na+2m=W<5;a$1(h0;P}?n~rX zXLUTr{F0dh^DG;G7HlICQbzYDeMe^L_<6<>o9rhHiLt>S8BY(Jro=0u0J%dGCQUJuu&lexJ&=|bJ7xKJACz(C;8;*;O*f<1pHR{} z-Ryzf0lLgz8J=bKL}5ZL3(uz-)unVNlJSgI^*AUikc@A;%JlI`1~@mWJ?9pl)?oGPMOu=0jca@Ef`6QoYrF@(D>1_AHRo!ZZ z*$Xw@idP&SyFfK-wHC`btEQptg0f?YvbCrcYL*t*ZY#dThr2*6CnAB#R!nW+wQU2f zx;W@NAJ{aFBeK#Vz7SpJE?(TzXz? zUG%i56i)OTQE3daNRbw`X?Ky+DMES#JvA2@eL~WhX}p=_7;WNY^e7e?-v;{{0dbXg z61gCHoza0uWd-9M=3L_eaf!Tzd_S<1JQ-MJtTsLgt~E-;y66V-M$W1A#+sPrQhcSw z4qL^Y;q69<=YA&+=^ZzU;^0F@qfi|x64}lZ#xBtq+08nsFg+n;Xy$1SA^kXkR}DWt z#v9}*w3DatF8KwHlV78QJcpCy_lW(A8;CDRQ=BFJqLZ|Rvgj$4MK7T&`Uqu_E|f*K zP!_pDSqu`&p-?+qu3L@Lt%`N4i8^z&&XnoQ0v+F?<0azV7#lCwrnhU;YHfO#Hm%d9 z>vXr)>uzllKN>k$$uZ^dMJ?_tK#*@A1?Yh-WN$Q+S!f~i;qw;Y67(iVB8MD zlEP4Jh4Bauc{6mJq2pp5Kce}PCOoQUdKXO<7rWuCrdX?tGj5g2Q~36w-J3yv=`A54 zE6IqgC;Q1pvOu&O9~+0N|vwvj1@nC&)= zp5QI>NayOfxMGBe6c!ZngGRtRv|wmKVSLh+>B7CIxXSgE937hX-#N!2rj!{R(2ZQb z=U)Kd7k7`2(-U|NcfDcE{w2j27g@Q s+sEz{qA)&sd~a^tnG-JY7V;ydkbf#H50rKNWpVt Date: Mon, 20 Nov 2023 15:51:41 +0000 Subject: [PATCH 05/11] initial work on the mac shader bundle builder GUI --- Assets/Editor/BackgroundEditor.cs | 163 ++++++++++++++++++++---------- 1 file changed, 112 insertions(+), 51 deletions(-) diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index 2d32c86..769d04b 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -3,11 +3,116 @@ using System.Linq; using UnityEditor; using UnityEngine; +using UnityEngine.UIElements; using UnityEngine.Video; using TrombLoader.Data; +using UnityEditor.UIElements; +using System; namespace TrombLoader { + public class MacShaderPicker : EditorWindow + { + private Dictionary ShaderList = new Dictionary(); + private string FolderPath; + + Vector2 scrollPosition; + + public void Init(List shaders, string path) + { + ShaderList.Clear(); + foreach (var shader in shaders) + { + // TODO: store the state in a file or something and load from that + ShaderList[shader] = true; + } + FolderPath = path; + } + + public void OnGUI() + { + GUILayout.Label("Shaders to include:"); + + scrollPosition = GUILayout.BeginScrollView(scrollPosition); + + for (int i = 0; i < ShaderList.Count; i++) + { + var shader = ShaderList.ElementAt(i).Key; + var active = ShaderList.ElementAt(i).Value; + ShaderList[shader] = GUILayout.Toggle(active, shader.name); + } + + GUILayout.EndScrollView(); + + GUILayout.Box( + "To make sure your background appears correctly on macOS we need to build a bundle containing Mac-compatible shaders. " + + "To save on disk space, you can exclude shaders you know you aren't using in your scene. " + + "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." + ); + + if (GUILayout.Button("Build Them Shaders!")) + { + this.Close(); + BuildShaders(); + EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); + } + } + + void BuildShaders() + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneOSX); + + GameObject shaderParent = new GameObject("_Shaders"); + if (!AssetDatabase.IsValidFolder("Assets/SerializedMaterials")) + { + AssetDatabase.CreateFolder("Assets", "SerializedMaterials"); + } + for (int i = 0; i < ShaderList.Count; i++) + { + if (ShaderList.ElementAt(i).Value) + { + continue; + } + var shader = ShaderList.ElementAt(i).Key; + + var mat = new Material(shader); + + AssetDatabase.CreateAsset(mat, "Assets/SerializedMaterials/" + i + ".mat"); + + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + + cube.name = i.ToString(); + cube.transform.SetParent(shaderParent.transform); + cube.GetComponent().sharedMaterial = mat; + } + + string shaderFileName = Path.GetFileName("ShaderCache_OSX.DONOTDELETE"); + string shaderPath = Path.Combine(FolderPath, shaderFileName); + + PrefabUtility.SaveAsPrefabAsset(shaderParent, "Assets/_Shaders.prefab"); + AssetBundleBuild shaderBundleBuild = default; + shaderBundleBuild.assetBundleName = shaderFileName; + shaderBundleBuild.assetNames = new string[] {"Assets/_Shaders.prefab"}; + + BuildPipeline.BuildAssetBundles(Application.temporaryCachePath, + new AssetBundleBuild[] {shaderBundleBuild}, BuildAssetBundleOptions.ForceRebuildAssetBundle, + BuildTarget.StandaloneOSX); + + AssetDatabase.DeleteAsset("Assets/_Shaders.prefab"); + + if (File.Exists(shaderPath)) File.Delete(shaderPath); + + File.Move(Path.Combine(Application.temporaryCachePath, shaderFileName), shaderPath); + + DestroyImmediate(shaderParent); + + AssetDatabase.DeleteAsset("Assets/SerializedMaterials"); + + AssetDatabase.Refresh(); + + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); + } + } [CustomEditor(typeof(Camera))] public class BackgroundEditor : Editor { @@ -207,59 +312,15 @@ public override void OnInspectorGUI() if (filteredShaders.Any()) { - activeBuildTarget = BuildTarget.StandaloneOSX; - EditorUserBuildSettings.SwitchActiveBuildTarget(selectedBuildTargetGroup, activeBuildTarget); - - GameObject shaderParent = new GameObject("_Shaders"); - if (!AssetDatabase.IsValidFolder("Assets/SerializedMaterials")) - { - AssetDatabase.CreateFolder("Assets", "SerializedMaterials"); - } - for (int i = 0; i < filteredShaders.Count; i++) - { - var shader = filteredShaders[i]; - - var mat = new Material(shader); - - AssetDatabase.CreateAsset(mat, "Assets/SerializedMaterials/" + i + ".mat"); - - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - - cube.name = i.ToString(); - cube.transform.SetParent(shaderParent.transform); - cube.GetComponent().sharedMaterial = mat; - } - - string shaderFileName = Path.GetFileName("ShaderCache_OSX.DONOTDELETE"); - string shaderPath = Path.Combine(folderPath, shaderFileName); - - PrefabUtility.SaveAsPrefabAsset(shaderParent, "Assets/_Shaders.prefab"); - AssetBundleBuild shaderBundleBuild = default; - shaderBundleBuild.assetBundleName = shaderFileName; - shaderBundleBuild.assetNames = new string[] {"Assets/_Shaders.prefab"}; - - BuildPipeline.BuildAssetBundles(Application.temporaryCachePath, - new AssetBundleBuild[] {shaderBundleBuild}, BuildAssetBundleOptions.ForceRebuildAssetBundle, - activeBuildTarget); - - AssetDatabase.DeleteAsset("Assets/_Shaders.prefab"); - - if (File.Exists(shaderPath)) File.Delete(shaderPath); - - File.Move(Path.Combine(Application.temporaryCachePath, shaderFileName), shaderPath); - - DestroyImmediate(shaderParent); - - AssetDatabase.DeleteAsset("Assets/SerializedMaterials"); - - AssetDatabase.Refresh(); - - activeBuildTarget = BuildTarget.StandaloneWindows64; - EditorUserBuildSettings.SwitchActiveBuildTarget(selectedBuildTargetGroup, activeBuildTarget); + MacShaderPicker window = CreateInstance(); + window.titleContent = new GUIContent("macOS Shader Bundle Builder"); + window.Init(filteredShaders, folderPath); + window.ShowModalUtility(); + } else + { + EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); } - EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); - if (clonedTromboneBackground != null) DestroyImmediate(clonedTromboneBackground); GUIUtility.ExitGUI(); From 2b1220bae95b1cf912068227e012bddde1c507dd Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Mon, 20 Nov 2023 15:52:08 +0000 Subject: [PATCH 06/11] remove unused namespaces --- Assets/Editor/BackgroundEditor.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index 769d04b..a14ba24 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -3,11 +3,8 @@ using System.Linq; using UnityEditor; using UnityEngine; -using UnityEngine.UIElements; using UnityEngine.Video; using TrombLoader.Data; -using UnityEditor.UIElements; -using System; namespace TrombLoader { From 4117930722ddefd11e889290ea43b4862feb8564 Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Mon, 20 Nov 2023 17:05:39 +0000 Subject: [PATCH 07/11] build mac shaders first + logic for no shaders selected --- Assets/Editor/BackgroundEditor.cs | 91 ++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index a14ba24..805f064 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -12,6 +12,7 @@ public class MacShaderPicker : EditorWindow { private Dictionary ShaderList = new Dictionary(); private string FolderPath; + public bool HasBuilt = false; Vector2 scrollPosition; @@ -47,11 +48,27 @@ public void OnGUI() "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." ); - if (GUILayout.Button("Build Them Shaders!")) + var btnName = "Continue"; + + if (ShaderList.ContainsValue(true)) + { + btnName = "Build Them Shaders!"; + } else + { + btnName = "Continue Without Building Shaders"; + } + + if (GUILayout.Button(btnName)) { + // TODO: react when the window is closed by the user this.Close(); - BuildShaders(); - EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); + if (ShaderList.ContainsValue(true)) + { + BuildShaders(); + HasBuilt = true; + } else { + HasBuilt = false; + } } } @@ -212,6 +229,40 @@ public override void OnInspectorGUI() { if (!string.IsNullOrEmpty(path)) { + string fileName = Path.GetFileName(path); + string folderPath = Path.GetDirectoryName(path); + + // macOS Shader compiling + var shaders = Resources.FindObjectsOfTypeAll(); + + var filteredShaders = new List(); + + foreach (var shader in shaders) + { + // probably don't need to check for null here but just to be safe + if (shader == null || shader.name == "Standard") continue; + + if (BaseGameShaderNames.Contains(shader.name) || TrombLoaderShaderNames.Contains(shader.name)) continue; + + if (filteredShaders.Contains(shader)) continue; + + if (shader.hideFlags.HasFlag(HideFlags.DontSave) || shader.hideFlags.HasFlag(HideFlags.HideAndDontSave)) continue; + + Debug.Log($"Found shader {shader.name} to build for macOS"); + filteredShaders.Add(shader); + } + + var macShadersBuilt = true; + + if (filteredShaders.Any()) + { + MacShaderPicker window = CreateInstance(); + window.titleContent = new GUIContent("macOS Shader Bundle Builder"); + window.Init(filteredShaders, folderPath); + window.ShowModalUtility(); + macShadersBuilt = window.HasBuilt; + } + clonedTromboneBackground = Instantiate(tromboneBackground.gameObject); // serialize @@ -220,9 +271,6 @@ public override void OnInspectorGUI() manager.SerializeAllGenericEvents(); } - string fileName = Path.GetFileName(path); - string folderPath = Path.GetDirectoryName(path); - int serializedCount = 0; // serialize video clips because unity REALLY does not like making them work in assetbundles foreach (var videoPlayer in clonedTromboneBackground.gameObject.GetComponentsInChildren()) @@ -287,35 +335,12 @@ public override void OnInspectorGUI() AssetDatabase.Refresh(); - // macOS Shader compiling - var shaders = Resources.FindObjectsOfTypeAll(); - - var filteredShaders = new List(); - - foreach (var shader in shaders) - { - // probably don't need to check for null here but just to be safe - if (shader == null || shader.name == "Standard") continue; - - if (BaseGameShaderNames.Contains(shader.name) || TrombLoaderShaderNames.Contains(shader.name)) continue; - - if (filteredShaders.Contains(shader)) continue; - - if (shader.hideFlags.HasFlag(HideFlags.DontSave) || shader.hideFlags.HasFlag(HideFlags.HideAndDontSave)) continue; - - Debug.Log($"Found shader {shader.name} to build for macOS"); - filteredShaders.Add(shader); - } - - if (filteredShaders.Any()) - { - MacShaderPicker window = CreateInstance(); - window.titleContent = new GUIContent("macOS Shader Bundle Builder"); - window.Init(filteredShaders, folderPath); - window.ShowModalUtility(); - } else + if (macShadersBuilt) { EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); + } else + { + EditorUtility.DisplayDialog("Exportation Successful!", "No macOS shaders were built.", "OK"); } if (clonedTromboneBackground != null) DestroyImmediate(clonedTromboneBackground); From 5b2f6abd272e86212648c1a82803c95f1acb0bd0 Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Mon, 20 Nov 2023 19:31:06 +0000 Subject: [PATCH 08/11] save disabled shaders to an asset file --- Assets/Editor/BackgroundEditor.cs | 51 ++++++++++++++++++++++------ Assets/Editor/MacShaderPrefs.cs | 7 ++++ Assets/Editor/MacShaderPrefs.cs.meta | 11 ++++++ 3 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 Assets/Editor/MacShaderPrefs.cs create mode 100644 Assets/Editor/MacShaderPrefs.cs.meta diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index 805f064..10c44b8 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -6,23 +6,41 @@ using UnityEngine.Video; using TrombLoader.Data; -namespace TrombLoader +namespace TrombLoader { public class MacShaderPicker : EditorWindow { private Dictionary ShaderList = new Dictionary(); private string FolderPath; public bool HasBuilt = false; + public MacShaderPrefs shaderPrefs; Vector2 scrollPosition; public void Init(List shaders, string path) { ShaderList.Clear(); + shaderPrefs = AssetDatabase.LoadAssetAtPath("Assets/Resources/MacShaderPrefs.asset"); + if (shaderPrefs == null) + { + shaderPrefs = CreateInstance(); + if (!AssetDatabase.IsValidFolder("Assets/Resources")) + { + AssetDatabase.CreateFolder("Assets", "Resources"); + } + AssetDatabase.CreateAsset(shaderPrefs, "Assets/Resources/MacShaderPrefs.asset"); + AssetDatabase.SaveAssets(); + } foreach (var shader in shaders) { - // TODO: store the state in a file or something and load from that - ShaderList[shader] = true; + if (shaderPrefs.blocklist.Contains(shader.name)) + { + ShaderList[shader] = false; + } + else + { + ShaderList[shader] = true; + } } FolderPath = path; } @@ -48,27 +66,40 @@ public void OnGUI() "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." ); - var btnName = "Continue"; + string btnName; if (ShaderList.ContainsValue(true)) { btnName = "Build Them Shaders!"; - } else + } + else { btnName = "Continue Without Building Shaders"; } if (GUILayout.Button(btnName)) { - // TODO: react when the window is closed by the user - this.Close(); + shaderPrefs.blocklist = new List(); + foreach(var item in ShaderList) + { + if (!item.Value) + { + shaderPrefs.blocklist.Add(item.Key.name); + } + } + + AssetDatabase.SaveAssets(); + if (ShaderList.ContainsValue(true)) { BuildShaders(); HasBuilt = true; - } else { + } + else + { HasBuilt = false; } + Close(); } } @@ -259,7 +290,6 @@ public override void OnInspectorGUI() MacShaderPicker window = CreateInstance(); window.titleContent = new GUIContent("macOS Shader Bundle Builder"); window.Init(filteredShaders, folderPath); - window.ShowModalUtility(); macShadersBuilt = window.HasBuilt; } @@ -338,7 +368,8 @@ public override void OnInspectorGUI() if (macShadersBuilt) { EditorUtility.DisplayDialog("Exportation Successful!", "Exportation Successful!", "OK"); - } else + } + else { EditorUtility.DisplayDialog("Exportation Successful!", "No macOS shaders were built.", "OK"); } diff --git a/Assets/Editor/MacShaderPrefs.cs b/Assets/Editor/MacShaderPrefs.cs new file mode 100644 index 0000000..4e143a5 --- /dev/null +++ b/Assets/Editor/MacShaderPrefs.cs @@ -0,0 +1,7 @@ +using System.Collections.Generic; +using UnityEngine; + +public class MacShaderPrefs : ScriptableObject +{ + public List blocklist = new List(); +} \ No newline at end of file diff --git a/Assets/Editor/MacShaderPrefs.cs.meta b/Assets/Editor/MacShaderPrefs.cs.meta new file mode 100644 index 0000000..2423caa --- /dev/null +++ b/Assets/Editor/MacShaderPrefs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8e4d256660517427cb5d76470e5ba621 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 72265bae674a4abfc67f09cd0087fd3eb09c96d8 Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Tue, 21 Nov 2023 10:49:44 +0000 Subject: [PATCH 09/11] move shader builder to its own script --- Assets/Editor/BackgroundEditor.cs | 150 ------------------------ Assets/Editor/MacShaderBuilder.cs | 156 +++++++++++++++++++++++++ Assets/Editor/MacShaderBuilder.cs.meta | 11 ++ 3 files changed, 167 insertions(+), 150 deletions(-) create mode 100644 Assets/Editor/MacShaderBuilder.cs create mode 100644 Assets/Editor/MacShaderBuilder.cs.meta diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index 10c44b8..f68c4fb 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -8,156 +8,6 @@ namespace TrombLoader { - public class MacShaderPicker : EditorWindow - { - private Dictionary ShaderList = new Dictionary(); - private string FolderPath; - public bool HasBuilt = false; - public MacShaderPrefs shaderPrefs; - - Vector2 scrollPosition; - - public void Init(List shaders, string path) - { - ShaderList.Clear(); - shaderPrefs = AssetDatabase.LoadAssetAtPath("Assets/Resources/MacShaderPrefs.asset"); - if (shaderPrefs == null) - { - shaderPrefs = CreateInstance(); - if (!AssetDatabase.IsValidFolder("Assets/Resources")) - { - AssetDatabase.CreateFolder("Assets", "Resources"); - } - AssetDatabase.CreateAsset(shaderPrefs, "Assets/Resources/MacShaderPrefs.asset"); - AssetDatabase.SaveAssets(); - } - foreach (var shader in shaders) - { - if (shaderPrefs.blocklist.Contains(shader.name)) - { - ShaderList[shader] = false; - } - else - { - ShaderList[shader] = true; - } - } - FolderPath = path; - } - - public void OnGUI() - { - GUILayout.Label("Shaders to include:"); - - scrollPosition = GUILayout.BeginScrollView(scrollPosition); - - for (int i = 0; i < ShaderList.Count; i++) - { - var shader = ShaderList.ElementAt(i).Key; - var active = ShaderList.ElementAt(i).Value; - ShaderList[shader] = GUILayout.Toggle(active, shader.name); - } - - GUILayout.EndScrollView(); - - GUILayout.Box( - "To make sure your background appears correctly on macOS we need to build a bundle containing Mac-compatible shaders. " + - "To save on disk space, you can exclude shaders you know you aren't using in your scene. " + - "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." - ); - - string btnName; - - if (ShaderList.ContainsValue(true)) - { - btnName = "Build Them Shaders!"; - } - else - { - btnName = "Continue Without Building Shaders"; - } - - if (GUILayout.Button(btnName)) - { - shaderPrefs.blocklist = new List(); - foreach(var item in ShaderList) - { - if (!item.Value) - { - shaderPrefs.blocklist.Add(item.Key.name); - } - } - - AssetDatabase.SaveAssets(); - - if (ShaderList.ContainsValue(true)) - { - BuildShaders(); - HasBuilt = true; - } - else - { - HasBuilt = false; - } - Close(); - } - } - - void BuildShaders() - { - EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneOSX); - - GameObject shaderParent = new GameObject("_Shaders"); - if (!AssetDatabase.IsValidFolder("Assets/SerializedMaterials")) - { - AssetDatabase.CreateFolder("Assets", "SerializedMaterials"); - } - for (int i = 0; i < ShaderList.Count; i++) - { - if (ShaderList.ElementAt(i).Value) - { - continue; - } - var shader = ShaderList.ElementAt(i).Key; - - var mat = new Material(shader); - - AssetDatabase.CreateAsset(mat, "Assets/SerializedMaterials/" + i + ".mat"); - - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - - cube.name = i.ToString(); - cube.transform.SetParent(shaderParent.transform); - cube.GetComponent().sharedMaterial = mat; - } - - string shaderFileName = Path.GetFileName("ShaderCache_OSX.DONOTDELETE"); - string shaderPath = Path.Combine(FolderPath, shaderFileName); - - PrefabUtility.SaveAsPrefabAsset(shaderParent, "Assets/_Shaders.prefab"); - AssetBundleBuild shaderBundleBuild = default; - shaderBundleBuild.assetBundleName = shaderFileName; - shaderBundleBuild.assetNames = new string[] {"Assets/_Shaders.prefab"}; - - BuildPipeline.BuildAssetBundles(Application.temporaryCachePath, - new AssetBundleBuild[] {shaderBundleBuild}, BuildAssetBundleOptions.ForceRebuildAssetBundle, - BuildTarget.StandaloneOSX); - - AssetDatabase.DeleteAsset("Assets/_Shaders.prefab"); - - if (File.Exists(shaderPath)) File.Delete(shaderPath); - - File.Move(Path.Combine(Application.temporaryCachePath, shaderFileName), shaderPath); - - DestroyImmediate(shaderParent); - - AssetDatabase.DeleteAsset("Assets/SerializedMaterials"); - - AssetDatabase.Refresh(); - - EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); - } - } [CustomEditor(typeof(Camera))] public class BackgroundEditor : Editor { diff --git a/Assets/Editor/MacShaderBuilder.cs b/Assets/Editor/MacShaderBuilder.cs new file mode 100644 index 0000000..0e288c7 --- /dev/null +++ b/Assets/Editor/MacShaderBuilder.cs @@ -0,0 +1,156 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + + public class MacShaderPicker : EditorWindow +{ + private Dictionary ShaderList = new Dictionary(); + private string FolderPath; + public bool HasBuilt = false; + public MacShaderPrefs shaderPrefs; + + Vector2 scrollPosition; + + public void Init(List shaders, string path) + { + ShaderList.Clear(); + shaderPrefs = AssetDatabase.LoadAssetAtPath("Assets/Resources/MacShaderPrefs.asset"); + if (shaderPrefs == null) + { + shaderPrefs = CreateInstance(); + if (!AssetDatabase.IsValidFolder("Assets/Resources")) + { + AssetDatabase.CreateFolder("Assets", "Resources"); + } + AssetDatabase.CreateAsset(shaderPrefs, "Assets/Resources/MacShaderPrefs.asset"); + AssetDatabase.SaveAssets(); + } + foreach (var shader in shaders) + { + if (shaderPrefs.blocklist.Contains(shader.name)) + { + ShaderList[shader] = false; + } + else + { + ShaderList[shader] = true; + } + } + FolderPath = path; + } + + public void OnGUI() + { + GUILayout.Label("Shaders to include:"); + + scrollPosition = GUILayout.BeginScrollView(scrollPosition); + + for (int i = 0; i < ShaderList.Count; i++) + { + var shader = ShaderList.ElementAt(i).Key; + var active = ShaderList.ElementAt(i).Value; + ShaderList[shader] = GUILayout.Toggle(active, shader.name); + } + + GUILayout.EndScrollView(); + + GUILayout.Box( + "To make sure your background appears correctly on macOS we need to build a bundle containing Mac-compatible shaders. " + + "To save on disk space, you can exclude shaders you know you aren't using in your scene. " + + "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." + ); + + string btnName; + + if (ShaderList.ContainsValue(true)) + { + btnName = "Build Them Shaders!"; + } + else + { + btnName = "Continue Without Building Shaders"; + } + + if (GUILayout.Button(btnName)) + { + shaderPrefs.blocklist = new List(); + foreach(var item in ShaderList) + { + if (!item.Value) + { + shaderPrefs.blocklist.Add(item.Key.name); + } + } + + AssetDatabase.SaveAssets(); + + if (ShaderList.ContainsValue(true)) + { + BuildShaders(); + HasBuilt = true; + } + else + { + HasBuilt = false; + } + Close(); + } + } + + void BuildShaders() + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneOSX); + + GameObject shaderParent = new GameObject("_Shaders"); + if (!AssetDatabase.IsValidFolder("Assets/SerializedMaterials")) + { + AssetDatabase.CreateFolder("Assets", "SerializedMaterials"); + } + for (int i = 0; i < ShaderList.Count; i++) + { + if (ShaderList.ElementAt(i).Value) + { + continue; + } + var shader = ShaderList.ElementAt(i).Key; + + var mat = new Material(shader); + + AssetDatabase.CreateAsset(mat, "Assets/SerializedMaterials/" + i + ".mat"); + + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + + cube.name = i.ToString(); + cube.transform.SetParent(shaderParent.transform); + cube.GetComponent().sharedMaterial = mat; + } + + string shaderFileName = Path.GetFileName("ShaderCache_OSX.DONOTDELETE"); + string shaderPath = Path.Combine(FolderPath, shaderFileName); + + PrefabUtility.SaveAsPrefabAsset(shaderParent, "Assets/_Shaders.prefab"); + AssetBundleBuild shaderBundleBuild = default; + shaderBundleBuild.assetBundleName = shaderFileName; + shaderBundleBuild.assetNames = new string[] {"Assets/_Shaders.prefab"}; + + BuildPipeline.BuildAssetBundles(Application.temporaryCachePath, + new AssetBundleBuild[] {shaderBundleBuild}, BuildAssetBundleOptions.ForceRebuildAssetBundle, + BuildTarget.StandaloneOSX); + + AssetDatabase.DeleteAsset("Assets/_Shaders.prefab"); + + if (File.Exists(shaderPath)) File.Delete(shaderPath); + + File.Move(Path.Combine(Application.temporaryCachePath, shaderFileName), shaderPath); + + DestroyImmediate(shaderParent); + + AssetDatabase.DeleteAsset("Assets/SerializedMaterials"); + + AssetDatabase.Refresh(); + + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows64); + } +} \ No newline at end of file diff --git a/Assets/Editor/MacShaderBuilder.cs.meta b/Assets/Editor/MacShaderBuilder.cs.meta new file mode 100644 index 0000000..b1c4fb7 --- /dev/null +++ b/Assets/Editor/MacShaderBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 813ff2e85135f411b88969cd692e4c5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 29a413e0d85ccd04cdd16cd10ce58fc52c4553bb Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Tue, 21 Nov 2023 13:41:16 +0000 Subject: [PATCH 10/11] highlight and select shaders found within the scene --- Assets/Editor/BackgroundEditor.cs | 7 ++-- Assets/Editor/MacShaderBuilder.cs | 59 +++++++++++++++++++++++++++---- Assets/Editor/MacShaderPrefs.cs | 1 + Packages/manifest.json | 2 ++ Packages/packages-lock.json | 35 ++++++++++++++++++ 5 files changed, 95 insertions(+), 9 deletions(-) diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index f68c4fb..08f7d34 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -133,18 +133,19 @@ public override void OnInspectorGUI() filteredShaders.Add(shader); } + clonedTromboneBackground = Instantiate(tromboneBackground.gameObject); + var macShadersBuilt = true; if (filteredShaders.Any()) { MacShaderPicker window = CreateInstance(); window.titleContent = new GUIContent("macOS Shader Bundle Builder"); - window.Init(filteredShaders, folderPath); + window.Init(filteredShaders, folderPath, clonedTromboneBackground); + window.ShowModalUtility(); macShadersBuilt = window.HasBuilt; } - clonedTromboneBackground = Instantiate(tromboneBackground.gameObject); - // serialize foreach (var manager in clonedTromboneBackground.gameObject.GetComponentsInChildren()) { diff --git a/Assets/Editor/MacShaderBuilder.cs b/Assets/Editor/MacShaderBuilder.cs index 0e288c7..39d64ca 100644 --- a/Assets/Editor/MacShaderBuilder.cs +++ b/Assets/Editor/MacShaderBuilder.cs @@ -3,7 +3,9 @@ using System.Linq; using UnityEditor; using UnityEngine; - +using UnityEngine.UI; +using TMPro; + public class MacShaderPicker : EditorWindow { private Dictionary ShaderList = new Dictionary(); @@ -12,8 +14,9 @@ public class MacShaderPicker : EditorWindow public MacShaderPrefs shaderPrefs; Vector2 scrollPosition; + List SceneShaders = new List(); - public void Init(List shaders, string path) + public void Init(List shaders, string path, GameObject background) { ShaderList.Clear(); shaderPrefs = AssetDatabase.LoadAssetAtPath("Assets/Resources/MacShaderPrefs.asset"); @@ -27,16 +30,26 @@ public void Init(List shaders, string path) AssetDatabase.CreateAsset(shaderPrefs, "Assets/Resources/MacShaderPrefs.asset"); AssetDatabase.SaveAssets(); } + + CheckScene(background); + foreach (var shader in shaders) { if (shaderPrefs.blocklist.Contains(shader.name)) { + Debug.Log($"Shader {shader.name} is blocked"); ShaderList[shader] = false; } - else + else if (shaderPrefs.allowlist.Contains(shader.name) || SceneShaders.Contains(shader)) { + Debug.Log($"Shader {shader.name} is allowed"); ShaderList[shader] = true; } + else + { + Debug.Log($"Default behaviour for {shader.name}"); + ShaderList[shader] = false; + } } FolderPath = path; } @@ -47,11 +60,22 @@ public void OnGUI() scrollPosition = GUILayout.BeginScrollView(scrollPosition); + var style = GUI.skin.GetStyle("Toggle"); + for (int i = 0; i < ShaderList.Count; i++) { var shader = ShaderList.ElementAt(i).Key; var active = ShaderList.ElementAt(i).Value; - ShaderList[shader] = GUILayout.Toggle(active, shader.name); + if (SceneShaders.Contains(shader)) + { + style.fontStyle = FontStyle.Bold; + } + else + { + style.fontStyle = FontStyle.Normal; + + } + ShaderList[shader] = GUILayout.Toggle(active, shader.name, style); } GUILayout.EndScrollView(); @@ -59,7 +83,9 @@ public void OnGUI() GUILayout.Box( "To make sure your background appears correctly on macOS we need to build a bundle containing Mac-compatible shaders. " + "To save on disk space, you can exclude shaders you know you aren't using in your scene. " + - "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." + "If you're not sure what to exclude, you can just leave everything selected at the expense of a slightly larger shader bundle." + + "\n\nShaders that were found within the scene in its current state are highlighted in bold and are selected by default, " + + "but this may not include all of the shaders that are used in your project." ); string btnName; @@ -78,7 +104,11 @@ public void OnGUI() shaderPrefs.blocklist = new List(); foreach(var item in ShaderList) { - if (!item.Value) + if (item.Value) + { + shaderPrefs.allowlist.Add(item.Key.name); + } + else { shaderPrefs.blocklist.Add(item.Key.name); } @@ -99,6 +129,23 @@ public void OnGUI() } } + void CheckScene(GameObject background) + { + SceneShaders.Clear(); + + var materials = new[] + { + background.GetComponentsInChildren(true).SelectMany(renderer => renderer.sharedMaterials), + background.GetComponentsInChildren(true).Select(textMesh => textMesh.fontSharedMaterial), + background.GetComponentsInChildren(true).Select(graphics => graphics.material) + }.SelectMany(x => x); + + foreach (var material in materials) + { + SceneShaders.Add(material.shader); + } + } + void BuildShaders() { EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, BuildTarget.StandaloneOSX); diff --git a/Assets/Editor/MacShaderPrefs.cs b/Assets/Editor/MacShaderPrefs.cs index 4e143a5..29829e0 100644 --- a/Assets/Editor/MacShaderPrefs.cs +++ b/Assets/Editor/MacShaderPrefs.cs @@ -4,4 +4,5 @@ public class MacShaderPrefs : ScriptableObject { public List blocklist = new List(); + public List allowlist = new List(); } \ No newline at end of file diff --git a/Packages/manifest.json b/Packages/manifest.json index 33cffa0..c760f4f 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -5,7 +5,9 @@ "com.unity.ide.visualstudio": "2.0.22", "com.unity.nuget.newtonsoft-json": "3.0.2", "com.unity.test-framework": "1.1.31", + "com.unity.textmeshpro": "2.1.6", "com.unity.timeline": "1.2.18", + "com.unity.toolchain.macos-x86_64-linux-x86_64": "2.0.6", "com.unity.ugui": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index dc9336d..fa5b4dd 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -39,6 +39,22 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.sysroot": { + "version": "2.0.7", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.sysroot.linux-x86_64": { + "version": "2.0.6", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.sysroot": "2.0.7" + }, + "url": "https://packages.unity.com" + }, "com.unity.test-framework": { "version": "1.1.31", "depth": 0, @@ -50,6 +66,15 @@ }, "url": "https://packages.unity.com" }, + "com.unity.textmeshpro": { + "version": "2.1.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.timeline": { "version": "1.2.18", "depth": 0, @@ -62,6 +87,16 @@ }, "url": "https://packages.unity.com" }, + "com.unity.toolchain.macos-x86_64-linux-x86_64": { + "version": "2.0.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.sysroot": "2.0.7", + "com.unity.sysroot.linux-x86_64": "2.0.6" + }, + "url": "https://packages.unity.com" + }, "com.unity.ugui": { "version": "1.0.0", "depth": 0, From f6039b3a0e4ed87187e870dc601000ec02239938 Mon Sep 17 00:00:00 2001 From: DerpyChap Date: Tue, 21 Nov 2023 13:48:23 +0000 Subject: [PATCH 11/11] exclude hidden shaders from the shader bundle --- Assets/Editor/BackgroundEditor.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Assets/Editor/BackgroundEditor.cs b/Assets/Editor/BackgroundEditor.cs index 08f7d34..53026c9 100644 --- a/Assets/Editor/BackgroundEditor.cs +++ b/Assets/Editor/BackgroundEditor.cs @@ -123,6 +123,10 @@ public override void OnInspectorGUI() // probably don't need to check for null here but just to be safe if (shader == null || shader.name == "Standard") continue; + // as far as i'm aware Unity doesn't list hidden shaders in the editor UI + // so hopefully excluding them won't break anything + if (shader.name.StartsWith("Hidden/")) continue; + if (BaseGameShaderNames.Contains(shader.name) || TrombLoaderShaderNames.Contains(shader.name)) continue; if (filteredShaders.Contains(shader)) continue;