Make work with astra
This commit is contained in:
parent
21859bcfb3
commit
c8ee5045e2
810 changed files with 6338 additions and 4613 deletions
181
BUILDING.md
181
BUILDING.md
|
|
@ -1,72 +1,109 @@
|
||||||
# Linux build
|
# Linux build and launch
|
||||||
|
|
||||||
The project targets **Unity 2018.1.6f1**. Keep this version for now: the
|
The simulation builds and runs on Debian 13 x86_64 with its original
|
||||||
simulation uses the bundled UNet networking API and the legacy .NET runtime.
|
**Unity 2018.1.6f1** editor. UNet, the legacy .NET runtime, the scene, and the
|
||||||
No engine migration has been made.
|
traffic algorithms are retained. The source recovery is described in
|
||||||
|
[Recovery/README.md](Recovery/README.md).
|
||||||
|
|
||||||
## Toolchain
|
## Run over SSH
|
||||||
|
|
||||||
The following tools were installed and launched on this Debian 13 x86_64 host:
|
On the server:
|
||||||
|
|
||||||
- Unity Editor: `/opt/unity/2018.1.6f1/Editor/Unity`, including Linux player support.
|
```sh
|
||||||
- Blender 2.79b: `/opt/blender-2.79b-linux-glibc219-x86_64/blender`, also available
|
./run-linux.sh --vnc
|
||||||
as `blender` on PATH. The project's Blender models use the 2.79 file format.
|
```
|
||||||
- GTK 2, libsoup 2.4, GLU, and GConf 2 compatibility libraries. GConf was installed
|
|
||||||
from Debian's `libgconf-2-4_3.2.6-8_amd64.deb` and
|
|
||||||
`gconf2-common_3.2.6-8_all.deb`; Debian 13 no longer ships those packages.
|
|
||||||
- Xvfb and xauth for running the old editor without a desktop display.
|
|
||||||
|
|
||||||
Downloads: [Unity 2018.1.6f1](https://unity.com/releases/editor/whats-new/2018.1.6f1),
|
On your local computer, open a second SSH connection with a tunnel:
|
||||||
[Blender 2.79b](https://download.blender.org/release/Blender2.79/),
|
|
||||||
[Debian GConf packages](https://deb.debian.org/debian/pool/main/g/gconf/).
|
|
||||||
|
|
||||||
## Build command
|
```sh
|
||||||
|
ssh -L 5901:127.0.0.1:5901 your-server
|
||||||
|
```
|
||||||
|
|
||||||
Once Unity is activated and the damaged source assets below are restored:
|
Connect a VNC viewer to `127.0.0.1:5901`. The VNC service listens only on
|
||||||
|
localhost; access it through the SSH tunnel. The launcher starts a virtual
|
||||||
|
1280×800 display, both Python services, the simulation server, and its graphical
|
||||||
|
client. It requires `xvfb`, `xauth`, and `x11vnc`. Close the client or press
|
||||||
|
Ctrl-C in the launcher terminal to stop all its processes.
|
||||||
|
|
||||||
|
Other modes:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./run-linux.sh --server # Python services and headless simulation server
|
||||||
|
./run-linux.sh --demo # Server plus graphical client on the current desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
Python 3 and Bash are required. The launcher uses local HTTP ports 8080/8081 and
|
||||||
|
UNet port 7777; it refuses to start if an existing service occupies those ports.
|
||||||
|
Traffic lights start in the original `off` state (uncontrolled intersections).
|
||||||
|
The simulation does not automatically cycle them; the original HTTP API can
|
||||||
|
control them. Logs are written under `Builds/linux/`.
|
||||||
|
|
||||||
|
A separate graphical Linux client can connect to an already running server:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
Builds/linux/Simulation.x86_64 --connect SERVER_ADDRESS \
|
||||||
|
-screen-width 1280 -screen-height 800 -screen-fullscreen 0 -force-glcore
|
||||||
|
```
|
||||||
|
|
||||||
|
Without `--connect`, the player opens the original connection menu. `--server`
|
||||||
|
starts the server automatically; `--traffic-url` and `--event-url` can select
|
||||||
|
other HTTP services. Keep server and client in separate processes, as the
|
||||||
|
original simulation uses delayed client interpolation.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./build-linux.sh
|
./build-linux.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
For an editor installed elsewhere:
|
Output: `Builds/linux/Simulation.x86_64` and `Builds/linux/Simulation_Data/`.
|
||||||
|
Distribute both together. The build log is `Builds/linux/build.log`.
|
||||||
|
The script uses Xvfb when no display is available and places temporary import
|
||||||
|
files in `Builds/linux/tmp` by default to avoid filling a small `/tmp` tmpfs.
|
||||||
|
Override the editor or temporary directory when needed:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
UNITY_EDITOR=/path/to/2018.1.6f1/Editor/Unity ./build-linux.sh
|
UNITY_EDITOR=/path/to/2018.1.6f1/Editor/Unity TMPDIR=/large/tmp ./build-linux.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
The intended output is `Builds/linux/Simulation.x86_64`, with its accompanying
|
The build includes `Assets/Scenes/Main.unity`. The original build settings
|
||||||
data directory. The editor log is `Builds/linux/build.log`. The build uses
|
incorrectly named the nonexistent `SampleScene.unity`.
|
||||||
`Assets/Scenes/Main.unity`; the original settings incorrectly named the absent
|
|
||||||
`SampleScene.unity` despite already containing Main's GUID.
|
|
||||||
|
|
||||||
The existing standalone startup code selects the client menu. This build command
|
## Installed toolchain
|
||||||
preserves that behavior.
|
|
||||||
|
|
||||||
## Current blockers and verification
|
- `/opt/unity/2018.1.6f1/Editor/Unity`, including Linux player support.
|
||||||
|
- Blender 2.79b at `/opt/blender-2.79b-linux-glibc219-x86_64/blender`, also
|
||||||
|
available as `blender` on PATH for importing the original `.blend` models.
|
||||||
|
- GTK 2, libsoup 2.4, GLU, and GConf 2 compatibility libraries. GConf came from
|
||||||
|
Debian's `libgconf-2-4_3.2.6-8_amd64.deb` and
|
||||||
|
`gconf2-common_3.2.6-8_all.deb`, as Debian 13 no longer includes it.
|
||||||
|
- Xvfb, xauth, and x11vnc for SSH access. Mesa llvmpipe successfully rendered the
|
||||||
|
client without a physical GPU. This software rendering can be slower than a
|
||||||
|
desktop GPU. The machine has no audio device, so Unity reports audio fallback
|
||||||
|
messages and runs without sound.
|
||||||
|
|
||||||
**No Linux executable has been built.** The editor starts, but the attempted
|
Downloads: [Unity 2018.1.6f1](https://unity.com/releases/editor/whats-new/2018.1.6f1),
|
||||||
batch build exits with status 1 at license activation:
|
[Blender 2.79b](https://download.blender.org/release/Blender2.79/),
|
||||||
|
[Debian GConf packages](https://deb.debian.org/debian/pool/main/g/gconf/).
|
||||||
|
Recovery-only tools (ILSpy, UnityPy, OpenEXR, and .NET SDK) are not needed to build
|
||||||
|
or run the restored source.
|
||||||
|
|
||||||
```text
|
## Activation on this machine
|
||||||
Failed to activate/update license. Missing or bad username and password.
|
|
||||||
```
|
|
||||||
|
|
||||||
Unity Personal is free for eligible users, but still requires activation.
|
Unity Personal was activated using the signed-in account. The modern
|
||||||
For a desktop session, sign in to Unity Hub, then use Settings > Licenses >
|
entitlement alone was insufficient for this editor; Unity's official Licensing
|
||||||
Add license > Get a free personal license if it is not activated automatically.
|
Client successfully issued the compatible legacy license with `--activate-ulf`.
|
||||||
See [Unity's Hub license instructions](https://docs.unity.com/en-us/hub/manage-license).
|
The editor now reads `~/.local/share/unity3d/Unity/Unity_lic.ulf`.
|
||||||
|
No additional sign-in is needed for builds on this machine while that license
|
||||||
|
remains valid. Licenses and credentials are outside the repository and build.
|
||||||
|
|
||||||
For SSH access, Unity CLI 1.0.0-beta.9 is installed at
|
`./unity-ssh.sh` opens a private D-Bus session with a dedicated keyring in
|
||||||
`/root/.local/bin/unity`, along with GNOME Keyring and `libsecret-tools`.
|
`~/.local/share/unity-ssh/keyrings`. It preserves the desktop keyring. Use the
|
||||||
Its login command prints a URL that can be opened in a browser on another
|
same local keyring password when reopening it; this is separate from your Unity
|
||||||
device. Run `./unity-ssh.sh` as the same Linux user that will run the build.
|
account password. The helper checks that credentials can be stored before
|
||||||
It starts a private D-Bus session and a dedicated Unity keyring under
|
opening its shell. Run `./unity-ssh.sh --check` to check the keyring alone.
|
||||||
`~/.local/share/unity-ssh/keyrings`, leaving the desktop login keyring intact.
|
|
||||||
Choose a password on first use and use the same password when reopening the
|
For an account sign-in or modern Personal activation, run inside that shell:
|
||||||
helper. This password protects saved credentials locally; enter your Unity
|
|
||||||
account password only on Unity's sign-in page. The helper verifies that the
|
|
||||||
keyring can store and retrieve a test credential before opening a shell.
|
|
||||||
In that shell, run:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
unity auth login
|
unity auth login
|
||||||
|
|
@ -74,37 +111,27 @@ unity license activate --personal --accept-eula
|
||||||
unity license status
|
unity license status
|
||||||
```
|
```
|
||||||
|
|
||||||
The activation command accepts the Unity Personal license terms. Type `exit`
|
The login command prints a browser URL usable on another computer. The activation
|
||||||
when finished to close the shell and its keyring session.
|
command accepts the Personal terms. Those commands alone may still require the
|
||||||
|
legacy ULF compatibility step for Unity 2018. See the official
|
||||||
|
[Unity CLI documentation](https://docs.unity.com/en-us/unity-cli/use-unity-cli).
|
||||||
|
|
||||||
The command options and browser-assisted login startup have been checked here.
|
## Verification
|
||||||
Keyring tests with temporary credentials cover creation, reopening, incorrect
|
|
||||||
password rejection, inherited desktop sessions, and concurrent-session
|
|
||||||
rejection. The CLI's own credential-store check resolves the Secret Service
|
|
||||||
backend inside the helper. Run `./unity-ssh.sh --check` to check the keyring
|
|
||||||
without starting a Unity sign-in.
|
|
||||||
Sign-in, activation, and compatibility with the old editor still need to be
|
|
||||||
verified. See [Unity CLI instructions](https://docs.unity.com/en-us/unity-cli/use-unity-cli)
|
|
||||||
and [release notes](https://docs.unity.com/en-us/unity-cli/release-notes).
|
|
||||||
|
|
||||||
There is also existing file corruption, independent of activation. An audit
|
Verified on this host:
|
||||||
found **33 asset files whose contents are Unity metadata instead of their
|
|
||||||
expected source/model/image/material data**. Five of these are C# source files:
|
|
||||||
|
|
||||||
- `UnityProject/Assets/Scripts/CarLL.cs`
|
- Linux player and editor C# compilation using the genuine Unity 2018 libraries.
|
||||||
- `UnityProject/Assets/Scripts/misc/trafficLightColor.cs`
|
- A complete Linux standalone build, followed by server and graphical client
|
||||||
- `UnityProject/Assets/Standard Assets/CrossPlatformInput/Scripts/VirtualInput.cs`
|
startup through `run-linux.sh --vnc`.
|
||||||
- `UnityProject/Assets/!ext/PostProcessing/Editor/PostProcessingInspector.cs`
|
- Client connection, car spawning, completed trips, and traffic counts sent to
|
||||||
- `UnityProject/Assets/!ext/PostProcessing/Editor/Monitors/WaveformMonitor.cs`
|
the original Python backend.
|
||||||
|
- HTTP traffic-light changes, queuing at red lights, and resumed traffic.
|
||||||
|
- A local event displayed by the client's notification UI.
|
||||||
|
- Rendered town, pedestrians, cars, post-processing, and recovered lighting.
|
||||||
|
- No missing-script warnings or managed runtime exceptions during the successful
|
||||||
|
server/client test. Old vendor API deprecation and model import warnings remain.
|
||||||
|
- Launcher shutdown cleans up the services, players, VNC server, and virtual
|
||||||
|
display it started.
|
||||||
|
|
||||||
A separate compilation attempt with Unity's bundled Mono compiler and genuine
|
Local screenshots and test captures are under `Builds/linux/`; generated output
|
||||||
2018.1 assemblies fails with `CS8025: Parsing error` in `VirtualInput.cs`.
|
and the preserved old Library cache are ignored by Git.
|
||||||
The full asset list is in the local `Builds/linux/source-audit.txt`; compiler
|
|
||||||
output is in `Builds/linux/script-check/compile.log`.
|
|
||||||
|
|
||||||
Some metadata is damaged too: there are duplicated GUIDs, source code stored in
|
|
||||||
`.cs.meta` files, and empty directories with `.meta` names. The file at
|
|
||||||
`UnityProject/Scripts/CarLL.cs` is not a usable backup: it contains a
|
|
||||||
`TrafficController` class. A clean original checkout/archive is needed to
|
|
||||||
restore these files reliably. Existing assets and the old Library cache were
|
|
||||||
left intact.
|
|
||||||
|
|
|
||||||
74
Recovery/README.md
Normal file
74
Recovery/README.md
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
# Source recovery
|
||||||
|
|
||||||
|
The checkout contained asset contents replaced by `.meta` data, metadata
|
||||||
|
replaced by models/images/source code, duplicated GUIDs, and directories named
|
||||||
|
like missing files. The old Library cache was also damaged. Recoveries preserve
|
||||||
|
existing asset references wherever the original GUID could be recovered.
|
||||||
|
|
||||||
|
## Provenance
|
||||||
|
|
||||||
|
- `UnityProject/Assets/junctionAssets.zip`: restored the corrupted buildings and
|
||||||
|
fence models, seven materials, four prefabs, and several metadata files from
|
||||||
|
the bundled `junctionAssets - Copy` archive. Intact source files were retained.
|
||||||
|
- `UnityProject/Scripts/other.zip`: restored metadata for `canvasChooser`,
|
||||||
|
`serverRunningMenu`, and `destroyCar`.
|
||||||
|
- The bundled Windows server's `Simulation_Data/Managed/Assembly-CSharp.dll`:
|
||||||
|
decompiled `CarLL` and `trafficLightColor` with ILSpy 9.1.0.7988. Removed
|
||||||
|
generated UNet weaving methods and changed the woven `CallRpcDecodeBits` call
|
||||||
|
back to the source `RpcDecodeBits`, so Unity can weave the assembly again.
|
||||||
|
The assembly SHA-256 was
|
||||||
|
`9b23bd2b83c61ce07b579da9b594ddd535ed543435545b355f2c94d09d53a6e4`.
|
||||||
|
- [Unity PostProcessing v1](https://github.com/Unity-Technologies/PostProcessing/tree/933df236f509ed64ae5763ed57af33f2342cd1c2),
|
||||||
|
commit `933df236f509ed64ae5763ed57af33f2342cd1c2`: restored damaged editor
|
||||||
|
scripts, missing model editors, shaders, blue-noise textures, and metadata.
|
||||||
|
- Unity's original 2018.1.6 Standard Assets distribution, downloaded from the
|
||||||
|
[official release installer](https://download.unity3d.com/download_unity/a68afd074ea7/MacStandardAssetsInstaller/StandardAssets.pkg)
|
||||||
|
(MD5 `b891fafc108fec1232c5b1409c79bb9c`): restored `VirtualInput.cs`, the
|
||||||
|
damaged mobile control prefab/sprite, and associated metadata from the
|
||||||
|
CrossPlatformInput package.
|
||||||
|
- Original cached Unity import records: recovered lost GUIDs, model sub-asset
|
||||||
|
IDs/material mappings, and native asset metadata. Texture metadata uses the
|
||||||
|
corresponding intact neighboring import settings and the recovered GUID.
|
||||||
|
- Original cached textures: recovered `Lightmap-0_comp_dir.png` including its
|
||||||
|
directionality alpha channel, and `Lightmap-1_comp_light.exr` with HDR values.
|
||||||
|
UnityPy decoded the directional BC7 texture; [bcdec](https://github.com/iOrange/bcdec)
|
||||||
|
decoded BC6H into floating point for OpenEXR output. These are recoveries from
|
||||||
|
the imported, compressed cache, not byte-identical original source images.
|
||||||
|
The HDR decoding/orientation was checked against an intact source lightmap.
|
||||||
|
|
||||||
|
The old `UnityProject/Library` is preserved locally at
|
||||||
|
`Builds/recovery/Library-original`. Recovery intermediates and audit files are
|
||||||
|
under `Builds/recovery/`. Neither directory is required by the restored build.
|
||||||
|
|
||||||
|
## Small compatibility and startup changes
|
||||||
|
|
||||||
|
- Renamed `Assets/!ext` to `Assets/ThirdParty`, keeping its GUIDs. In the original
|
||||||
|
folder, the legacy Linux player build omitted the vendor C# classes although
|
||||||
|
editor compilation succeeded. The renamed folder produces the post-processing
|
||||||
|
and particle-effect classes in the player, eliminating missing-script warnings.
|
||||||
|
- Initialized traffic control and notification spawning in `OnStartServer`, so
|
||||||
|
starting networking after the scene loads works correctly.
|
||||||
|
- Initialized RPC receiver state before the first update can arrive and corrected
|
||||||
|
the client disconnect callback's base method.
|
||||||
|
- Added `--server`, `--connect`, `--traffic-url`, and `--event-url` startup options,
|
||||||
|
disabled the old resolution popup, and removed repetitive server log output.
|
||||||
|
- Added a launcher for the original Python backends plus separate UNet server
|
||||||
|
and client processes. The launcher binds the HTTP services to localhost; their
|
||||||
|
standalone default remains unchanged.
|
||||||
|
- Unity regenerated damaged PresetManager and UnityConnectSettings files, which
|
||||||
|
had contained unrelated PlayerSettings and TimeManager data respectively.
|
||||||
|
|
||||||
|
## Unrestored optional files
|
||||||
|
|
||||||
|
`unrestored/` preserves corrupt files outside Unity's import tree, under their
|
||||||
|
original paths. They are not required by Main:
|
||||||
|
|
||||||
|
- One unused motion-capture FBX animation.
|
||||||
|
- An unused `tweet.prefab`; the working scene uses `clientGame.prefab` instead.
|
||||||
|
- A reference photograph and three FBX exporter documentation/archive files.
|
||||||
|
- `FbxExportSettings.asset`, which incorrectly contained EditorSettings YAML
|
||||||
|
rather than the exporter's JSON settings and caused an import exception.
|
||||||
|
|
||||||
|
These files still need an intact source if their optional functionality is
|
||||||
|
wanted. The Windows-only FBX exporter tools were not ported. Existing backup
|
||||||
|
`.blend1` files are retained and ignored by Git.
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 479a3739c785a11469f3ee1f463994f7
|
||||||
|
timeCreated: 1507217626
|
||||||
|
licenseType: Store
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 479a3739c785a11469f3ee1f463994f7
|
||||||
|
timeCreated: 1507217626
|
||||||
|
licenseType: Store
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fa5e8bc9da963d949955cf16217de64f
|
||||||
|
timeCreated: 1500302146
|
||||||
|
licenseType: Store
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fa5e8bc9da963d949955cf16217de64f
|
||||||
|
timeCreated: 1500302146
|
||||||
|
licenseType: Store
|
||||||
|
TextScriptImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bd3a79df710fe68418617efeba366df4
|
||||||
|
timeCreated: 1510244436
|
||||||
|
licenseType: Store
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bd3a79df710fe68418617efeba366df4
|
||||||
|
timeCreated: 1510244436
|
||||||
|
licenseType: Store
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,84 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 28527290b099e5d4ca9a3c784dd0c784
|
||||||
|
TextureImporter:
|
||||||
|
fileIDToRecycleName: {}
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 5
|
||||||
|
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
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: -1
|
||||||
|
aniso: -1
|
||||||
|
mipBias: -1
|
||||||
|
wrapU: -1
|
||||||
|
wrapV: -1
|
||||||
|
wrapW: -1
|
||||||
|
nPOTScale: 1
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 0
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 2
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
spritePackingTag:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ebfb0e86bee8ff248ba3f2f493a0b917
|
||||||
|
TextureImporter:
|
||||||
|
fileIDToRecycleName:
|
||||||
|
2186277476908879412: ImportLogs
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 5
|
||||||
|
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
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: -1
|
||||||
|
aniso: -1
|
||||||
|
mipBias: -1
|
||||||
|
wrapU: -1
|
||||||
|
wrapV: -1
|
||||||
|
wrapW: -1
|
||||||
|
nPOTScale: 1
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 0
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 2
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
spritePackingTag:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bc42d458b2f94f841b4bcd4c99b47cf2
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 526ef531e646a9c47b143534bf877233
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 100100000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!159 &1
|
||||||
|
EditorSettings:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
serializedVersion: 7
|
||||||
|
m_ExternalVersionControlSupport: Visible Meta Files
|
||||||
|
m_SerializationMode: 2
|
||||||
|
m_LineEndingsForNewScripts: 2
|
||||||
|
m_DefaultBehaviorMode: 0
|
||||||
|
m_SpritePackerMode: 0
|
||||||
|
m_SpritePackerPaddingPower: 1
|
||||||
|
m_EtcTextureCompressorBehavior: 1
|
||||||
|
m_EtcTextureFastCompressor: 1
|
||||||
|
m_EtcTextureNormalCompressor: 2
|
||||||
|
m_EtcTextureBestCompressor: 4
|
||||||
|
m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd
|
||||||
|
m_ProjectGenerationRootNamespace:
|
||||||
|
m_UserGeneratedProjectSuffix:
|
||||||
|
m_CollabEditorSettings:
|
||||||
|
inProgressEnabled: 1
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
Shader "Hidden/Post FX/Monitors/Waveform Render"
|
|
||||||
{
|
|
||||||
SubShader
|
|
||||||
{
|
|
||||||
ZTest Always Cull Off ZWrite Off
|
|
||||||
Fog { Mode off }
|
|
||||||
|
|
||||||
CGINCLUDE
|
|
||||||
|
|
||||||
#pragma fragmentoption ARB_precision_hint_fastest
|
|
||||||
#pragma target 5.0
|
|
||||||
#include "UnityCG.cginc"
|
|
||||||
|
|
||||||
StructuredBuffer<uint4> _Waveform;
|
|
||||||
float2 _Size;
|
|
||||||
float4 _Channels;
|
|
||||||
float _Exposure;
|
|
||||||
|
|
||||||
float3 Tonemap(float3 x, float exposure)
|
|
||||||
{
|
|
||||||
const float a = 6.2;
|
|
||||||
const float b = 0.5;
|
|
||||||
const float c = 1.7;
|
|
||||||
const float d = 0.06;
|
|
||||||
x *= exposure;
|
|
||||||
x = max((0.0).xxx, x - (0.004).xxx);
|
|
||||||
x = (x * (a * x + b)) / (x * (a * x + c) + d);
|
|
||||||
return x * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 FragWaveform(v2f_img i) : SV_Target
|
|
||||||
{
|
|
||||||
const float3 red = float3(1.4, 0.03, 0.02);
|
|
||||||
const float3 green = float3(0.02, 1.1, 0.05);
|
|
||||||
const float3 blue = float3(0.0, 0.25, 1.5);
|
|
||||||
float3 color = float3(0.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
uint2 uvI = i.pos.xy;
|
|
||||||
float4 w = _Waveform[uvI.y + uvI.x * _Size.y]; // Waveform data is stored in columns instead of rows
|
|
||||||
|
|
||||||
color += red * w.r * _Channels.r;
|
|
||||||
color += green * w.g * _Channels.g;
|
|
||||||
color += blue * w.b * _Channels.b;
|
|
||||||
color += w.aaa * _Channels.a * 1.5;
|
|
||||||
color = Tonemap(color, _Exposure);
|
|
||||||
color += (0.1).xxx;
|
|
||||||
|
|
||||||
return float4(saturate(color), 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ENDCG
|
|
||||||
|
|
||||||
// (0)
|
|
||||||
Pass
|
|
||||||
{
|
|
||||||
CGPROGRAM
|
|
||||||
|
|
||||||
#pragma vertex vert_img
|
|
||||||
#pragma fragment FragWaveform
|
|
||||||
|
|
||||||
ENDCG
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FallBack off
|
|
||||||
}
|
|
||||||
|
|
@ -1,118 +0,0 @@
|
||||||
Shader "Hidden/Post FX/UI/Trackball"
|
|
||||||
{
|
|
||||||
CGINCLUDE
|
|
||||||
|
|
||||||
#include "UnityCG.cginc"
|
|
||||||
|
|
||||||
#define PI 3.14159265359
|
|
||||||
#define PI2 6.28318530718
|
|
||||||
|
|
||||||
float _Offset;
|
|
||||||
float _DisabledState;
|
|
||||||
float2 _Resolution; // x: size, y: size / 2
|
|
||||||
|
|
||||||
float3 HsvToRgb(float3 c)
|
|
||||||
{
|
|
||||||
float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
|
||||||
float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
|
|
||||||
return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 CreateWheel(v2f_img i, float crossColor, float offsetColor)
|
|
||||||
{
|
|
||||||
const float kHueOuterRadius = 0.45;
|
|
||||||
const float kHueInnerRadius = 0.38;
|
|
||||||
const float kLumOuterRadius = 0.495;
|
|
||||||
const float kLumInnerRadius = 0.48;
|
|
||||||
|
|
||||||
float4 color = (0.0).xxxx;
|
|
||||||
float2 uvc = i.uv - (0.5).xx;
|
|
||||||
float dist = sqrt(dot(uvc, uvc));
|
|
||||||
float delta = fwidth(dist);
|
|
||||||
float angle = atan2(uvc.x, uvc.y);
|
|
||||||
|
|
||||||
// Cross
|
|
||||||
{
|
|
||||||
float radius = (0.5 - kHueInnerRadius) * _Resolution.x + 1.0;
|
|
||||||
float2 pixel = (_Resolution.xx - 1.0) * i.uv + 1.0;
|
|
||||||
|
|
||||||
float vline = step(floor(fmod(pixel.x, _Resolution.y)), 0.0);
|
|
||||||
vline *= step(radius, pixel.y) * step(pixel.y, _Resolution.x - radius);
|
|
||||||
|
|
||||||
float hline = step(floor(fmod(pixel.y, _Resolution.y)), 0.0);
|
|
||||||
hline *= step(radius, pixel.x) * step(pixel.x, _Resolution.x - radius);
|
|
||||||
|
|
||||||
color += hline.xxxx * (1.0).xxxx;
|
|
||||||
color += vline.xxxx * (1.0).xxxx;
|
|
||||||
color = saturate(color);
|
|
||||||
color *= half4((crossColor).xxx, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hue
|
|
||||||
{
|
|
||||||
float alphaOut = smoothstep(kHueOuterRadius - delta, kHueOuterRadius + delta, dist);
|
|
||||||
float alphaIn = smoothstep(kHueInnerRadius - delta, kHueInnerRadius + delta, dist);
|
|
||||||
|
|
||||||
float hue = angle;
|
|
||||||
hue = 1.0 - ((hue > 0.0) ? hue : PI2 + hue) / PI2;
|
|
||||||
float4 c = float4(HsvToRgb(float3(hue, 1.0, 1.0)), 1.0);
|
|
||||||
color += lerp((0.0).xxxx, c, alphaIn - alphaOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Offset
|
|
||||||
{
|
|
||||||
float alphaOut = smoothstep(kLumOuterRadius - delta, kLumOuterRadius + delta, dist);
|
|
||||||
float alphaIn = smoothstep(kLumInnerRadius - delta, kLumInnerRadius + delta / 2, dist);
|
|
||||||
float4 c = float4((offsetColor).xxx, 1.0);
|
|
||||||
|
|
||||||
float a = PI * _Offset;
|
|
||||||
if (_Offset >= 0 && angle < a && angle > 0.0)
|
|
||||||
c = float4((1.0).xxx, 0.5);
|
|
||||||
else if (angle > a && angle < 0.0)
|
|
||||||
c = float4((1.0).xxx, 0.5);
|
|
||||||
|
|
||||||
color += lerp((0.0).xxxx, c, alphaIn - alphaOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
return color * _DisabledState;
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 FragTrackballDark(v2f_img i) : SV_Target
|
|
||||||
{
|
|
||||||
return CreateWheel(i, 1.0, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 FragTrackballLight(v2f_img i) : SV_Target
|
|
||||||
{
|
|
||||||
return CreateWheel(i, 0.0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
ENDCG
|
|
||||||
|
|
||||||
SubShader
|
|
||||||
{
|
|
||||||
Cull Off ZWrite Off ZTest Always
|
|
||||||
|
|
||||||
// (0) Dark skin
|
|
||||||
Pass
|
|
||||||
{
|
|
||||||
CGPROGRAM
|
|
||||||
|
|
||||||
#pragma vertex vert_img
|
|
||||||
#pragma fragment FragTrackballDark
|
|
||||||
|
|
||||||
ENDCG
|
|
||||||
}
|
|
||||||
|
|
||||||
// (1) Light skin
|
|
||||||
Pass
|
|
||||||
{
|
|
||||||
CGPROGRAM
|
|
||||||
|
|
||||||
#pragma vertex vert_img
|
|
||||||
#pragma fragment FragTrackballLight
|
|
||||||
|
|
||||||
ENDCG
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
using UnityEngine.PostProcessing;
|
|
||||||
|
|
||||||
namespace UnityEditor.PostProcessing
|
|
||||||
{
|
|
||||||
using Mode = BuiltinDebugViewsModel.Mode;
|
|
||||||
using Settings = BuiltinDebugViewsModel.Settings;
|
|
||||||
|
|
||||||
[PostProcessingModelEditor(typeof(BuiltinDebugViewsModel), alwaysEnabled: true)]
|
|
||||||
public class BuiltinDebugViewsEditor : PostProcessingModelEditor
|
|
||||||
{
|
|
||||||
struct DepthSettings
|
|
||||||
{
|
|
||||||
public SerializedProperty scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct MotionVectorsSettings
|
|
||||||
{
|
|
||||||
public SerializedProperty sourceOpacity;
|
|
||||||
public SerializedProperty motionImageOpacity;
|
|
||||||
public SerializedProperty motionImageAmplitude;
|
|
||||||
public SerializedProperty motionVectorsOpacity;
|
|
||||||
public SerializedProperty motionVectorsResolution;
|
|
||||||
public SerializedProperty motionVectorsAmplitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
SerializedProperty m_Mode;
|
|
||||||
DepthSettings m_Depth;
|
|
||||||
MotionVectorsSettings m_MotionVectors;
|
|
||||||
|
|
||||||
public override void OnEnable()
|
|
||||||
{
|
|
||||||
m_Mode = FindSetting((Settings x) => x.mode);
|
|
||||||
|
|
||||||
m_Depth = new DepthSettings
|
|
||||||
{
|
|
||||||
scale = FindSetting((Settings x) => x.depth.scale)
|
|
||||||
};
|
|
||||||
|
|
||||||
m_MotionVectors = new MotionVectorsSettings
|
|
||||||
{
|
|
||||||
sourceOpacity = FindSetting((Settings x) => x.motionVectors.sourceOpacity),
|
|
||||||
motionImageOpacity = FindSetting((Settings x) => x.motionVectors.motionImageOpacity),
|
|
||||||
motionImageAmplitude = FindSetting((Settings x) => x.motionVectors.motionImageAmplitude),
|
|
||||||
motionVectorsOpacity = FindSetting((Settings x) => x.motionVectors.motionVectorsOpacity),
|
|
||||||
motionVectorsResolution = FindSetting((Settings x) => x.motionVectors.motionVectorsResolution),
|
|
||||||
motionVectorsAmplitude = FindSetting((Settings x) => x.motionVectors.motionVectorsAmplitude),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnInspectorGUI()
|
|
||||||
{
|
|
||||||
EditorGUILayout.PropertyField(m_Mode);
|
|
||||||
|
|
||||||
int mode = m_Mode.intValue;
|
|
||||||
|
|
||||||
if (mode == (int)Mode.Depth)
|
|
||||||
{
|
|
||||||
EditorGUILayout.PropertyField(m_Depth.scale);
|
|
||||||
}
|
|
||||||
else if (mode == (int)Mode.MotionVectors)
|
|
||||||
{
|
|
||||||
EditorGUILayout.HelpBox("Switch to play mode to see motion vectors.", MessageType.Info);
|
|
||||||
|
|
||||||
EditorGUILayout.LabelField("Source Image", EditorStyles.boldLabel);
|
|
||||||
EditorGUI.indentLevel++;
|
|
||||||
EditorGUILayout.PropertyField(m_MotionVectors.sourceOpacity, EditorGUIHelper.GetContent("Opacity"));
|
|
||||||
EditorGUI.indentLevel--;
|
|
||||||
|
|
||||||
EditorGUILayout.Space();
|
|
||||||
|
|
||||||
EditorGUILayout.LabelField("Motion Vectors (overlay)", EditorStyles.boldLabel);
|
|
||||||
EditorGUI.indentLevel++;
|
|
||||||
|
|
||||||
if (m_MotionVectors.motionImageOpacity.floatValue > 0f)
|
|
||||||
EditorGUILayout.HelpBox("Please keep opacity to 0 if you're subject to motion sickness.", MessageType.Warning);
|
|
||||||
|
|
||||||
EditorGUILayout.PropertyField(m_MotionVectors.motionImageOpacity, EditorGUIHelper.GetContent("Opacity"));
|
|
||||||
EditorGUILayout.PropertyField(m_MotionVectors.motionImageAmplitude, EditorGUIHelper.GetContent("Amplitude"));
|
|
||||||
EditorGUI.indentLevel--;
|
|
||||||
|
|
||||||
EditorGUILayout.Space();
|
|
||||||
|
|
||||||
EditorGUILayout.LabelField("Motion Vectors (arrows)", EditorStyles.boldLabel);
|
|
||||||
EditorGUI.indentLevel++;
|
|
||||||
EditorGUILayout.PropertyField(m_MotionVectors.motionVectorsOpacity, EditorGUIHelper.GetContent("Opacity"));
|
|
||||||
EditorGUILayout.PropertyField(m_MotionVectors.motionVectorsResolution, EditorGUIHelper.GetContent("Resolution"));
|
|
||||||
EditorGUILayout.PropertyField(m_MotionVectors.motionVectorsAmplitude, EditorGUIHelper.GetContent("Amplitude"));
|
|
||||||
EditorGUI.indentLevel--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CheckActiveEffect(mode == (int)Mode.AmbientOcclusion && !profile.ambientOcclusion.enabled, "Ambient Occlusion");
|
|
||||||
CheckActiveEffect(mode == (int)Mode.FocusPlane && !profile.depthOfField.enabled, "Depth Of Field");
|
|
||||||
CheckActiveEffect(mode == (int)Mode.EyeAdaptation && !profile.eyeAdaptation.enabled, "Eye Adaptation");
|
|
||||||
CheckActiveEffect((mode == (int)Mode.LogLut || mode == (int)Mode.PreGradingLog) && !profile.colorGrading.enabled, "Color Grading");
|
|
||||||
CheckActiveEffect(mode == (int)Mode.UserLut && !profile.userLut.enabled, "User Lut");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CheckActiveEffect(bool expr, string name)
|
|
||||||
{
|
|
||||||
if (expr)
|
|
||||||
EditorGUILayout.HelpBox(string.Format("{0} isn't enabled, the debug view won't work.", name), MessageType.Warning);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace UnityEditor.PostProcessing
|
|
||||||
{
|
|
||||||
using UnityObject = Object;
|
|
||||||
|
|
||||||
static class EditorResources
|
|
||||||
{
|
|
||||||
static string m_EditorResourcesPath = string.Empty;
|
|
||||||
|
|
||||||
internal static string editorResourcesPath
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(m_EditorResourcesPath))
|
|
||||||
{
|
|
||||||
string path;
|
|
||||||
|
|
||||||
if (SearchForEditorResourcesPath(out path))
|
|
||||||
m_EditorResourcesPath = path;
|
|
||||||
else
|
|
||||||
Debug.LogError("Unable to locate editor resources. Make sure the PostProcessing package has been installed correctly.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_EditorResourcesPath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static T Load<T>(string name)
|
|
||||||
where T : UnityObject
|
|
||||||
{
|
|
||||||
return AssetDatabase.LoadAssetAtPath<T>(editorResourcesPath + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool SearchForEditorResourcesPath(out string path)
|
|
||||||
{
|
|
||||||
path = string.Empty;
|
|
||||||
|
|
||||||
string searchStr = "/PostProcessing/Editor Resources/";
|
|
||||||
string str = null;
|
|
||||||
|
|
||||||
foreach (var assetPath in AssetDatabase.GetAllAssetPaths())
|
|
||||||
{
|
|
||||||
if (assetPath.Contains(searchStr))
|
|
||||||
{
|
|
||||||
str = assetPath;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
path = str.Substring(0, str.LastIndexOf(searchStr) + searchStr.Length);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue